본문 바로가기
학습

[Java] JPA 강의 - 4 (엔티티 매핑)

by 공덕뉸나 2024. 1. 17.

객체와 테이블 매핑

@Entity

- JPA가 관리하는 엔티티

- 기본 생성자 필수

- 저장할 필드에 final 사용하면 안됨

- 속성 

: name -> JPA에서 사용할 엔티티 이름을 지정

 

@Table

속성

- name : 매핑할 테이블 이름

- catalog : 데이터베이스 catalog 매핑

- schema : 데이터베이스 스키마 매핑

- uniqueConstraints : DDL 생성 시 유니크 제약 조건 생성

 

데이터베이스 스키마 자동 생성

- DDL을 애플리케이션 실행 시점에 자동 생성 (ex. Insert into)

- 생성된 DDL은 개발 장비에서만 사용 (운영서버에서 사용X)

 

속성

- create : DROP + CREATE 기존 테이블 삭제 후 다시 생성

- create-drop : 종료 시점에 테이블 DROP

- update : 반영분만 반영 (alter table)

- validate : 정상적으로 매핑되었는지 확인

- none : 사용하지 않음

 

create, create-drop, update 절대 운영 서버에서 사용하지 말 것

 

필드와 컬럼 매핑

매핑 어노테이션 

@Column

- name : 필드와 매핑할 테이블 컬럼 이름

- insertable, updatable : 등록, 변경 가능 여부 (컬럼 수정 -> DB에 반영할 것인지)

- nullable : null 값 허용 여부

- unique : 유니크 제약 조건

- columnDefinition : 컬럼 정보 직접 주기

- length : 문자 길이 제약조건

- precision, scale : 옵션

 

@Enumerated

자바 enum 타입 매핑할 때 사용

- value : ORDINAL(enum 순서 저장), STRING(enum 이름 저장)

 

@Temporal

날짜 타입을 매핑할 때 사용

- value : DATE(날짜, 데이터베이스 date 타입), TIME(시간, 데이터베이스 time 타입), TIMESTAMP(날짜와 시간, 데이터베이스 timestamp 타입)

 

기본 키 매핑

기본 키 매핑 어노테이션

기본 키 매핑 방법 : 직접 할당 (@Id 사용) / 자동 생성

 

IDENTITY 전략 - 특징

- 기본 키 생성을 데이터베이스에 위임 (id에 값을 넣으면 안됨)

- JPA는 트랜잭션 커밋 시점에 INSERT SQL 실행

- AUTO_INCREMENT : INSERT SQL을 실행 한 이후에 ID값을 알 수 있음

(영속성 컨텍스트에서 관리되려면 PK 값이 있어야함)

- IDENTITY 전략은 persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자 조회

 

SEQUENCE 전략

- 버퍼링 가능 (모아서 commit 시점에 query 날림)

 

속성

- name : 식별자 생성기 이름

- sequenceName : DB에 등록되어 있는 시퀀스 이름

- initialValue : DDL 생성 시에만 사용됨

- allocationSize : 시퀀스 한 번 호출에 증가하는 수

initialValue, allocationSize는 성능 최적화에 이용

- catalog, schema

 

IDENTITY / SEQUENCE 방식 비교해 보면 좋을 듯

 

TABLE 전략

- 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략

- 모든 데이터베이스에 적용 가능하지만 성능이 좋지 않음 (테이블을 직접 사용하기 때문)

 

권장하는 식별자 전략

- 기본 키 제약 조건 : null 아님, 유일함, 변하면 안됨

- 권장 : Long 형 (10억 넘어도 동작해야 함) + 대체키 (ex. 시퀀스) + 키 생성전략 사용 (auto_increment, sequence object, 랜덤 값)