https://un-lazy-midnight.tistory.com/90 JPA | 필드와 컬럼 매핑, 기본 키 매핑 필드 - 컬럼 매핑 아래와 같은 요구사항이 주어진다고 가정해보자. 1. 회원은 일반회원/관리자로 구분 2. 회원 가입일과 수정일이 존재 3. 회원을 설명하는 필드가 있고 이 필드는 길이 제한이 없 un-lazy-midnight.tistory.com 이번 글에서는 지난 글의 기본 매핑을 실전 예제를 통해 알아본다. 요구사항 분석 회원은 상품을 주문할 수 있음 주문 시 여러 종류의 상품을 선택할 수 있음 도메인 모델 분석 회원-주문 관계: 회원은 여러 번 주문할 수 있음(일대다) 주문-상품 관계: 주문할 때 여러 상품을 선택할 수 있음. 반대로 상품도 여러 번 주문될 수 있음. 주문상품이라는 ..
💻dev/🌱Java+Spring
필드 - 컬럼 매핑 아래와 같은 요구사항이 주어진다고 가정해보자. 1. 회원은 일반회원/관리자로 구분 2. 회원 가입일과 수정일이 존재 3. 회원을 설명하는 필드가 있고 이 필드는 길이 제한이 없음 예제) package hellojpa; import javax.persistence.*; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; @Entity public class Member { @Id private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) priva..
@Entity @Entity가 붙은 클래스는 JPA가 관리, 엔티티라고 한다. JPA를 사용해서 테이블과 매핑할 클래스라면 @Entity 필수! 주의사항 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) final 클래스, enum, interface, inner 클래스 사용 X 저장할 필드에 final 사용 X @Entity의 속성: name @Entity public class Member { ... } JPA에서 사용할 엔티티 이름을 지정한다. 기본값: 클래스 이름을 그대로 사용(예: Member) 같은 클래스 이름이 없으면 가급적 기본값을 사용한다. @Table @Table은 엔티티와 매핑할 테이블 지정 @Entity @Table(name="MEMBER") public..
간단히 말해서 플러시란? 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것 플러시 발생 - 변경 감지(Dirty Checking) - 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 - 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시하는 방법 1. em.flush() : 직접 호출 2. 트랜잭션 커밋 : 플러시 자동 호출 됨 3. SQL 쿼리 실행 : 플러시 자동 호출 됨 혹시 플러시를 하게 되면 1차 캐시가 다 지워지나요? 아닙니다. 1차 캐시는 다 유지가 됨! 오직 영속성 컨텍스트에 있는 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송함! 혹은 변경 감지에 의해 변경된 내용만 반영되는 과정이다. JPQL 쿼리 실행시 플러시가 자동으..
들어가기 전에 참고 자료 - JPA 구동 방식 영속성 컨텍스트 "엔티티를 영구 저장하는 환경" 이라는 뜻이다. 논리적인 개념이므로 눈에 보이지는 않는다. 일종의 공간이라고 생각하면 된다. 엔티티를 엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다. EntityManager.persist(entity); 엔티티의 생명주기 - 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 //객체를 생성한 상태(비영속) Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); - 영속(managed) : 영속성 컨텍스트에 관리되는 상태 //객체를 생성한 상태(비영속) Member member = ..
JPA Java Persistence API, 자바 진영의 ORM(Object Relational Mapping, 객체 관계 매핑) 기술 표준. JPA는 자바 표준 명세, 즉 인터페이스의 모음이다. 애플리케이션과 JDBC 사이에서 동작한다. JPA 구동 방식 JPA 동작 - 저장, 조회 JPA를 왜 사용해야 하는가? 생산성 - JPA와 CRUD(트랜잭션 안에서) 저장: jpa.persist(member) 조회: Member member = jpa.find(memberId) 수정: member.setName("변경할 이름") 삭제: jpa.remove(member) 유지보수 - 기존: 필드 변경시 모든 SQL 수정 - JPA: 필드만 추가하면 된다 패러다임의 불일치 해결 1. JPA와 상속 //저장시 개발..
인터페이스는 코드로만 이해하려고 하면 모호하고 이상하게 머리에 잘 안 들어온다. 그러나 포기는 금물. 어떤 개념이라도 예시를 들면 비교적 쉽게 이해가 된다. 이 글에서는 내가 남은 일생동안(?) 더이상 헷갈리지 않기 위해 기억에 남을 만한 예제를 만들어 작성해보려고한다. 1. 인터페이스는 왜 필요한가? 나는 뮤지컬 공연장의 티켓판매를 맡고 있다. 관객이 예매내역을 보여주면 나는 티켓을 준다. 인터파크 예매내역이면 인터파크 티켓을 준다. 예스24 예매내역이면 예스24 티켓을 준다. 이러한 케이스를 코드로 담아보자. 일단 Ticket, Interpark, Yes24, Manager 클래스를 작성하자. class Ticket { String name; void setName(String name) { this..
JUit 개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다. 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다. import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; ... @AfterEach public void afterEach() { repository.clearStore(); } @Test pub..