값 타입 - 컬렉션1

PPakSSam·2022년 1월 18일
0
post-thumbnail

값 타입 - 컬렉션 순서


다음 코드는 컬렉션 값 타입을 사용한 예제이다.

@Entity
public class Member {

    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    
    @Column(name = "USERNAME")
    private String username;
    
    @Embedded
    private Address homeAddress;
    
    @ElementCollection
    @CollectionTable(name = "FAVORITE_FOOD",
                     joinColumns = @JoinColumn(name = "MEMBER_ID"))
    private Set<String> favoriteFoods = new HashSet<>();
    
    @ElementCollection
    @CollectionTable(name = "ADDRESS",
                     joinColumns = @JoinColumn(name = "MEMBER_ID"))
    private List<Address> addressHistory = new ArrayList<>();
    
}
  • 값 타입을 하나 이상 저장할 때 사용한다.
  • @ElementCollection, @CollectionTable 사용
  • DB는 컬렉션을 같은 테이블에 저장할 수 없다.
  • 컬렉션을 저장하기 위한 별도의 테이블이 필요하다.

컬렉션 값 타입 - 저장 예제

Member member = new Member();
member.setUsername("member");
member.setHomeAddress(new Address("city", "street", "10000"));

member.getFavoriteFoods().add("치킨");
member.getFavoriteFoods().add("족발");
member.getFavoriteFoods().add("피자");

member.getAddressHistory().add(new Address("old1", "street", "100");
member.getAddressHistory().add(new Address("old2", "street", "100");

em.persist(member);

위와 같이 코드를 짜고 실행하면 다음과 같이 쿼리가 호출된다.

create table ADDRESS (
   MEMBER_ID bigint not null,
   city varchar(255),
   street varchar(255),
   zipcode varchar(255)
)

create table FAVORITE_FOOD (
   MEMBER_ID bigint not null,
   FOOD_NAME varchar(255)
)

create table Member (
   MEMBER_ID bigint not null,
   city varchar(255),
   street varchar(255),
   zipcode varchar(255),
   USERNAME varchar(255),
   primary key (MEMBER_ID)
)

insert 
      into
          Member
            (city, street, zipcode, USERNAME, MEMBER_ID) 
          values
            (?, ?, ?, ?, ?)

// insert 쿼리 2번 (addressHistory에 add를 2번했으므로)
insert 
      into
          ADDRESS
            (MEMBER_ID, city, street, zipcode) 
          values
            (?, ?, ?, ?)  
         
// insert 쿼리 3번 (favoriteFoods에 add를 3번했으므로)
insert 
      into
          FAVORITE_FOOD
            (MEMBER_ID, FOOD_NAME) 
          values
            (?, ?) 

쿼리를 보면 컬렉션 값 타입을 위한 테이블이 따로 생성됨을 알 수 있다.

profile
성장에 대한 경험을 공유하고픈 자발적 경험주의자

0개의 댓글