행복해지자
Published 2023. 5. 28. 00:19
DDD - 레포지토리와 모델구현 Java

리포지터리와 모델구현

JPA

모듈 위치

리포지터리 서비스는 도메인에 속하고
구현한 클래스는 인프라스트럭처 영역에 속함

리포지터리

  • 인터페이스는 애그리거트 루트를 기준으로 작성함
  • 기본기능 구현하기
    • id로 조회하기
    • 저장하기
    • findBy프로퍼티의이름
    • 형태로 사용
  • 트랜젝션
    • 메서드 실행이 끝나면 db에 반여하기 위해서 update쿼리를 실행함

리포지터리 구현

  • org.springframwork.data.repository.Repository<T,ID>인터페이스 상속
  • T -> 엔티티 타입 , ID 식별자 타입
  • 규칙에따라서 메서드를 작성
  • save, findById, findBy프로퍼티의이름, delete, deleteById

매핑구현

루트는 @Entity로 매핑설정

Value는 Embeddable로 매핑설정

- Value 타입 프로퍼티는 @Embedded로 설정
- @AttributeOberrides로 매핑되는 이름이 다를때 컬럼 이름 변경가능함

기본생성자를 제공해야함

- 하지만 jpa만 사용하기 때문에 protected로 선언

필드접근방식을 사용 @Access(AccessType.FIELD)

- set 메서드를 생성하는 것이 더 안좋음
- 하이버네이트는 @id, @EmveddedId 위치에따라서 필드 메서드를 결정

두개이상의 프로퍼티가 있는 VO는 AttributeContverter이용해야함

- @Converter사용해서 지정하고 AttributeContverter를 상속받아야함
- autoApply true안하면 지정해야함

VO컬렉션

- 따로 테이블을 만들어 참조해서 사용할 것
- @ElementCollection @CollectionTable사용

VO를 하나의 컬럼에 매핑하기

- AttributeConverter 사용
- 새 밸류타입 지정할것
- 밸류타입을 하나의 식별자로 매핑하면 @EmbeddedId 어노테이션
- 식별자가될 밸류타입은 SerialZable 인터페이스를 상속

별도 테이블에 저장되는 VO

- 다른 구성요소중 엔티티가 있으면 의심하기
- 변경상태를 찾아 확인해볼수 있다

VO컬렉션을 @Entity로 매핑하기

- @Ingeritance 어노테이션
- strategy로 SINGLE_TABLE적용
- @DIscriminatorColumn 어노테이션으로 타입구분 칼럼 지정
- 상태변경 기능 x
- 상속받은 클래스는 @Entity와 @Discriminator사용
- 이 VO와는 OnetoMany롷 매칭을 처리
- cascade, orphanRemoveal true지정하기
- clear매서드가 효율적이지않음 그러면 하나의 단일 클래스로 구현하고 if else로 처리해야함

M-N 매핑

- VO 컬렉션 매핑과 동일한 방식
- 연관을 맺는 식별자가 온다는 것이 다름
- @ElementCollection으로 조인테이블도 지워짐

로딩전략

  • 루트를 로딩하면 모든 객체가 모여야 완전한 하나여야함을 의미함
  • 조회시점에서 완전하기 위해서는 EAGER 사용하면됨
    • 쿼리에 중복을 발생시키기 때무에 성능을 검토해야함
    • 완전한 하나가 꼭 조회 시점이여야 할 필요가 없음
      • 트렌젝션 범위내에서 지연로딩을 허용하기 때문에 문제X
      • 즉 LAZY를 사용해도 됨
    • 애그리거트에 맞게 설정해야함

영속성 전파

  • 저장하고 삭제할 때도 하나로 처리
  • CascadeType.PERSIST, CascadeType.REMOVE를 설정

식별자 생성기능

  • 직접, 도메인 로직으로, DB의 일련번호 사용
  • 규칙이 있다면 기능을 분리해야함
  • 특정 값의 조합도 규칙임
  • 레포지토리인터페이스에 식별자를 생성하는 메서드를 추가하고 구현 하면됨
  • 저장한 뒤에 식별자를 구할수 있음

DIP

  • 도메인 모델은 구현 기술인 JPA에 의존 X
  • 도메인이 래포지토리 즉 인프라에 의존

저수준의 구현기술 변경 거의 X

- 너무과한 대비임
- 타협을 해야한다~~

'Java' 카테고리의 다른 글

DDD 응용서비스와 표현 영역  (0) 2023.06.03
DDD JPA를 이용한 조회기능  (0) 2023.05.28
DDD 애그리거트  (0) 2023.05.28
DDD 도메인모델과 아키텍처  (0) 2023.05.23
Java Collection FrameWork?  (0) 2023.03.27
profile

행복해지자

@qlido

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!