s-market 프로젝트 구조에 대해서 소개합니다.
전반적인 프로젝트 구조는 도메인 중심 설계(Domain Driven Design)와 레이어드 아키텍처를 기반으로 구성했습니다.
도메인 중심 설계를 선택한 이유는, 프로젝트 초기부터 비즈니스 중심의 코드 구조를 지향하고, 변화에 유연하게 대응할 수 있는 기반을 마련하기 위해서입니다.
핵심 도메인 로직은 domain 계층에 집중시키고, DB 접근, 인증, 메시지 처리 등 기술적인 요소는 infrastructure로 분리하여 관심사의 분리와 계층 간 역할을 명확히 하고자 합니다.
또한, 도메인 모델을 VO, Entity, DTO로 구분하고, 비즈니스 유스케이스는 application 계층에서만 다루도록 구성함으로써, 기술 구현과 도메인 로직이 서로 얽히지 않도록 구조적인 설계 방향을 설정했습니다.
패키지 구조
해당 패키지는 User 모듈을 기준으로 설명합니다.
📁 application
| 역할: 유스케이스(비즈니스 동작 단위)를 처리하는 계층
| 외부 요청에 따라 어떤 동작을 수행할지 정의
| 도메인 계층과 프레젠테이션 계층 사이의 조정자 역할
| 서비스 로직은 여기에서 수행하고, 도메인은 순수하게 유지
📁 presentation
| 역할: HTTP 요청/응답 처리, 외부와의 인터페이스
| REST API 진입 지점 역할
| application 계층만 호출하여 비즈니스 로직은 절대 직접 실행하지 않도록 분리
| Controller는 단순히 요청을 받고 응답을 반환하는 역할
📁 domain
|⎯ 📁 entity
| 역할: 핵심 비즈니스 모델
| DB 매핑과 도메인 로직을 함께 포함 (JPA Entity)
| 시스템의 중심이 되는 개념인 User의 상태와 행동 정의
|⎯ 📁 vo
| 역할: 값 객체 (Value Object)
| 상태 정보에 불변성을 부여하고 의미를 명확히 표현
| 단순한 Enum도 VO의 역할을 한다면 domain.vo로 분리
|⎯ 📁 dto
| 역할: 내부 전용 데이터 전달 객체
| 요청및 응답데이터를 표현하는 전용 객체
| 도메인 모델을 직접 노출하지 않기 위한 보호 역할
📁 infrastructure
|⎯ 📁repository
| 역할: 데이터 영속성 계층
| JPA 기반 DB 접근 기능 분리
| 기술 의존성을 가진 구현은 모두 infrastructure에 두어 도메인과 분리
📁 config
| 역할: Spring 설정 클래스들
| 프로젝트 전반의 전역 설정 담당
📁 exception
| 역할: 프로젝트에서 사용하는 커스텀 예외 정의
| 도메인 또는 애플리케이션 로직에서 발생하는 예외를 명확히 구분
| 공통 예외 처리 및 글로벌 핸들러와 연계 가능
'Project' 카테고리의 다른 글
[s-market] Kafka Consumer Redis 복구방식 개선 (0) | 2025.04.29 |
---|---|
[s-market] Redis 이벤트성 상품 재고 차감 전략 (0) | 2025.04.29 |
[s-market] Consumer 재시도 전략 (0) | 2025.04.28 |
[s-market] 상품과 재고처리 시나리오 계획 (0) | 2025.04.28 |
[s-market] ERD 설계 개선하기 (0) | 2025.03.25 |