[4장] 엔티티 매핑

JPA 대표 어노테이션

  • 객체와 테이블 매핑: @Entity, @Table
  • 기본 키 매핑: @Id
  • 필드와 컬럼 매핑: @Column
  • 연관 관계 매핑: @ManyToOne, @JoinColumn

 

1. @Entity

  • 엔티티: Entity 어노테이션이 붙은 클래스 / JPA에서 관리
    • name
      • JPA에서 사용할 엔티티 이름 지정
      • 기본값 : 클래스명
  • 기본 생성자 필수
  • final/inner 클래스, enum, interface에는 사용 불가
  • 저장할 필드에 final 사용불가

 

2. @Table

  • 엔티티와 매핑할 테이블을 지정
    • name
      • 매핑할 테이블 이름 지정
    • uniqueConstraints(DDL)
      • DDL 생성시 유니크 제약 조건 생성
      • 2개 이상의 복합 유니크 제약도 가능
      • Schema 자동 생성으로 DDL 만들 때만 사용 가능

 

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-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와 한번 더 통신하는 단점 존재

 

5-5. AUTO 전략

  • @GeneratedStartegy의 기본 전략
  • DB를 변경해도 코드를 수정할 필요가 없음
    • SEQUENCE나 TABLE 전략으로 변경 시 시퀀스나 키 생성용 테이블을 미리 세팅해두어야 한다

 

5-6. 기본 키 매핑 정리

  • 영속성 컨텍스트: 엔티티를 식별자 값으로 구분 → em.persist()시 과정
    • 직접 할당
      • em.persist() 호출 전에 애플리케이션에서 직접 식별자 할당 필요
      • 식별자가 없을 시 예외 발생
    • SEQUENCE
      • DB 시퀀스에서 식별자 값 획득 후 영속성 컨텍스트에 저장 
    • TABLE
      • DB 시퀀스 역할을 하는 테이블에서 식별자 값 획득 후, 영속성 컨텍스트에 저장
    • IDENTITY
      • DB에 엔티티 저장 후, 식별자 값 획득 → 영속성 컨텍스트에 저장

'책 스터디 정리 > JPA ORM 스터디' 카테고리의 다른 글

[7장] 고급 매핑  (0) 2023.05.09
[6장] 다양한 연관관계 매핑  (0) 2023.05.02
[5장] 연관관계 매핑 기초  (0) 2023.04.25
[3장] 영속성 관리  (0) 2023.04.11
[1장] JPA 소개  (0) 2023.04.04