흰 스타렉스에서 내가 내리지

[JPA] 값 타입2 - 값 타입 컬렉션 본문

Spring

[JPA] 값 타입2 - 값 타입 컬렉션

주씨. 2023. 2. 19. 18:12
728x90

값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 @ElementCollection, @CollectionTable 어노테이션을 사용하면 된다. 

@Entity
@Getter @Setter
public class Member{
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Embedded private Address homeAddress;

    @ElementCollection
    @CollectionTable(name = "FAVORITE_FOODS",
            joinColumns = @JoinColumn(name = "MEMBER_ID"))
    @Column(name = "FOOD_NAME")
    private Set<String> favoriteFoods = new HashSet<>();
    
    @ElementCollection
    @CollectionTable(name = "ADDRESS", joinColumns = @JoinColumn(name = "MEMBER_ID"))
    private List<Address> addressHistory = new ArrayList<>();

 

 

실무에서는 값 타입 컬렉션이 매핑된 테이블에 데이터가 많다면 값 타입 컬렉션 대신에 일대다 관게를 고려해야 한다. 

// 값 타입 컬렉션 대신에 일대다 관게 사용
@Entity
public class AddressEntity {
    @Id
    @GeneratedValue
    private Long id;
    
    @Embedded Address address;
}

...

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "MEMBER_ID")
    private List<AddressEntity> addressHistory = new ArrayList<>();
    
    ...

 

 

엔티티 타입 (Entity Type)과 값 타입(Value Type)의 차이

엔티티 타입의 특징

  • 식별자(@id)가 있다.
    • 엔티티 타입은 식별자가 있고 식별자로 구별할 수 있다.
  • 생명 주기가 있다. 
    • 생성하고, 영속화하고, 소명하는 생명 주기가 있다.
  • 공유할 수 있다. 
    • 참조 값을 공유할 수 있다. 이것을 공유 참조라 한다.
    • 예를 들어 회원 엔티티가 있다면 다른 엔티티에서 얼마든지 회원 엔티티를 참조할 수 있다. 

값 타입의 특징

  • 식별자가 없다.
  • 생명 주기를 엔티티에 의존한다
    • 스스로 생명주기를 가지지 않고 엔티티에 의존한다. 의존하는 엔티티를 제거하면 같이 제거된다. 
  • 공유하지 않는 것이 안전하다.
    • 엔티티 타입과는 다르게 공유하지 않는 것이 안전하다. 대신에 값을 복사해서 사용해야 한다.
    • 오직 하나의 주인만이 관리해야 한다 
    • 불변 객체로 만드는 것이 안전하다.

 

식별자가 필요하고 지속해서 값을 추적하고 구분하고 변경해야 한다면 그것은 값 타입이 아닌 엔티티다.