-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BE] refactor: TemplateMapper
에서 ReviewGroup
의존성 제거
#1011
base: develop
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
좋은 리팩터링이었다 생각해 approve 드립니다만 추가 질문이 있습니다!
public List<SectionResponse> mapSectionResponses(long templateId, long reviewGroupId) { | ||
Template template = templateRepository.findById(templateId) | ||
.orElseThrow(() -> new TemplateNotFoundByReviewGroupException(reviewGroupId, templateId)); | ||
|
||
List<SectionResponse> sectionResponses = template.getSectionIds() | ||
return template.getSectionIds() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
reviewGroupId가 예외 로그에만 사용되고 있네요. 그럼에도 이 함수의 인자로 전달해준 이유는 "특정 리뷰 그룹의 템플릿 아이디에 대한 템플릿이 없다"는 구체적인 예외 발생 맥락을 전달하기 위함이 맞나요?
(티키타카 오래걸릴까봐 미뤄 짐작하고 이어 답변하자면 ... )
제가 레포지토리에서 예외를 발생하는 것을 맡았는데, 그럼 이 경우에는
- template 레포지토리에서 특정 값 조회했을 때 없었다는 것
- reviewGroupId 에 해당하는 template 이었다는 것
을 담기 위해서 아래와 같이 try-catch로 구현하려는데 이런 의도가 맞나요?
try {
Template template = templateRepository.findById(templateId);
// ... 블라블라
} catch (NotFoundException ex) {
throw new TemplateNotFoundByReviewGroupException(reviewGroupId, templateId);
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Repository로 예외를 옮김으로써 서비스에서 반복적인 코드를 줄일 수 있다.
- 이때, 서비스단에서 남기고 있던 추가 맥락을 로깅할 수 없게 된다 (트레이드 오프)
- 해당 부분은 AOP 로깅 과정에서 파라미터를 로깅하는 방식으로 추적할 수 있다.
디코 대화도 남깁니다~
하지만 레포로 넘기면 엔티티단에서의 예외 처리, 서비스단에서의 코드 중복이 없는 대신 맥락이 조금 모자라지겠네요
해당 맥락은 AOP로 충당하는 방식으로 갈 건지~ 아니면 이대로 서비스에 둘 건지~가 되겠군요
아마 전자가 조금 더 합리적일 것이라는 생각입니당
AOP 로깅할 때 예외 발생했을 때에만 스택트레이스의 파라미터를 로깅할 수 있을지 확인해봐야겠어요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
결론: try-catch
를 사용하지 말고, 예외를 최소화한 뒤 맥락은 AOP를 통해 제공하는 것을 고려해 보자
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
산초 코멘트 aop 로깅까지 이해완!👍
문제 상황
TemplateResponse
를 위해 매핑 로직을 태우는데, 이때 불필요한ReviewGroup
까지 파라미터에 들어가 강결합되는 문제가 있었습니다. 의존성은 최대한 빼주는 게 좋으니 최종 매핑을 서비스단에서 진행하도록 수정했어요. 사용하고 있지 않더라도,ReviewGroup
을 가지는 것만으로도 추후에 더 얽힐 가능성이 있습니다 (이전 캐시 코드에서도 해당 리뷰그룹의 값을 활용한 것으로 알고 있어요)🔥 어떻게 해결했나요 ?
TemplateMapper
에서ReviewGroup
을 알지 못합니다.List<SectionResponse>
를 캐싱하면 [BE] fix: 잘못된 캐시 키 정정 #1003 도 어느정도 해결될 것으로 보입니다.📝 어떤 부분에 집중해서 리뷰해야 할까요?
📚 참고 자료, 할 말