BananMoon / TIL

TIL : Today I Learned
0 stars 0 forks source link

[JPA] 엔티티에 임베디드 타입/Enum 타입 사용. 관련된 JPA 애노테이션 #13

Open BananMoon opened 1 month ago

BananMoon commented 1 month ago

Entity 필드에 클래스 타입 필드 사용.

하나의 Entity 안에 필드를 하나의 다른 클래스로 관리하고자 할 수 있다. 이때 엔티티가 여러 테이블이 아닌 하나의 테이블에 매핑될 수 있게 해주는게 @Embeddable이다.

1️⃣ @Embeddable

하나의 클래스가 다른 엔티티들에 임베디드(embedded)될 수 있도록 선언하는 애노테이션. Enum 클래스에 붙여준다.

@Embeddable
public class ContactPerson {
   private String firstName;
   private String lastName;
   private String phone;
}

그리고 이렇게 embedded 가능한 클래스를 하나의 타입으로서 다른 엔티티에 임베드(embed)시키기 위해 사용하는 애노테이션이 @Embedded이다.

2️⃣ @Embedded

@Entity
public class Company {
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    private String address;
    private String phone;

    @Embedded
    private ContactPerson contactPerson;
}

그럼 이 클래스의 필드들을 DB의 칼럼들 어떻게 매핑시킬까?

3️⃣ @AttributeOverrides, @AttributeOverride

이때 사용할 수 있는 애노테이션이 @AttributeOverrides, @AttributeOverride인데, 임베디드 타입의 칼럼 속성을 오버라이드(override)할 수 있다. 속성으로 name, column 옵션을 지정할 수 있다.

임베디드 타입에 칼럼 속성을 지정해보자.

    @Embedded
    @AttributeOverrides({
        @AttributeOverride( name = "firstName", column = @Column(name = "contact_first_name")),
        @AttributeOverride( name = "lastName", column = @Column(name = "contact_last_name")),
        @AttributeOverride( name = "phone", column = @Column(name = "contact_phone"))
   })
    private ContactPerson contactPerson;

예시를 보면, ContactPerson 클래스에 있는 firstName 필드를 contact_first_name 칼럼으로 매핑하고, lastName 필드를 contact_last_name 칼럼으로 매핑하고, phone 필드를 contact_phone 칼럼으로 매핑한다


Entity 필드에 Enum 타입 필드 사용.

Entity 내 필드를 Enum 클래스로 사용할 때도 있다.

@Enumerated(EnumType.STRING)

EnumType이라는 Enum을 확인해보면 2가지를 지원한다.

  1. ORDINAL : 필드들을 순서의 수로 나타내어 DB에 저장한다.
  2. STRING : Enum의 name 값을 DB에 저장한다.
BananMoon commented 1 month ago