BE/Spring & Spring Boot

@ElementCollection

baek-dev 2025. 5. 20. 14:21

@ElementCollection – 값 타입 컬렉션 매핑 어노테이션

@ElementCollection 은 JPA에서 기본 타입 또는 Embeddable(값 객체)의 컬렉션을 별도의 테이블에 매핑할 수 있도록 도와주는 어노테이션임.
주로 String, Integer, Enum 등과 같은 값 객체 리스트를 다른 엔티티 없이 저장하고자 할 때 사용함.


1. 왜 사용하는가?

JPA에서 일반적으로 @OneToMany 관계를 매핑할 경우, 반드시 대상이 Entity 여야 하고,
별도의 ID를 가지는 테이블이 필요함.

하지만 단순히 "문자열 목록", "Enum 리스트", "주소 정보 집합" 과 같은 작은 값의 집합을 저장하고 싶을 때
굳이 엔티티로 분리하고 ID를 부여하는 것이 과도함 → 이럴 때 @ElementCollection 을 사용함.


2. 기본 사용 예시 – String 리스트

@Entity
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ElementCollection
    private List<String> tags = new ArrayList<>();
}

생성되는 테이블:

  • user 테이블 (기본 사용자 정보)
  • user_tags 테이블 (user_id, tags)

3. Embeddable 클래스와 함께 사용

@Embeddable
public class Address {
    private String city;
    private String street;
}
@Entity
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ElementCollection
    @CollectionTable(name = "user_addresses", joinColumns = @JoinColumn(name = "user_id"))
    private List<Address> addresses = new ArrayList<>();
}

생성되는 테이블:

  • user: id, name
  • user_addresses: user_id, city, street

→ Address 는 Entity 가 아니며, user_id 를 FK로 가지는 별도 테이블에 매핑됨


4. 관련 어노테이션 정리

어노테이션 설명
@ElementCollection 값 컬렉션임을 명시
@CollectionTable 컬렉션이 저장될 테이블 이름과 조인 조건 설정
@JoinColumn FK 컬럼명 설정
@Column 값 컬럼 이름 지정

5. 특징 및 주의사항

항목 설명
기본적으로 지연로딩 LAZY가 기본 설정임 (@ElementCollection(fetch = FetchType.LAZY))
Cascade 설정 불필요 값 타입이므로 생명주기를 부모가 전적으로 관리함
엔티티가 아님 @Id 없음, 조회/수정/삭제 시 전체 컬렉션 삭제 후 재삽입이 기본 동작
중복 허용 List, Set 모두 사용 가능 (Set으로 하면 중복 방지)
변경 감지 없음 변경 시 기존 컬렉션 삭제 후 재삽입됨

6. 실무 사용 예시

대상 예시
사용자 태그 목록 List<String> tags
즐겨찾는 카테고리 Set<EnumType> favorites
배송지 목록 List<Address> (Embeddable)
간단한 설정값 Map<String, String> 도 가능 (@MapKeyColumn 사용)

7. JPA의 관점에서 ElementCollection은 언제 피해야 하는가?

  • 컬렉션 수가 많아지면 → 전체 삭제/재삽입 전략으로 성능 저하
  • 값 객체에 대해 개별 수정/추적이 필요한 경우 → Entity로 분리하는 것이 좋음
  • 값 객체에 비즈니스 로직이 포함될 경우 → Entity 로 만드는 것이 명확함

정리

@ElementCollection 은 JPA에서 값 타입의 컬렉션(List, Set 등)을 엔티티에 포함시킬 때 사용하는 어노테이션임.
별도의 Entity를 만들 필요 없이, 값 타입을 컬렉션으로 관리하며, 자동으로 별도 테이블에 매핑됨.
단순하고 구조가 가벼운 데이터 컬렉션에 적합하며, 변경 감지가 없고, 전체 삭제/재삽입 전략이 기본임에 주의해야 함.

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

@ConfigurationProperties, @ConstructorBinding  (0) 2025.05.22
@Value  (0) 2025.05.21
[Spring Boot] HttpClient  (0) 2025.05.12
[Spring Boot] 웹소켓 하트비트  (0) 2025.05.07
[Spring Boot] PRG 패턴  (1) 2025.05.06