1. 객체와 테이블 매핑
@Entity
- @Entity가 붙은 클래스는 JPA가 관리
- JPA 사용해서 테이블과 매핑할 클래스는 @Entity 필수
- 기본 생성자 필수
- final 클래스, enum, interface, inner클래스에 사용 불가
- 저장할 필드에 final 사용 불가
@Table
- 엔티티와 매핑할 테이블을 지정
2. 데이터베이스 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 자동 생성
- 테이블 중심 -> 객체 중심
- 개발 장비에서만 사용 권장(개발, 테스트 장비도 create, update는 권장하지 않음)
- 개발 장비 : create 또는 update(alter 나감)
- 테스트 장비 : update 또는 validate
- 운영 장비 : validate 또는 none
3. 필드와 칼럼 매핑
- @Column 매핑
- 제약조건을 줄 수 있음
| 어노테이션 | 설명 |
| @Column | 칼럼 매핑 name : 필드와 매핑할 테이블의 칼럼 이름 updatable / insertable : 등록 변경 가능 여부(true/false) nullable : null 값의 허용 여부(true/false)<br />unique : 한 칼럼에 유니크 조건을 걸 때 사용, table 어노테이션에 사용을 권장(칼럼에 사용시 이름이 랜덤한 값으로 생겨서 디버그 어려움) columnDefinition : 데이터베이스의 칼럼정보를 직접 (ex : varchar(20)) length : 문자의 길이 제약 (string만) precision/scale : BigDemical 타입에서 사용, precision 은 소수점, scale은 소수의 자릿수 |
| @Temporal | 날짜 타입 매핑 LocalTime, LocalDateTime을 사용할 때 생략 가능 |
| @Enumerated | 타입 매핑 Ordinal / String : Ordinal은 순서이기 때문에 사용X, enum값이 추가 되면 index가 바뀌게 된다. |
| @Lob | BLOB, CLOB 매핑 (대용량) |
| @Transient | 특정필드를 칼럼에 매핑하지 않음(무시) |
4. 기본 키 매핑
- 직접할당 : @Id로 직접 할당
- 자동생성 : @GeneratedValue, 디폴트는 auto 아래의 3가지 중에 DB에 맞게 선택
- IDENTITY : 자동 증가
- JPA는 트랜잭션 커밋 시점에 insert를 함으로 ID값을 알 수가 없는 문제 발생, 영속성 컨텍스트는 ID 값을 알기 위하여 persist 시 insert 쿼리가 날라가게 된다.
- SEQUENCE : 데이터 오브젝트를 참조하여 사용 (ex: 오라클 방식)
- 미리 50개를 할당하여 사용하는 방식을 사용 table과 유사
- TABLE : 키 생성 전용 테이블을 만들어서 사용
- 모든 데이터베이스에 적용 가능, 성능은 떨어짐
- 미리 50개를 할당하여 사용함, 메모리에 50개를 가지고 있다.
- 영속성 컨텍스트에 넣기 위해서 ID 값을 알기 위해 시퀀스 테이블을 조회(ex : call next value for hibernate_sequence)
- IDENTITY : 자동 증가
5. 권장하는 식별자 전략
- null 아님, 유일, 불변
- 불변을 유지하기는 어렵다. 자연키(비즈니스 값 ex: 전화번호, 주민번호 등) 보다는 대체키를 사용
- 권장 : Long + 대체키 + 키 생성전략을 사용
**참고
인프런 - 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 기본편(김영한)