자바 ORM 표준 JPA 프로그래밍 4장
04 엔티티 매핑
@Entity
JPA를 사용해 테이블과 매핑할 클래스
- @Entity가 붙은 클래스는 JPA가 관리한다.
- 기본 생성자는 필수다.
- JPA가 엔티티 객체를 생성할 때 기본 생성자를 사용하기 때문
- final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
- 저장할 필드에 final을 사용하면 안된다.
@Table
엔티티와 매핑할 테이블을 지정
- 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
데이터베이스 스키마 자동 생성
JPA는 클래스의 매핑 정보와 데이터베이스 방언을 사용해 데이터베이스 스키마를 생성한다.
- 개발자가 테이블을 직접 생성하는 수고를 덜 수 있다.
- 스키마 자동 생성 기능이 만든 DDL은 운영 환경에서 사용할 만큼 완벽하지 않다.
- 개발 환경에서 사용하거나 매핑을 어떻게 해야 하는지 참고하는 정도만 사용하는 것이 좋다.
- spring.jpa.hibernate.ddl-auto 종류
- create: 기존 테이블을 삭제하고 새로 생성 (DROP + CREATE)
- create-drop: create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거 (DROP + CREATE + DROP)
- update: 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정
- validate: 데이터베이스 테이블과 엔티티 매핑정보를 비교해 차이가 있는 경우 경고를 남기고 애플리케이션을 실행하지 않는다. DDL을 수정하지 않는다.
- none: 자동 생성 기능을 사용하지 않는다.
기본 키(Primary Key) 매핑
- 직접 할당
- 기본 키를 애플리케이션에서 직접 할당한다.
- @Id만 사용한다.
- 자바 기본형이나 자바 Wrapper형만 적용 가능하다.
- em.persist()를 호출하기 전에 애플리케이션에서 직접 식별자 값을 할당해야 한다.
- 자동 생성
- 대리 키 사용 방식
- @Id와 @GeneratedValue를 사용한다.
- 종류
- IDENTITY
- 기본 키 생성을 데이터베이스에 위임한다.
- 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.
- 데이터베이스에 값을 저장하고 나서야 기본 키 값을 구할 수 있다.
- 영속 상태가 되기 위해서는 식별자가 필요하기 때문에, em.persist()를 호출하는 즉시 INSERT SQL이 데이터베이스에 전달된다.
- SEQUENCE
- 데이터베이스 시퀀스를 사용해 기본 키를 할당한다.
- 시퀀스를 지원하는 오라클, PostgreSQL, DB2, H2에서 사용할 수 있다.
- em.persist()를 호출할 때 먼저 데이터베이스 시퀀스를 사용해 식별자를 조회한다. 조회한 식별자를 엔티티에 할당한 후에 엔티티를 영속성 컨텍스트에 저장한다. 이후 flush가 일어나면 엔티티를 데이터베이스에 저장한다.
- 시퀀스에 접근하는 횟수를 줄이기 위해 @SequenceGenerator.allocationSize를 사용한다. 설정한 값만큼 한 번에 시퀀스 값을 증가시키고 나서 그만큼 메모리에 시퀀스 값을 할당한다.
- TABLE
- 키 생성 테이블을 사용한다.
- 모든 데이터베이스에 적용할 수 있다.
- 시퀀스 대신 테이블을 사용한다는 것만 제외하면 SEQUENCE 전략과 내부 동작방식이 같다.
- AUTO
- 선택한 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택한다.
- 데이터베이스를 변경해도 코드를 수정할 필요가 없다.
- IDENTITY