2023. 7. 28. 09:02ㆍ스터디/DDD 스터디
매핑 구현
- 애그리거트와 JPA 매핑을 위한 기본 규칙
- 애그리거트 루트는 엔티티이므로 @Entitiy로 매핑 설정
- 벨류는 @Embeddedable로 매핑 설정
- 벨류 타입 프로퍼티는 @Embedded로 매핑 설정
- 타 애그리거트는 ID로 참조
AttributeConverter
- int, long, String, LocalDate 같은 타입은 DB 테이블에 한 개의 컬럼에 매핑됨.
- 이와 비슷하게 벨로타입의 프로퍼티를 한 개의 컬럼에 매핑해야할 때도 있음.
- AttributeConverter을 통해 벨류 타입과 칼럼 데이터 간의 변환 처리 가능
- 벨류 컬렉션을 별도 테이블로 매핑시에는 @ElementCollection과 @CollectionTable을 함께 사용
- List에 자체 인덱스를 갖고 있기 때문에 OrderLine 객체에는 인덱스를 위한 프로퍼티가 존재하지 않음.
- @OrderColumn 에너테이션을 통해 지정한 칼럼에 리스트 인덱스값을 저장
- @CollectionTable은 벨류를 저장할 테이블을 지정. name은 테이블명, joinColumns는 외부키로 사용할 컬럼 지정
벨류를 이용한 ID 매핑
- 식별자라는 의미를 부각하기 위해 식별자 자체를 벨류 타입으로 만들 수 있음. @Id 대신 @EmbeddedId
JPA에서 식별자 타입은 Serialzable 타입이어야 함.
별도 테이블에 저장하는 벨류 메핑
- 애그리거트에서 루트 엔티티를 제외한 나머지 요소는 대부분 벨류
- 루트 엔티티 외에 다른 엔티티가 있다면 진짜 엔티티인지 의심해봐야
- 해당 엔티티가 자신만의 독자적인 라이프 사이클을 갖는다면 구분되는 애그리거트일 가능성이 높음.
- 애그리거트에 속한 객체가 벨류인지 엔티티인지 구분하는 방법은 고유 식별자를 갖는지를 확인하는 것
- @SecondaryTable과 AttributeOveride를 이용해 벨류를 매핑 한 테이블을 지정
- @SecondaryTable의 name 속성은 벨류를 저장할 테이블 지정.
- pkJoinColumes 속성은 벨류 테이블에서 엔티티 테이블로 조인할 때 사용할 컬럼 지정
- content 필드에 @AttributeOverride를 적용했는데 이 에너테이션을 사용해서 해당 벨류 데이터가 저장된 테이블 이름으ㅡㄹ 지정
- @SecondaryTable을 이용하면 아래 코드 실행 시 두 테이블을 조인해서 데이터를 조회
벨류 컬렉션을 @Entity로 매핑
- 기술적 한계로 인해 @Entity를 사용할 수도 있음
- Image가 값객체이지만 @Embeddable 타입 클래스는 상속 매핑을 지원하지 않기 때문에 @Entity를 사용해야
- @Inheritance 에너테이션을 사용하고, @DiscriminatorColumn을 사용하여 타입 구분 칼럼 지정
- 리스트에서 객체 삭제 시 DB에서도 함꼐 삭제되도록 orphanRemoval도 true로 설정
- @OneToMany 매핑에서 clear 메서드를 호출하면 각 개별 엔티티에 대해 Delete 쿼리 실행함
- @Embeddedable 타입에 대한 컬랙션은 한 번의 delete쿼리로 삭제 처리 수행
애그리거트 로딩 전략
- 애그리거트 속한 객체가 모두 모여야 하나가 됨. 즉, 애그리거트 루트를 로딩하면 루트에 속한 모든 객체가 완전한 상태여야
- FetchType.EAGER을 설정하여 즉시 로딩, 허나 모든 연관을 즉시 로딩으로 설정할 필요는 없음
- 즉시 로징 방식으로 설정하면 애그리거트 루트를 로딩하는 시점에 모든 객체를 함께 로딩할 수 있으나,
카타시안 곱, n+1, 쿼리 중복 등 다양한 문제 발생
- 즉시 로딩 방식을 사용할 때 성능 검토 필수
애그리거트의 영속성 전파
- 애그리거트가 완전한 상태여야 한다는 것은 애그리거트 루트를 조회할 때뿐만 아니라 저장하고 삭제할 때도 하나로 처리해야 함.
-저장/삭제 또한 애그리거트 모든 객체가 함께 저장/삭제 되어야
- @Embeddedable 매핑은 함꼐 저장/삭제 되므로 cascade 속성을 추가로 설정하지 않아도 됨.
- 반면, @Entity는 cascade 속성을 사용하여 저장/삭제 시 함께 처리되도록 설정
- cascade 속성의 기본값이 없음. PERSIST, REMOVE를 설정해야
'스터디 > DDD 스터디' 카테고리의 다른 글
응용 서비스와 표현 영역 (0) | 2023.08.12 |
---|---|
스프링 데이터 JPA를 이용한 조회 기능 (0) | 2023.08.05 |
애그리거트 (0) | 2023.07.19 |
도메인 주도 개발 시작하기 (0) | 2023.07.11 |
도메인 모델 시작하기 (0) | 2023.07.06 |