[자바 표준 ORM JPA]4장 엔티티 매핑
@Entity
- 속성
- name: 엔티티 이름을 지정한다. (기본으로 클래스 이름을 사용)
- 기본생성자는 필수다
@Table
- 속성
- name: 매핑할 테이블 이름(엔티티 이름을 기본으로 사용)
- catalog: catalog 기능이 있는 데이터베이스에서 catalog를 매칭한다.
- schema: schema 기능이 있는 데이터베이스에서 schema를 매핑한다.
- uniqueConstraints(DDL): DDL 생성시에 유니크 제약조건을 만든다.
hibernate, hbm2ddl.auto 속성
- create: 기존 테이블을 삭제하고 새로 생성한다. DROP + CREATE
- create-drop: create 속성에 추가로 애플리케이션을 종료할 떄 생성한 DDL을 제거한다. DROP + CREATE + DROP
- update: 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정한다.
- validate: 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. 이설정은 DDL을 수정하지 않는다.
- none: 자동 생성 기능을 사용하지 않으려면 hibernate.hbm2ddl.auto 속성 자체를 삭제하거나 유효하지 않은 옵션 값을 주면 된다.
- 개발 환경에 따른 추천전략
- 개발 초기 단계는 create 또는 update
- 초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI 서버는 create 또는 create-drop
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
DDL 생성 기능
@Colume(name = “NAME”, nullable = false, length = 10) not null 제약조건과 varchar(10)이 추가됨
기본 키 매핑
JPA가 제공하는 데이터베이스 기본 키 생성 전략
- 직접 할당: 기본 키를 애플리케이션에서 직접 할당한다.
- 자동 생성: 대리 키 사용 방식
- IDENTITY: 기본키 생성을 데이터베이스에 위임한다
- SEQUENCE: 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다
- TABLE: 키 생성 테이블을 사용한다
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@SequenceGenerator로 설정이 가능하다.
속성
- name: 식별자 생성기 이름(필수)
- sequenceName: 데이터베이스에 등록되어있는 시퀀스 이름
- initalValue: DDL 생성시에만 사용됨. 시퀀스 DDL을 생성할 때 청므 시작하는 수를 지정한다.
- allocationSize: 시퀀스 한번 호출에 증가하는 수(성능 최적화에 사용됨)
- catalog, schema: 데이터베이스 catalog,schema이름
권장하는 식별자 선택 전략
데이터베이스 기본 키는 다음 3가지 조건을 모두 만족해야 한다.
- null 값을 허용하지 않는다.
- 유일해야한다.
- 변해선 안된다.
테이블의 기본키를 선택하는 전략은 크게 2가지가 있다.
- 자연키(natural key)
- 비즈니스에 의미가 있는 키
- 예: 주민등록번호, 이메일, 전화번호
- 대리키(surrogate key)
- 비즈니스와 관련 없는 임의로 만들어진 키, 대체키로도 불린다.
- 예 오라클 시퀀스, auto_increment, 키생성 테이블 사용
- 자연키보다는 대리키를 권장한다.
비즈니스 환경은 언젠가 변한다
JPA는 모든 엔티티에 일관된 방식으로 대리키 사용을 권장한다.
- 자연키(natural key)
필드와 컬럼 매핑: 레퍼런스
@Column
- name: 필드와 매핑할 테이블의 컬럼 이름(객체의 필드 이름)
- nullable: null 값의 허용 여부를 설정한다
- unique: 한 컬럼에 간단한 유니크 제약조건을 걸 떄 사용한다.
- length: 문자 길이 제약조건, String 타입에만 사용한다.
- columnDefinition: 데이터베이스 컬럼 정보를 직접 줄 수 있다.
-
@Enumerated
자바의 enum 타이을 매핑할 떄 사용한다.
- EnumType.ORDINAL: enum 순서를 데이터베이스에 저장
- EnumType.STRING: enum 이름을 데이터베이스에 저장
@Temporal
- TemporalType.DATE: 날짜, 데이터베이스 data 타입과 매핑(예: 2022-10-11)
- TemporalType.TIME: 시간, 데이터베이스 time타입과 매핑(예: 11:11:11)
- TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스 timestamp 타입과 매핑(예: 2022-10-11 11:11:11)
Leave a comment