[3주차] 도메인 주도 설계 구현 - 윤유탁#90
[3주차] 도메인 주도 설계 구현 - 윤유탁#90yoon-yoo-tak wants to merge 11 commits intoLoopers-dev-lab:yoon-yoo-takfrom
Conversation
- VO 도입
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Tip Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs). Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
📌 Summary
🧭 Context & Decision
문제 정의
선택지와 결정
1. Aggregate 내부
@OneToMany/@ManyToOne사용@OneToMany(cascade=ALL, orphanRemoval=true)가오히려 Aggregate의 불변식 보호에 유리하다고 판단했다. Aggregate 간(Order→User/Product, Cart→Product 등)은 ID만 보유하는 논리 연관을 유지한다.
2. Application Layer에서 도메인 엔티티를 직접 리턴하는 이유
애플리케이션 계층으로 침투하는 것을 방지하기 위한 의도적 설계다.
3. JPA 엔티티와 도메인 엔티티를 분리하지 않은 이유
*JpaEntity, Domain에 순수 도메인 객체를 두고 매핑 계층 추가오브젝트이면서 영속 객체이도록 설계된 것이다.
@Entity,@Column등)은 코드 동작을 변경하는 로직이 아니라 메타데이터 선언이다. JPA 의존성을 제거해도 도메인 로직 자체는 그대로 동작한다.🏗️ Design Overview
변경 범위
apps/commerce-api— User(리팩터링), Brand, Product, Like, Cart, Order주요 컴포넌트 책임
도메인 계층
Brand: 브랜드 엔티티.rename()으로 이름 변경Product: 상품 엔티티.Money/StockVO 활용. 재고 차감(deductStock), 좋아요 카운트 관리Like: 유저-상품 좋아요 관계 엔티티. 물리 삭제 방식Cart(Aggregate Root): 장바구니.CartItem라이프사이클 통제 (addItem,removeItem,updateItemQuantity,clear)Order(Aggregate Root): 주문.OrderItem라이프사이클 통제. 주문 시점 상품 스냅샷 보존.cancel()상태 전이*DomainService: 상태 없는 순수 클래스. 조회/저장 + 도메인 규칙 검증 (중복 체크, 존재 확인 등)OrderPolicy: 주문 내 중복 상품 검증 유틸리티애플리케이션 계층
*ApplicationService: 유스케이스 오케스트레이터.@Transactional경계 설정. 도메인 엔티티 리턴CreateOrderCommand,RegisterProductCommand등: 쓰기 유스케이스 입력 DTO인터페이스 계층
*V1Controller/Admin*V1Controller: REST API 엔드포인트. Response DTO의from()팩토리로 엔티티→응답 변환AuthUserArgumentResolver/AdminAuthInterceptor: 인증/인가 처리인프라 계층
*RepositoryImpl: 도메인 Repository 인터페이스 구현.*JpaRepository위임BcryptPasswordEncryptor:PasswordEncryptor인터페이스 구