inflearn logo
강의

Course

Instructor

Toby's Clean Spring - Domain Model Pattern and Hexagonal Architecture Part 1

N+1 관련해서 질문있습니다.

1

Jubuseong

1 asked

0

안녕하세요. 우선 좋은 강의 제작해주신 토비님께 항상 감사하고 있어요. 이제 배운지 1년된 왕초보입니당..

혼자 배워보면서 개인 프로젝트를 만들고 있는데 JPA를 사용하고 있어요.

제가 궁금한 것이... N+1 관련한 문제입니다. 아 일단 프로젝트 주제는 복식부기 가계부에요.

 

@Entity
...
public class Journal extends BaseEntity {
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "ledger_id", nullable = false, updatable = false)
  @OnDelete(action = OnDeleteAction.CASCADE)
  private Ledger ledger;

  ...
  @OneToMany(mappedBy = "journal", fetch = FetchType.LAZY, cascade = CascadeType.ALL,
  orphanRemoval = true)
  private List<EntryLine> entries = new ArrayList<>(2);

  ...
  public EntryLine getEntryLine(EntrySide side) {
    switch (side) {
      case CREDIT : this.entries.stream().filter(line -> line.isCredit()).findFirst()
                    .orElseThrow(...);
      case DEBIT  : this.entries.stream().filter(line -> line.isDebit()).findFirst()
                    .orElseThrow(...);
      default : throw new ...
    }
  }

  ...
  // Service에서 저장되기 전에 호출
  public void validateSavable() {
    ...
    validateJournalSave();
  }
  
  private void validateJournalSave() {
    AccountType debit = getEntryLine(EntrySide.DEBIT).getAccountType();
    AccountType credit = getEntryLine(EntrySide.CREDIT).getAccountType();

    if(!this.transactionType.isValidPlacement(debit, credit)) {
      throw new ...
    }
  }
}

Journal Class에서 EntryLine List에 접근하고 있어요.

 

그리고 EntryLine Class는 이렇게 생겼어요.

@Entity
...
public class EntryLine extends BaseEntity {
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "journal_id", nullable = false, updatable = false)
  private Journal journal;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "account_id", nullable = false)
  private Account account;

  ...
  // private package 접근제어자 사용
  // Account는 Category를 참조중이에요.
  AccountType getAccountType() {
    return this.account.getCategory().getAccountType();
  }
}

 

거래가 저장되기 전에 각 계정이 this.transactionType에 따라 차변과 대변에 올바르게 위치하고 있는지 검사한 후 저장하고 있는데 이것을 생성과 수정할 때 두 곳에서 사용하고 있어요.

 

Ledger에 5개 Category가 있고, Account는 그 Category를 참조하고 Category에서만 AccountType이 있어요.

Journal이 각 EntryLine의 AccountType을 얻기 위해

Journal -> EntryLine -> Account -> Category -> getAccountType() 이렇게 흘러가네요.

이렇게 접근해도 설계상 괜찮은걸까요?

 

Journal을 저장할때는 @Query 사용해서 Fetch Join으로 필요한 Account를 가져오고 있는 상황이에요.

Journal이라는 엔티티가 비즈니스 로직 수행을 위해서 다른 엔티티의 필드까지 깊게 참조?? 가져오도록 설계하는게 옳은건지 모르겠어요.

java spring spring-boot jpa 리팩터링 ddd

Answer 0

도메인 모델에서 관계와 규칙을 구분하는 방법

0

55

2

헥사고날 아키텍처에서의 배치, 시큐리티, 비동기 이벤트 처리는 어떻게 하나요?

0

125

2

어댑터에서 도메인에 직접 의존하는 경우에 대해

0

126

2

Member 도메인이 PasswordEncoder를 받는 구조 질문 있습니다.

0

114

2

MemberService와 EmailSender 책임 분리에 대한 질문

0

107

2

NonNullApi를 NullMarked로 대체하라고 합니다.

0

130

2

39. 문서와 코드 다듬기 updateInfo 테스트 질문 있습니다.

0

76

2

Repository Adapter 설계에 대해 피드백을 부탁드립니다

0

111

2

헥사고날 part2 강의 출시 예정일 문의 드립니다.

0

255

2

PT 문의사항

0

101

1

초기 어플리케이션 구동 시 compose.yml 파싱 오류

0

151

2

애플리케이션의 JPA 리턴과 도메인 모델

0

128

2

애그리거트 루트의 하위 도메인들의 depth가 깊어질 때 문의

0

136

2

페이징 처리를 해야한다면 어떻게 해야할까요?

0

193

2

애그리거트의 repository

0

118

2

Domain Expert가 정확히 어떤 역할을 하는 사람인가요?

0

236

1

회원 애플리케이션 서비스 테스트 (1)

0

107

2

정적 팩토리 메서드 관련 질문드립니다!

0

110

2

spotbug + @NonNullApi 로만 Null 방어가 될까요?

0

129

2

required 포트에 관해서

0

93

2

혹시 다음 편은 언제쯤 오픈할까요?

0

168

2

서비스 단위 테스트 코드 작성

0

98

2

domain 모듈에 entity를 정의한다고 했을때

0

101

2

여러 엔티티의 조합으로 리포트를 제공해야할 때

0

80

2