객체와 테이블 매핑 : @Entity, @Table
@Entity
- @Entity가 붙은 클래스는 JPA가 관리하고, Entity라 한다.
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity를 필수로 사용한다.
- 주의!
- 기본 생성자 필수 (파라미터가 없는 public 또는 protected 생성자)
- final 클래스, enum, interface, inner 클래스 사용 X
- DB에 저장할 필드에 final 사용 X
@Table
DB 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 자동 생성
- 테이블 중심 -> 객체 중심
- DB 방언을 활용해서 DB에 맞는 적절한 DDL 생성
- 이렇게 생성된 DDL은 개발 단계에서만 사용
- 이후 운영에서는 이 DDL을 사용하지 않거나, 적절히 다듬어서 사용
생성 방법 : hibernate.hbm2ddl.auto
- 속성
주의점!
- 운영 장비에는 절대 create, create-drop, update를 사용해선 안된다!!
- 개발 초기 단계 : create 또는 update
- 테스트 서버 : update 또는 validate
(여러 사람이 함께 테스트 혹은 개발할 때 create 사용시 기록이 모두 날아감)
- 스테이징과 운영 서버 : validate 또는 none
(되도록이면 사용하지 말자! alter를 잘못 입력될 경우 시스템 마비될수도...)
DDL 생성 기능
- 제약 조건 추가, 유니크 제약 조건 추가 등
ex) 회원 이름 : 필수, 10자 초과X
@Column(nullable = false, length = 10)
- DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고, JPA의 실행 로직에는 영향을 주지 않는다.
필드와 Column 매핑
매핑 어노테이션 정리
@Column
@Enumerated
- 자바 enum 타입을 매핑할 때 시용
- 속성
- EnumType.ORDINAL : enum 순서를 DB에 저장, 사용 X
(유지보수 어려움)
- EnumType.STRING : enum 이름을 DB에 저장
- Defalut : EnumType.ORDINAL
@Temporal
- 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용
- 최근에는 생략 가능하다.
@Lob
- 지정 가능한 속성이 없다.
- 매핑하는 필드의 타입이 문자면 CLOB, 나머지는 BLOB 매핑
@Transient
- 필드에 매핑하지 않을 경우 사용
- DB에 저장 X, 조회 X
- 주로 메모리상에서만 임시로 값을 보관하고 싶을 때 사용한다.
기본 키 매핑
기본 키 매핑 방법
- 직접 할당 : @Id 사용
- 자동 생성 : @GeneratedValue
@GeneratedValue 전략
- IDENTITY
- 기본 키 생성을 DB에 위임
- JPA는 Persistence Context에서 Entity를 관리하기 위해 기본 키가 필요하다. 하지만 IDENTITY는 DB에 들어가고 나서야 기본 키를 알 수 있기 때문에 예외적으로 em.commit() 시점이 아닌 em.persist() 시점에 DB에 INSERT SQL이 실해되고, DB에서 기본키를 조회하여 Persistence Context의 1차 캐시에 추가된다.
- SEQUENCE
- DB의 Sequence Object라는 유일한 값을 순서대로 생성하는 특별한 DB Object를 사용한다.
- 테이블마다 Sequence를 따로 관리하기 위해서 @SequenceGenerator로 매핑할 수 있다.
(이때 allocationSize는 Sequence가 한번 호출될 때 증가하는 수로 Default가 50이다. 이것을 통해 성능 최적화가 이루어 질 수 있다.)
- 성능 최적화
SEQUENCE 전략은 다음 키 값이 무엇인지 받기 위해 매번 DB서버와 통신을 해야한다. 이것을 allocationSize를 통해 성능 최적화를 할 수 있다. 만약 allocationSize가 50이라면 처음 DB서버와 통신할 때 현재 키 값은 1이고, 다음 키 값은 51로 설정하게 된다. 이후 50번 키까지는 DB서버와 통신 없이 1~50까지 순서대로 배정이 되고, 51번째 키를 받아야 하는 순간 다시 DB서버와 통신하여 100번까지의 키를 할당 받게 된다. 이러한 방법을 통해 DB서버와의 통신을 줄여 성능을 최적화한다.
- TABLE
- 키 생성 전용 테이블을 만들어 DB의 Sequence를 횽내내는 전략
- 장점 : 모든 DB에 적용 가능
- 단점 : 성능이 떨어진다.
- 테이블 생성
- TableGenerator
권장하는 식별자 전략
- 기본 키 제약 조건 : null X, 유일, 변하면 안된다.
- 미래까지 '변하지 않는다'를 만족하는 자연키를 찾기는 어렵다. 따라서 대체키를 사용하자.
- 권장 : Long형 + 대체키 + 키 생성전략 사용 (AUTO, Sequence Object 등)
[Reference]
Inflearn 김영한 님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard