[스프링] - @ElementCollection

CodeByHan·2025년 3월 20일

스프링

목록 보기
14/33

오늘은 간단하게 @ElementCollection에 대해 정리해볼려고 한다.

@ElementCollection

값 타입 컬렉션(Value Type Collection)

  • 컬렉션(리스트, 세트, 맵 등) 내부에 단순한 값들을 저장하는 것을 의미
  • 컬렉션을 사용하여 DB 테이블로 구현할 때 관계형 데이터 베이스는 기본적으로 테이블안에 컬렉션을 담을 수 없다.

-> 따라서 별도의 테이블을 만들어서 저장해야한다!!

특징

  • 별도의 테이블 생성
  • 식별자 없음
  • 기본 지연 로딩(LAZY)
    • 기본적으로 LAZY로 로딩되며, 필요 시 fetch 옵션을 통해 즉시 로딩(EAGER)으로 변경 가능

@ElementCollection@CollectionTable를 사용한다.

@CollectionTable

  • JPA에서 컬렉션 값 타입(@ElementCollection)으로 매핑된 데이터가 저장될 별도의 테이블에 대한 세부 정보를 지정하기 위한 어노테이션

주요 역할

  • 테이블 이름 지정
  • 조인 컬럼 설정
  • 매핑 세부 조정

예제 1

@Entity
public class User {

    @Id @GeneratedValue
    private Long id;
    
    private String name;
    
    // 기본 타입 컬렉션 예제
    @ElementCollection
    @CollectionTable(
        name = "USER_FAVORITE_FOODS",               // 컬렉션을 저장할 테이블 이름
        joinColumns = @JoinColumn(name = "USER_ID")  // 소유 엔티티(User)의 식별자와 연결될 FK 컬럼 지정
    )
    @Column(name = "FOOD_NAME") // String 타입의 값 컬렉션이므로 컬럼명 지정 가능
    private Set<String> favoriteFoods = new HashSet<>();
    
    // 임베디드 타입 컬렉션 예제
    @ElementCollection
    @CollectionTable(
        name = "USER_ADDRESS_HISTORY",
        joinColumns = @JoinColumn(name = "USER_ID")
    )
    private List<Address> addressHistory = new ArrayList<>();
}

-> @CollectionTable을 통해 지정한 이름(USER_FAVORITE_FOODS, USER_ADDRESS_HISTORY)의 테이블이 생성되며,
이 테이블은 소유 엔티티의 식별자(USER_ID)를 외래 키로 사용해 연관관계를 맺는다.

profile
노력은 배신하지 않아 🔥

0개의 댓글