리포지터리와 모델 구현

2023. 7. 28. 09:02스터디/DDD 스터디

728x90

매핑 구현

- 애그리거트와 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를 설정해야

 

728x90

'스터디 > DDD 스터디' 카테고리의 다른 글

응용 서비스와 표현 영역  (0) 2023.08.12
스프링 데이터 JPA를 이용한 조회 기능  (0) 2023.08.05
애그리거트  (0) 2023.07.19
도메인 주도 개발 시작하기  (0) 2023.07.11
도메인 모델 시작하기  (0) 2023.07.06