임베디드 타입

  • 임베디드 타입은 복합 값 타입으로 불리며, 새로운 값 타입을 직접 정의해서 사용하는 방법을 말한다.
  • 도, 시, 구와 같이 주소 컬럼이 여러 개 있으면 객체지향적이지 않고, 응집력을 떨어트리게 된다.
  • 이를 위해선 Address라는 클래스를 만들고 이 안에 도, 시 ,구 컬럼을 넣으면 된다.

@Embeddable

  • 임베디드 타입을 만든 곳, 클래스 정의부 위에 써준다.
  • 이 어노테이션이 붙은 클래스는 entity의 확장판이라고 보면 된다. 따라서 @Column, @OnetoMany와 같은 것들을 사용해도 무방하다.
  • 폴더 구조로는 이 임베디드 타입이 쓰이는 엔티티 폴더 속 embeddable 폴더안에 넣으면 깔끔하다.
@Getter
@Embeddable
public class DateInfo {
    @NotNull
    @Column(name = "year")
    private Integer year;

    @Column(name = "month")
    private Integer month;

    @Column(name = "day")
    private Integer day;
}

cf) 이에 대한 dto는 따로 만들지 않고 request에서 DateInfo를 통해 바인딩을 받고, entitiy에 바로 할당해주는 게 좋을 거 같다. 따라서 DateInfo 클래스 내에 validation 검사가 필요하면 유효성 검사에 대한 어노테이션을 바로 붙여준다.

 

@Embedded

  • 임베디드 타입을 엔티티로 지정된 클래스안에 속성으로 넣어주고 그 위에 넣어줄 어노테이션이다.
  • 임베디드 타입을 사용했을 때 엔티티의 컬럼은 임베디드 타입에 설정한 속성이다. 즉, 임베디드 타입이 임베디드 타입 안에 들어있는 속성으로 치환된다.
...

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

    @Embedded
    private DateInfo dateInfo;
    /* dateInfo가 dateInfo 속성들로 치환됨
    @Column(name = "year")
    private Integer year;

    @Column(name = "month")
    private Integer month;

    @Column(name = "day")
    private Integer day;
    */
    @Column(name = "title")
    private String title;

    @Column(name = "content")
    private String content;

    @Column(name = "start_day")
    private LocalDateTime startDay;
     
...

 

주의 사항 : 임베디드 타입 자체를 null로 처리하고 저장하면 그 안에 들어있는 컬럼들이 모두 null로 저장된다.

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

JPA - Projections  (0) 2025.02.18
Page 객체 응답 시 직렬화 변경 사항  (0) 2024.12.04
entity 기본 생성자 in jpa  (0) 2024.10.11
일반 join + Dto 바로 반환 (feat. N+1 문제)  (0) 2024.09.01
사용자 정의 리포지토리  (0) 2024.08.29

+ Recent posts