inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

제미니의 개발실무 - 커머스 백엔드 기본편

상품 상세 - 코드 느끼기

"응집도를 높이기 위해 Product 객체는 Review 객체를 의존 하지 않는다" 에서 질문이 있습니다.

해결된 질문

184

리나

작성한 질문수 77

2

image.png

 

 

말씀해주신 부분에서 Product 객체 응집도를 높이기 위해 서로 Review 객체를 모르는 것이 좋다고 말씀 해주셨는데요.

 

그럼 코드 내용을 보면 Controller 객체에 Product 객체 하고 Review 객체를 알고 있다는 것 인데요.

만약 요구 사항이 Product 데이터 하고 Review 데이터를 가공해서 계산된 데이터를 Client 에게 내려줘야 하는 상황이 있다고 가정 하겠습니다.

 

그럼 Controller 객체에는 Product 데이터 하고 Review 데이터를 가공해서 계산 하는 비지니스 로직이 분명 있을 것 같습니다.

 

이것을 Controller 객체에 비지니스 로직이 있으면 Controller 에 대한 역할이 더 분담 되는 것 같아서요.

 

그래서 제가 생각 한 것은 ProductReview 객체를 만들어서 (어떻게 보면 퍼사드 패턴 이겠네요...)

ProductReview 객체가 Product 하고 Review 객체를 알고 Product 하고 Review 객체는 서로 모르는 것이 좋지 않을까 생각 됩니다.

 

이 방법은 어떻게 생각하시는 궁금 합니다.

 

굳이 Product 하고 Review 로 대표적으로 설명 해주셨는데 보통 실전에서는 이와 같은 비슷한 상황이 많이 발생 될 것 같습니다.

 

 

 

 

kotlin spring-boot 도메인 dbms/rdbms backend

답변 1

3

제미니

안녕하세요 리나님 알찬 질문 감사드립니다!
해당 상황에서 적어주신 ProductReviewService 를 만드는 것도 유효한 전략 중 하나입니다

다만, 제 경우 일반적으로 먼저 접근하는 전략을 말씀드리면
ProductReviewService로 접근하는 것 보다 ReviewService 를 활용하는 전략을 먼저 검토할 것 같습니다

당연히 Review 와 Product 서로 모르는 구조를 유지하는 것이 좋으나
요구사항에 따라 조합에 대한 니즈가 생긴다면 이를 그대로 투영 할 수 있는지 검토하는게 선행 되는게 맞는 것 같습니다

추후에 SellerReviewService, BarndReviewService 이런 식으로 계속 확장 되는 것이 자연스러울 수 있으나 로직이 파편화 되는 문제가 있을 수 있습니다

그래서 현재 상황(어떤 데이터 가공인지는 명확하지 않으나 일반적으로)에서는 일단은 ReviewService 에서 findReviewsForProduct 라던가 적절한 함수로 기능을 제공해보는게 선행되면 좋을 것 같습니다
(일단은 현실적인 요구사항을 투영해 작은 방식으로 문제를 해결해보는거죠)

사실 엄밀히 말하면 Review 는 Product 를 완벽히 모르고 있는 것은 아닙니다 (Type, Id 연결 범용화 되어있을 뿐)
반대로 Product는 Review 를 진짜 모르는 상태죠

그렇기 때문에 요구사항에 따라 적절한 기능을 ReviewService에서 먼저 제공해보고 개념적으로도 Review -> Product 가 격벽을 넘어 참조한다고 정의하는 방향도 좋을 것 같습니다 🙂


느낌이 잘 전달됐을지 모르겠네요! 이해안가시는 부분이 있다면 추가 질문 부탁드립니다! 감사합니다!

완강까지 잘 부탁드리고 수강평도 기대하겠습니다!

궁금한점이 여러개 생겼습니다.

1

36

1

다양한 관점의 코드 경험을 위해 개선하지 않은 코드

1

54

1

histories() 응답에 PointHistory.id를 포함한 이유가 궁금합니다/

1

44

2

SettlementTargetRepository Jquery 질문

1

48

2

부가 기능을 이벤트 핸들러로 분리하는 기준이 있을까요?

1

60

2

엔티티의 pk 를 0으로 초기화하시는 이유가 있을까요??

1

67

2

제미니님 안녕하세요!

1

77

2

개념 간 격벽 분리와 목록 조회 시 발생하는 참조 구조

1

85

2

프로덕트와 프로덕트카테고리 사이의 삭제 정책

1

76

2

새로 개발한다면 구현 순서

1

136

1

의존 방향에 대한 고민

1

125

2

어드민(Back-office)에서 예약 변경 시, '할인 조건 재검증(쿠폰 회수)' vs '기존 혜택 유지' 중 어떤 정책이 일반적인가요?

1

98

2

OrderKeyGenerator 인스턴스화 generate() 질문

1

84

1

외부 API 통합 시 데이터 제어 범위 설계 질문

1

98

1

PG 결제 승인 로직

1

130

2

QnA에서 Join 필드 표현법

1

90

1

결제서비스 콜백 동시성문제 가능성

1

110

2

굿

1

109

1

도메인/엔티티 분리 상황에서 쓰기 작업 하는 방법

1

137

2

도메인 객체와 엔티티 객체 사용

1

139

2

CouponService 의존성 의문

1

98

2

상품 목록 조회 고도화 질문

1

112

2

표현 계층에서의 접근 지점이 다양해지는것과 이를 해결하기 위한 파사드의 도입에 대해 제미니님의 생각이 궁금합니다.

1

123

2

제품상세 코드 느끼기

1

144

2