Skip to main content

Entity Mapping

이번 챕터에서는 엔티티와 테이블을 정확하게 매핑하는데 사용되는 어노테이션들에 대해서 소개합니다.

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

@Entity

테이블과 매핑할 클래스는 필수적으로 @Entity 어노테이션을 붙여주어야 합니다.

주의사항

  • 기본 생성자는 필수입니다.

    자바에서 생성자를 하나도 설정하지 않으면 기본적으로 인자가 없는 기본 생성자를 생성해줍니다. 다만 기본 생성자가 아닌 생성자가 하나라도 있을 경우 자동으로 생성해주지 않기 때문에 이때는 기본 생성자도 생성해 주어야합니다

  • final, enum, interface, inner 클래스에는 사용할 수 없습니다.

  • 저장할 필드에 final을 사용하면 안 됩니다.

@Table

@entity어노테이션과 반대로 엔티티와 매핑할 ‘테이블’을 지정해줍니다.

@Id

DB마다 제공하는 기본 키 생성 방식은 다릅니다. 이러한 문제를 해결하기위해 JPA는 어떤 방식을 사용했을까요 ?

JPA가 제공하는 기본 키 생성 전략은 다음과 같습니다.

  • 직접 할당 : 어플리케이션에서 직접 할당합니다.

  • 자동 생성 :

    • IDENTITY : 기본 키 생성을 디비에 위임합니다.

      해당 생성 전략은 엔티티를 데이터베이스에 저장해야 식별자를 구할 수 있으므로 persist()메소드가 호출되는 즉시 INSERT SQL이 데이터베이스에 전달됩니다. 따라서 트랜잭션을 지원하는 쓰기 지연이 동작하지 않습니다.

    • SEQUENCE : 디비 시퀀스를 사용해서 기본 키를 할당합니다.

      sequence는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트입니다. 이 시퀀스를 활용해 기본 키를 생성하며 시퀀스를 지원하는 디비에서만 사용이 가능합니다.

    • TABLE : 키 생성 테이블을 사용합니다.

      키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 디비 시퀀스를 흉내내는 전략입니다. 이 전략은 테이블을 사용하므로 모든 디비에 적용이 가능합니다.

    • AUTO : 사용하는 데이터베이스 방언에 따라 위의 전략 중 하나를 자동으로 선택하게끔 하는 전략입니다. mysql을 사용하면 IDENTITY를 oraqle을 선택하면 SEQUENCE를 사용합니다.

영속성 컨텍스트는 엔티티를 식별자 값으로 구분하므로 엔티티를 영속 상태로 만들기위해서는 식별자 값이 반드시 필요합니다.

엔티티 필드 ↔ 테이블 컬럼 매핑 어노테이션

Column, Enumerated, Temporal, Lob, Transient, Access