밸류 매핑 애그리거트

밸류와 엔티티 구분

  • 밸류 매핑 애그리거트
    • 애그리거트 내에서 루트 엔티티를 제외한 구성요소는 대부분 밸류 객체
    • 별도의 테이블에 데이터를 저장하는 구성요소가 있다면, 그것이 진짜 엔티티인지 의심해야 한다.
      • 예를 들어, 주문 애그리거트에서 OrderLine은 별도 테이블에 저장되지만, 밸류 객체로 취급된다.
  • 엔티티 확인
    • 밸류가 아닌 엔티티로 확정된 경우, 해당 엔티티가 다른 애그리거트에 속하지 않는지 확인해야 한다.
    • 독자적인 라이프 사이클을 가진다면, 별도의 애그리거트일 가능성이 높다.
  • 식별자 오해 방지
    • 애그리거트 구성요소가 고유 식별자를 갖는지 확인하는 것이 중요하다.
    • 테이블에 PK가 있더라도, 그것이 반드시 애그리거트 구성요소의 식별자는 아니다.

류 매핑 전략

  • 밸류 매핑 오류 예시
    • Article과 ArticleContent 클래스를 별도의 테이블에 매핑할 때,
      • ArticleContent의 ID가 식별자로 오해되어 엔티티로 잘못 매핑될 수 있다.
      • ArticleContent는 Article의 내용을 담는 밸류 객체이므로,
        • @Embeddable로 매핑하는 것이 적절하다.
  • @SecondaryTable 활용
    • 밸류 객체를 별도 테이블에 매핑할 때
      • @SecondaryTable과
      • @AttributeOverride를 사용하여
        • 테이블 이름과 조인 칼럼을 지정한다. 이를 통해 두 테이블을 조인하여 데이터를 조회할 수 있다.

소분류: 조회 최적화

  • 조회 최적화 전략
    • ArticleContent를 엔티티로 매핑하고 지연 로딩을 설정하는 방법도 있지만, 이는 밸류 모델을 엔티티로 만드는 것이므로 권장되지 않는다.
    • 대신 조회 전용 기능을 구현하는 것이 바람직하다.
      • @SecondaryTable을 사용하면 항상 두 테이블을 조인하여 데이터를 조회
      • 조회 전용 쿼리 사용하여 성능 최적화 도모필요

코드 예시 및 실무 조언:

@Entity
@Table(name = "article")
@SecondaryTable(
    name = "article_content",
    pkJoinColumns = @PrimaryKeyJoinColumn(name="id")
)
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;

    @AttributeOverrides({
        @AttributeOverride(
            name = "content",
            column = @Column(table = "article_content", name = "content")
        ),
        @AttributeOverride(
            name = "contentType",
            column = @Column(table = "article_content", name = "content_type")
        )
    })
    @Embedded
    private ArticleContent content;
}

Uploaded by N2T

'도메인주도개발' 카테고리의 다른 글

표현 영역과 응용 영역  (0) 2024.01.07
밸류를 이용한 ID의 매핑  (0) 2024.01.05
Image 생성 관련 최적화  (0) 2024.01.05
애그리거트?  (0) 2024.01.02
애그리거트 간의 참조  (0) 2024.01.02