밸류와 엔티티 구분
- 밸류 매핑 애그리거트
- 애그리거트 내에서 루트 엔티티를 제외한 구성요소는 대부분 밸류 객체
- 별도의 테이블에 데이터를 저장하는 구성요소가 있다면, 그것이 진짜 엔티티인지 의심해야 한다.
- 예를 들어, 주문 애그리거트에서 OrderLine은 별도 테이블에 저장되지만, 밸류 객체로 취급된다.
- 엔티티 확인
- 밸류가 아닌 엔티티로 확정된 경우, 해당 엔티티가 다른 애그리거트에 속하지 않는지 확인해야 한다.
- 독자적인 라이프 사이클을 가진다면, 별도의 애그리거트일 가능성이 높다.
- 식별자 오해 방지
- 애그리거트 구성요소가 고유 식별자를 갖는지 확인하는 것이 중요하다.
- 테이블에 PK가 있더라도, 그것이 반드시 애그리거트 구성요소의 식별자는 아니다.
류 매핑 전략
- 밸류 매핑 오류 예시
- Article과 ArticleContent 클래스를 별도의 테이블에 매핑할 때,
- ArticleContent의 ID가 식별자로 오해되어 엔티티로 잘못 매핑될 수 있다.
- ArticleContent는 Article의 내용을 담는 밸류 객체이므로,
- @Embeddable로 매핑하는 것이 적절하다.
- Article과 ArticleContent 클래스를 별도의 테이블에 매핑할 때,
- @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 |