1. 객체와 테이블 매핑
@Entity
- @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다.
- JPA를 이용해 테이블과 매핑할 클래스는 @Entity가 필수
- 기본 생성자 필수
- final 클래스, enum, interface, inner 클래스를 사용 x
- 저장할 필드에 final 사용 x
2. 데이터베이스 스키마 자동 생성
- JPA는 애플리케이션 실행 시점에 DDL(데이터베이스 방언 활용)을 자동 생성하는 기능을 제공한다.
- 테이블 따로 생성할 필요 x
- 개발 장비에서만 사용하고, 운영서버에서는 사용하지 말 것
속성
hibernate.hbm2ddl.auto
- create : 기존 테이블 삭제 후 다시 생성
- create-drop : create와 같으니 종료 시점에 drop
- update : 변경 부분만 반영(운영 DB에는 사용하면 안됨) - 삭제는 반영 x
- validate : 엔티티와 테이블이 정상 매핑되었는지만 확인 - DB에 없는 컬럼 멤버가 존재하면 에러 발생
- none : 사용하지 않음
주의할 것
- 운영 장비에는 절대 create, create-drop, update를 사용하면 안된다.
- 개발 초기 단계에는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
DDL 생성 기능
- 제약조건 추가
@Column(nullable = false, length = 10, unique = true)
- 유니크 제약조건 추가
@Table(uniqueConstraints={@UniqueConstraint(name="NAME_AGE_UNIQUE", columnNames={"NAME", "AGE"})})
- JPA의 실행 로직에는 영향을 주지 않으며, DDL 자동 생성 시에만 사용된다.
3. 필드와 컬럼 매핑
@Column
컬럼 매핑
- name : 필드와 매핑할 테이블의 컬럼 이름 (기본값 : 객체의 필드 이름)
- insertable, updatable : 등록, 변경 가능 여부 (기본값 : TRUE)
- nullable(DDL) : null값의 허용 여부
- unique(DDL) : 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용
- columnDefinition(DDL) : 데이터베이스 컬럼 정보 직접 작성
- length(DDL) : 문자 길이 제약조건, String 타입에만 사용
- precision, scale(DDL) : 아주 큰 숫자나 정밀한 소수를 다뤄야 할 때 사용 (기본값 : precision=19, scale=2)
@Temporal
날짜 타입 매핑 (DATE/TIME/TIMESTAMP)
- 현재는 LocalDate, LocalDateTime 사용해서 생략 가능
@Enumerated
enum 타입 매핑
- Enum.ORDINAL : enum 순서를 데이터베이스에 저장(integer)
- EnumType.STRING : enum 이름을 데이터베이스에 저장
- enum 값 추가 시 같은 값, 다른 의미인 경우가 발생할 수 있으므로 ORDINAL을 사용하지 말 것
@Lob
BLOB, CLOB 매핑 (varchar를 넘어서는 큰 문자열)
- 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
@Transient
특정 필드를 컬럼에 매핑하지 않음 (매핑 무시)
4. 기본 키 매핑
직접 할당
@Id
자동 생성
@GeneratedValue, stategy를 아래에서 선택 가능
- AUTO(default) : 데이터베이스 방언에 맞춰 아래 중 자동 선택
- IDENTITY
- 기본 키 생성을 데이터베이스에 위임
- 데이터베이스에 insert되어야 PK를 알 수 있다. -> 1차 캐시의 key를 위해 persist를 호출하자 마자 insert 쿼리를 날림. (commit하는 시점이 아니어도)
- SEQUENCE
- sequence object를 통해 유일한 값을 순서대로 생성
테이블마다 다른 sequence를 사용하고 싶은 경우 @SequenceGenerator로 설정 가능
- em.persist()를 하려면 pk 필요 -> 시퀀스 호출
- TABLE
- 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
- @TableGenerator로 설정 가능
- allocationSize
- 미리 DB에 특정 개수를 올려놓고 나는 메모리에서 1씩 사용, 다 쓰면 다시 호출
- call next value 최초 호출로 시퀀스 값 세팅
- 동시성 문제 없음.
권장하는 식별자 전략
- 비즈니스에서 의미있는 자연키를 찾기 어렵기 때문에 대체키를 이용하자.
- Long형 + 대체키(시퀀스, UUID 등) + 키 생성전략