책 스터디 정리/JPA ORM 스터디
[4장] 엔티티 매핑
8시20분
2023. 4. 18. 22:50
JPA 대표 어노테이션
- 객체와 테이블 매핑: @Entity, @Table
- 기본 키 매핑: @Id
- 필드와 컬럼 매핑: @Column
- 연관 관계 매핑: @ManyToOne, @JoinColumn
1. @Entity
- 엔티티: Entity 어노테이션이 붙은 클래스 / JPA에서 관리
- name
- JPA에서 사용할 엔티티 이름 지정
- 기본값 : 클래스명
- name
- 기본 생성자 필수
- final/inner 클래스, enum, interface에는 사용 불가
- 저장할 필드에 final 사용불가
2. @Table
- 엔티티와 매핑할 테이블을 지정
- name
- 매핑할 테이블 이름 지정
- uniqueConstraints(DDL)
- DDL 생성시 유니크 제약 조건 생성
- 2개 이상의 복합 유니크 제약도 가능
- Schema 자동 생성으로 DDL 만들 때만 사용 가능
- name
3. 데이터베이스 스키마 자동 생성
- 클래스의 매핑 정보로 DB 스키마를 자동 생성한다.
- ddl-auto=create 속성 추가로 애플리케이션 실행 시점에 DB 테이블 자동 생성
- show-sql 속성 true로 DDL 출력 가능
- 자동 생성되는 DDL은 설정한 DB마다 다르게 생성됨
- 운영 환경에서 사용할 만큼 완벽하지 않아서 참고 용도 사용하는 게 좋음
- ddl-auto 속성
- create: 기존 테이블 삭제 후 신규 생성
- DROP + CREATE
- create-drop: create 속성에 추가로 애플리케이션 종료시 생성한 DDL 제거
- DROP + CREATE + DROP
- update: DB 테이블과 엔티티 매핑 정보 체크해서 변경 사항만 수정
- validate: DB 테이블과 엔티티 매핑 정보 비교해서 차이가 나면 경고 후 애플리케이션 실행 X
- DDL 수정 X
- none: 자동 생성 기능 사용하지 않으려면 속성 자체를 삭제 or 유효하지 않은 옵션 값 추가
- create: 기존 테이블 삭제 후 신규 생성
- 운영 서버에서는 create, create-drop, update 사용하면 안됨
- 개발 환경에 따른 추천 전략
- 개발 초기: create/update
- 로컬 테스트/CI 환경: create/create-drop
- 테스트 서버: update/validate
- 스테이지/프로덕션: validate/none
4. DDL 생성 기능
@Column 어노테이션 length/nullable/unique 기능 → DDL 자동 생성시에만 사용 / JPA 실행 로직에는 영향 X
- DDL을 직접 작성하는 경우 사용할 필요 X
- 개발자가 엔티티만 보고 제약 조건 파악 가능
- 자동 생성되는 DDL을 위한 기능 존재
5. 기본 키 매핑
JPA가 제공하는 DB 기본 키 생성 전략
- 직접 할당: 기본 키를 서버 애플리케이션에서 직접 할당
- @Id 어노테이션만 사용시 직접 할당
- 자동 생성: 대리 키를 사용
- @Id, @GeneterateValue 어노테이션 추가, 원하는 키 생성 전략 선택
- DB 벤더에 의존
- IDENTITY: 기본 키 생성을 DB에 위임
- SEQUENCE: DB 시퀀스를 사용해서 기본 키 할당
- DB 벤더에 상관없이 사용 가능
- TABLE: 키 생성 테이블 사용 → 해당 테이블을 시퀀스처럼 사용
- 자동 생성 전략이 다양한 이유: DB 벤더마다 기본 키 지원하는 방식이 다름
- 오라클: 시퀀스 제공 vs MySQL: 시퀀스 제공 X, AUTO_INCREMENT 사용
5-1. 기본 키 직접 할당 전략
- @Id로 매핑하여 기본키 할당
- em.persist()로 엔티티 저장 전에 애플리케이션에서 직접 할당
- 식별자 값 없이 저장하면 예외 발생: JPA 표준에 정의되어 있지 않음
5-2. IDENETITY 전략
- 기본 키 생성을 DB에 위임
- 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용
- @GeneratedValue의 strategy 값을 GenerationType.IDENTITY로 지정 시 사용 가능
- 데이터를 DB에 INSERT 후에 기본 키 값을 조회 할 수 있음
- 트랜잭션을 지원하는 쓰기 지연이 동작하지 않음
5-3. SEQUENCE 전략
- DB 시퀀스: 유일한 값을 순서대로 생성하는 DB 오브젝트
- DB 시퀀스를 사용해서 기본 키를 생성
- 오라클, PostgreSQL, DB2, H2에서 사용
- GenerationType.SEQUENCE로 설정 후, generator에 DB 시퀀스를 매핑한 생성기를 추가하여 사용
- DB 시퀀스로 식별자 조회 후 엔티티에 할당 → 영속성 컨텍스트에 저장
- INSERT 이전에도 식별자 조회 가능
- DB 시퀀스로 식별자 조회하는 작업이 추가 발생(DB와 2번 통신)
- DB 시퀀스에서 NEXTVAL 조회해서 기본 키 값으로 사용
- 엔티티 DB에 저장
5-4. TABLE 전략
- 키 생성 전용 테이블에 이름/값을 관리하여 DB 시퀀스를 모방함
- 모든 DB에서 적용가능
- GenerationType.TABLE로 설정 후, generator에 키 용 테이블을 매핑한 생성기를 추가하여 사용
- 키를 관리하는 부분이 시퀀스가 아닌 테이블이라는 점을 제외한 SEQUENCE 전략과 동일
- 값을 조회하면서 SELECT, 값 증가를 위해 UPDATE 쿼리 사용 → DB와 한번 더 통신하는 단점 존재
- 모든 DB에서 적용가능
5-5. AUTO 전략
- @GeneratedStartegy의 기본 전략
- DB를 변경해도 코드를 수정할 필요가 없음
- SEQUENCE나 TABLE 전략으로 변경 시 시퀀스나 키 생성용 테이블을 미리 세팅해두어야 한다
5-6. 기본 키 매핑 정리
- 영속성 컨텍스트: 엔티티를 식별자 값으로 구분 → em.persist()시 과정
- 직접 할당
- em.persist() 호출 전에 애플리케이션에서 직접 식별자 할당 필요
- 식별자가 없을 시 예외 발생
- SEQUENCE
- DB 시퀀스에서 식별자 값 획득 후 영속성 컨텍스트에 저장
- TABLE
- DB 시퀀스 역할을 하는 테이블에서 식별자 값 획득 후, 영속성 컨텍스트에 저장
- IDENTITY
- DB에 엔티티 저장 후, 식별자 값 획득 → 영속성 컨텍스트에 저장
- 직접 할당