Spring / @ElementCollection | 값 (타입) 컬렉션

춤인형의 개발일지·2025년 1월 9일

Spring

목록 보기
4/8

25/01/09(목)

@ElementCollection

단순하며 완전 종속적이라 함께 저장되거나 삭제되는 상황에서 보통 사용한다.

ex)

  • (네이버지도) 업체, 업체 사진 URL
  • (쇼핑몰) 상품, 상품 옵션
  • (쇼핑몰) 구매자, 배송지
    한 가게의 이미지가 여러개일 때 Entity를 하나 더 만든다고 하면 그 Entity에는 String 한개만 들어가게 된다. 이럴땐 굳이 Entity를 사용할 필요는 없으니까 그걸 ElementCollection을 해주는 것이다.

@ElementCollection을 붙이지 않은 경우

엔티티 필드 타입이 List<값 타입>인 경우

  • 아무 어노테이션을 사용하지 않았을 때

import java.util.List;

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private List<String> imageUrls; // 여기 주목

    protected Product() {
    }

    public Product(String name, List<String> imageUrls) {
        this.name = name;
        this.imageUrls = imageUrls;
    }
}
  • Product로 인해서 DB에 테이블이 몇 개 생기나요?
    • 3개 / id, name, imageUrls
  • DB 테이블의 image_urls 컬럼의 타입은 뭔가요?
    • 배열
  • image_urls 컬럼에 데이터가 어떤 식으로 관리될까요?
    • [http://image_urls_example1, http://image_urls_example2]
      이렇게 배열안에 차곡차곡 쌓이게 된다.

@ElementColletion을 붙인 경우

import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

import java.util.List;

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ElementCollection
    private List<String> imageUrl; // 여기 주목

    protected Product() {
    }

    public Product(String name, List<String> imageUrl) {
        this.name = name;
        this.imageUrl = imageUrl;
    }
}
  • Product로 인해서 DB에 테이블이 몇 개 생기나요?
    • product_Image_Urls의 테이블이 하나 더 생긴다.
  • DB에서 image_url 컬럼의 값을 수정할 수 있을까요?
    • 수정이 가능하다!
  • 항상 부모와 함께 저장되고 삭제되므로 cascade 옵션은 제공하지 않는다.

😐 느낀점

필드는 만들 때마다 어떤 제한을 걸어줄지, 어느 곳에다가 넣어줄지에 대한 
고민들을 하면 할 수록 좋은 코드가 나온다.

0개의 댓글