@Entity
테이블과 매핑할 클래스는 해당 어노테이션을 붙여 JPA가 관리하고 엔티티라 한다
리플렉션 API를 활용한 동적 프록시를 이용하므로
1.기본 생성자 필수(public or protected 접근제한자)
2. final 클래스, enum, interface, inner 클래스는 사용불가
데이터베이스 스키마 자동생성
자바 애플리케이션 실행 시점에 DDL을 이용한 스키마 자동생성
데이터베이스 방언을 활용해서 사용하는 데이터베이스에 맞는 적절한 DDL 생성
생성된 DDL은 개발 장비에서만 사용할 것
hibernate.hbm2ddl.auto
옵션 | 설명 |
create | 기존 테이블 삭제 후 다시 생성(DROP + CREATE) |
create-drop | CREATE와 같으나 종료 시점에 테이블 DROP |
update | 업데이트 된 스키마만 반영 |
validate | 엔티티와 테이블의 정상 매핑 확인 |
none | DDL 사용 안함 |
필드와 컬럼 매핑
hibernate.hbm2ddl.auto
@ | 설명 | 주의할 점 |
@Column | 컬럼 매핑 | unique 설정을 걸 수 있지만 필드의 명을 알아볼 수 없게되므로 되도록이면 @Table의 uniqueConstraints로 제약조건 해결 |
@Temporal | 날짜 타입 매핑 | 최근엔 LocalDate, LocalDateTime 사용시에는 생략 가능 |
@Enumerated | enum 타입 매핑 | EnumType.ORDINAL은 enum 순서를 데이터베이스에 저장하므로 변경시에 로직에 영향을 줄 수 있으므로 사용 지양 |
@Lob | BLOB, CLOB 매핑 | |
@Transient | 특정 필드를 컬럼에서 제외 |
기본 키 매핑
직접 할당
@Id만 사용, 개발자가 모든 기본키 관리
자동생성(@GeneratedValue)
전략 | 설명 | 주의할 점 |
IDENTITY | 데이터베이스에 기본 키 관리 위임 |
INSERT의 persists시에 쓰기지연 SQL에 저장이 아닌 바로 DB로 쿼리날려 ID를 가져옴 |
SEQUENCE | 데이터베이스 시퀀스 오브젝트 사용 | INSERT의 persists시 DB의 시퀀스 오브젝트에 접근해 ID를 가져온 후에 영속성 컨텍스트에 저장, 커밋 전에 쿼리는 날라가지 않음 |
TABLE | 키 생성용 테이블 사용, 모든 DB에서 사용 @TableGenerator 필요 | 기본키를 위한 테이블을 만드므로 성능이 떨어지고 락이 걸릴 수 있음 |
AUTO | 방언에 따라 자동지정, DEFUALT 전략 |
ID를 위한 DB 접근으로 인한 성능 하락 개선
자동생성에서 어떤 전략을 사용하든 쿼리전에 한번은 데이터베이스에 접근해 기본키를 가져와야하기에 불필요한 요청으로 인한 성능하락을 전략에 맞는 GENERATOR의 조합으로 해결
GENERATOR로 JPA가 DB로부터 정해진 ALLOCATION_SIZE만큼의 ID범위를 가져와서 사용
권장하는 식별자 전략
기본 키 제약 조건인 NOT NULL, UNIQUE과 불변성을 해결하는 자연키는 찾기 어렵기에 여러 데이터를 합친 대체키를 사용
Long형 + 대체키 + 키 생성전략
정리
엔티티의 필수요건, 기본생성자, 상속가능 클래스
JPA를 이용한 DDL은 개발단계에서만
기본키 전략들의 ID 관리 및 generator를 이용한 DB와 커넥션 줄이기
참고
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard