[ 3주차 과제 ] 이커머스 Clean + Layered Architecture 설계

2025. 4. 5. 18:55향해99 8기

Jpa을 잘 모르는 입장에서는 쉽지 않았다...

Layered Architecture 설계에 맞게 구성이 되었는지 각 레이어별로 dto 생성를 어떻게 하는지 고민을 많이한 3주차

 

1. interface : Request, Response

interfaces/ 컨트롤러

 

2. application = Criteria, Result : 파사드(상위 모듈) - 비즈니스 유즈케이스

application/ 서비스의 파사드 역할을 하겠다 

 

3. domain = Command, Domain(DomainInfo) : 서비스(하위 모듈) - 단위 기능

domain/ 도메인 서비스와 도메인 객체를 넣겠다

 

4. infra = XXX, Domain

infra/

 

각 레이어를 구분하고 DIP를 적용하여, 상위 모듈이 하위 모듈을 의존하지 않도록 추상화

 

 

domain.toEnitiy() -> entity
DIP를 했기 때문에 
어플리케이션 -> 도메인 계층 <- 인프라 계층

import infrastructure.entity
    class Domain {
    toEntity() {
    	return new Entity (this);
    }
}

 

com.ecommerce
│
├── interface                     // Interface Layer (Request, Response)
│   ├── point
│   │   ├── PointController.java    // 포인트 관련 API 처리
│   │   ├── PointRequest.java      // 포인트 충전 요청 데이터 (Request DTO)
│   │   └── PointResponse.java     // 포인트 충전 응답 데이터 (Response DTO)
│
├── application                   // Application Layer (Command, Result)
│   ├── point
│   │   ├── facade                 // 파사드: 여러 서비스 조합
│   │   │   ├── PointFacade.java   // 포인트 관련 서비스 조합
│   │   │   ├── PointCriteria.java  // 포인트 충전 조건 (Criteria)
│   │   │   └── PointResult.java  // 포인트 충전 리절트 (Result)
│
├── domain                        // Domain Layer (Command, Domain)
│   ├── model                     // 도메인 모델 (JPA 엔티티)
│   │   ├── Point.java             // 포인트 엔티티
│   │   └── PointHistory.java      // 포인트 이력 엔티티
│   └── service                   // 도메인 서비스 (비즈니스 로직)
│       └── PointService.java      // 포인트 관련 비즈니스 로직 처리
│
└── infra                         // Infra Layer (JPA, 외부 시스템, 외부 API)
    ├── repository                // JPA 레파지스토리 (DB와 상호작용)
    │   ├── PointRepository.java  // 포인트 엔티티 관련 레파지스토리
    │   └── PointHistoryRepository.java // 포인트 이력 레파지스토리
    └── external                   // 외부 시스템과의 연동
        └── ExternalPaymentGatewayAdapter.java  // 외부 결제 시스템 연동