[ ddd start! ] 4. 리포지터리와 모델구현

박병찬·2022년 2월 27일
0

ddd start

목록 보기
4/11

CHAPTER 4. 리포지터리와 모델구현

1. JPA를 이용한 리포지터리 구현

  • 가능하면 리포지토리 구현 클래스를 인프라스트럭쳐 영역에 위치시켜서 인프라스트럭쳐에 대한 의존을 낮춰야한다.

2. 매핑 구현

애그리거트와 JPA 매핑을 위한 기본 규칙

  • 애그리거트 루트는 엔티티이므로 @Entity 로 매핑설정한다.
  • 한 테이블에 엔티티와 밸류 데이터가 같이 있다면
    밸류는 @Embeddable로 매핑설정한다.
    밸류타입 프로퍼티는 @Embedded로 매핑설정한다.
  • JPA에서 식별자 타입은 Serializable 타입이어야 하므로 식별자로 사용될 밸류 타입은 Serializable 인터페이스를 상속받아야 한다.
  • 애그리거트에 속한 객체가 밸류인지 엔티티인지 구분하는 방법은 고유 식별자를 갖는지 여부를 확인하는 것이다.

3. 애그리거트 로딩 전략

  • JPA 매핑을 설정할 때 항상 기억해야 할 점은 애그리거트에 속한 객체가 모두 모여야 완전한 하나가 된다는 것이다.
  • 즉, 애그리거트 루트를 로딩하면 루트에 속한 모든 객체가 완전한 상태여야 함을 의미한다.
  • 즉시로딩으로 조회하면 애그리거트 루트를 로딩하는 시점에 애그리거트에 속한 모든 객체를 함께 로딩할 수 있는 장점이 있지만, 이 장점이 항상 좋은 것은 아니다.

즉시로딩 단점

  • 즉시로딩으로 조인된 쿼리를 조회할 경우 중복이 발생된다.
  • 데이터가 많을 경우 과도하게 조회되기 때문에 성능이 나빠지는 문제가 생긴다.

애그리거트는 개념적으로 하나여야하지만, 루트 엔티티를 로딩하는 시점에 애그리거트에 속한 객체를 모두 로딩해야 하는 것은 아니다. 그렇기 때문에 즉시로딩만을 사용하는 것이 아니라 상황에 맞게 즉시로딩과 지연로딩을 선택해야 한다.

4. 애그리거트의 영속성 전파

  • 애그리거트가 완전한 상태여야 한다는 것은 애그리거트 루트를 조회할 때 뿐만 아니라 저장하고 삭제할 때도 하나로 처리해야 함을 의미한다.

  • 저장 메서드는 애그리거트에 속한 모든 객체를 저장해야 한다.

  • 삭제 메서드는 애그리거트에 속한 모든 객체를 삭제해야 한다.

  • @Embeddable 매핑 타입의 경우 함께 저장되고 삭제되므로 cascade속성을 추가로 설정하지 않아도 된다.

  • 애그리거트에 속한 @Entity 타입에 대한 매핑은 cascade 속성을 사용해서 저장과 삭제 시에 함께 처리되도록 설정해야 한다.

5. 식별자 생성 기능

세 가지 방식

  1. 사용자가 직접 생성
  2. 도메인 로직으로 생성
  3. DB를 이용한 일련번호 사용
  • 식별자 생성 규칙은 도메인 규칙이므로 도메인 영역에 식별자 생성 기능을 위치시켜야 한다.
profile
안녕하세요

0개의 댓글