@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 |