N+1 관련해서 질문있습니다.
1
1 asked
안녕하세요. 우선 좋은 강의 제작해주신 토비님께 항상 감사하고 있어요. 이제 배운지 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이라는 엔티티가 비즈니스 로직 수행을 위해서 다른 엔티티의 필드까지 깊게 참조?? 가져오도록 설계하는게 옳은건지 모르겠어요.
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

