ReviewPolicyValidator와 ReviewManger내의 if문
26
작성한 질문수 1
안녕하세요! 최근에 강의를 듣는중 궁금정이 있어 질문을 드리게되었습니다.
다름이 아니라 ReviewPolicyValidator가 있는데, ReviewManager의 update내부에서
// 기존 리뷰 이미지 불러오기
val existingImages = reviewImageRepository.findByReviewIdAndStatus(reviewId, EntityStatus.ACTIVE)
// 지정된 이미지 삭제
if (imageHandle.hasImagesToDelete()) {
existingImages.filter { it.id in imageHandle.deleteImageIds }
.forEach { it.delete() }
}
// 기존에 이미지가 있었는데 삭제 후 남은 이미지도 없고 새로운 이미지도 없으면 에러
if (existingImages.size > 0 && existingImages.count { it.isActive() } <= 0 && imageHandle.hasImagesToAdd() == false) {
throw CoreException(ErrorType.REVIEW_CANNOT_DELETE_ALL_IMAGES)
}요런식의 예외처리가 있더라고요, 제가 생각하기에는 이것또한 하나의 정책의 범주에 들어간다고 생각되는데,
해당 부분이 PolicyValidator가 아닌 Manager에 남게된 이유가 무엇일까요?
개인적인 생각으로는 delete처리가 들어가기전에 filtering으로도 충분히 알 수 있을것 같은데 filter 연산을 한 번 더 해야되는것 때문에 그런가 싶기도하고...
ReviewPolicy이지 ReviewImagePolicy가 아니여서 그런가? 싶기도 하고...
혼자서는 도저히 결론을 내지 못하겠어서 도움을 청하게 되었습니다 ㅠㅠ
늘 좋은 강의 정말 감사드리고, 추석 잘 보내세요!
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 이준규님!
질문하신 ReviewManager.update() 내부의 이미지 삭제 검증은 정책에 해당할 수 있지만, 반드시 ReviewPolicyValidator에서 처리해야 하는 것은 아닙니다.
일반적으로 ReviewPolicyValidator는 여러 도메인 객체나 외부 데이터를 조회해야 하는 독립적이고 복합적인 정책 검증을 담당합니다. 반면 해당 if문은 ReviewManager.update() 과정에서 이미 계산된 existingImages, imageHandle을 바탕으로 리뷰 이미지 변경 작업의 최종 상태를 검증하는 로직입니다.
즉, 다음과 같이 책임을 나눌 수 있습니다.
ReviewPolicyValidator: 리뷰 작성·수정 가능 여부, 주문 상품이나 작성자 등 외부 데이터가 필요한 정책 검증
ReviewManager: 이미지 추가·삭제라는 변경 작업을 조합하고, 변경 결과가 유효한지 확인하는 검증
따라서 이 로직을 ReviewPolicyValidator로 옮길 수도 있지만, 그러려면 Validator가 이미지 변경 전후 상태나 imageHandle 같은 정보를 인자로 받아야 합니다. 현재 구조에서는 이미지 변경 흐름을 가장 잘 알고 있는 ReviewManager에 두는 편이 응집도 측면에서 자연스러울 수 있습니다.
검증 로직을 어디에 둘지에 대한 유사한 논의는 아래 질문을 참고해 보시면 좋습니다.
개념을 나타내는 객체 내에 로직이 들어있는 것은 좋지 않을까요?
검증 대상이 객체 자체의 상태인지, 여러 객체나 외부 데이터까지 필요한 복합 정책인지에 따라 책임을 나누는 관점을 설명하고 있습니다.데이터 검증 로직 책임에 대한 질문이 있습니다.
요청 검증과 개념 객체·비즈니스 로직 검증을 어떤 기준으로 분리할지에 대한 답변을 참고할 수 있습니다.
결론적으로 해당 if문도 넓은 의미에서는 정책이지만, 정책이라는 이유만으로 항상 PolicyValidator로 분리해야 하는 것은 아닙니다. 이미지 변경 과정 자체에 밀접하게 결합되어 있고 Manager가 이미 필요한 정보를 가지고 있다면 Manager에 두는 것이 타당합니다. 반대로 여러 곳에서 재사용되거나 독립적인 정책으로 커진다면 ReviewPolicyValidator의 메서드로 추출하는 것을 고려할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아니 이거 갑자기 데이터베이스가 사라졌어요
0
13
0
기타 영역 중 언두로그
0
17
0
실전튜닝 4 질문 - group by 순서와 index 순서
0
43
1
가중이동평균매출 lag함수 활용
0
65
2
'Canvas 설정과 배경 설정’ 부분에 대해 질문드립니다.
1
54
1
DB 쿼리 최적화 시 DB 처리와 애플리케이션 처리의 기준이 궁금합니다
0
54
1
ProductController 에서 타협하지 않는다면 어떤 형태가 되나요?
1
58
2
접근 가능한 카트 목록을 조회하는 API는 없는걸까요?
1
85
2
Sequence 관련 질문
1
114
2
Image Only Query
1
94
2
ProductOption을 통한 FindProductOption에 관한 질문
1
97
2
상수에 관련해서 질문있습니다.
1
103
2
null 을 많이 허용하지 않는 이유
1
117
1
JetBrains All Products Pack 3개월 이용권 신청 관련 문의
1
176
2
소스코드 보안
1
305
2
AI 사용 방법에 대하여...
1
164
2
PaymentValidator와 PaymentProcessor에서 주문과 결제를 중복 조회하는 구조에 대한 질문이 있습니다 !
1
125
3
결제 개념 컴포넌트 분리 기준과 네이밍 전략에 대한 질문있습니다 !
1
141
3
AI 를 적용시 브랜치를 다루는 팁 같은게 있을까요?
1
184
2
사용자가 상품을 선택하고 쿠폰을 고를 때 가장 혜택이 큰 쿠폰을 고르는 상황
1
164
2
장바구니 아이템 가격 기준?
1
164
2
인텔리제이에서 legacy 프로젝트 그레이들 인식 불가
1
237
4
예약 변경 시 '과거 정책 기준 재계산' 요구사항에 따른 스냅샷 데이터 구조 설계 고민
1
181
2
선생님
1
218
1





