학습한 내용을 실습하기 위해, 이커머스 애플리케이션을 주제로 토이 프로젝트를 진행하고 적용 가능한 이슈를 팀원과 함께 만들어 해결하고 있습니다.
- Spring 기반 백엔드 개발
- 개발자가 반드시 정복해야할 객체지향과 디자인 패턴 도서 학습하여 적용
- 스프링과 JPA 강의를 학습하며 익힌 내용 적용
- DDD 기반 리팩토링
- DDD 시작하기 도서를 참고하여 도메인 주도 설계 중 일부 적용
- 구현의 편의성을 위해서 @Entity와 JPA 연관 관계를 통해서 어그리거트 구현
- 각 컨텍스트별로 모델 분리. 현재는 member, order, product 컨텍스트를 유지중
- 모듈 분리 계획
order서비스 분리를 준비 중 (HTTP 호출과 카프카를 활용한 비동기 호출도 사용할 예정)
각각의 하위 도메인마다 컨텍스트 패키지를 만들었습니다.
컨텍스트마다 반복되는 패키지 구조를 그림으로 나타냈습니다.

-
UI Layer
- 사용자가 시스템에 어떻게 접근하고 데이터를 주고받는지 담당
- Controller, DTO, 단순 Validation 등 API/화면 입출력 처리
-
Application Layer
- 도메인을 어떤 흐름으로 사용할지 정의하는 유스케이스 계층
- 트랜잭션 경계 설정, 도메인 객체 조합 및 orchestration
-
Domain Layer
- 비즈니스 규칙의 핵심 (Entity, Value Object, Domain Service, Aggregate)
- 기술 의존 최소화, 순수한 자바 기반 구현 (구현의 편의성으로 jpa 관련 코드는 약간 허용)
-
Infra Layer
- DB 접근, 메시지 브로커, 외부 API 등 기술 요소 구현
- 기술 변경이 이 레이어에 집중되도록 분리
-
DAO Layer (Query/Read Model)
- 도메인 규칙이 거의 필요 없는 조회 전용 계층
- 화면/리스트/검색 등 UI 요구에 맞춘 데이터 조회
- Domain/Application을 통과하지 않고 UI → DAO → Infra 구조로 처리
- command 기능의 경우, 어그리거트 단위로 관리하므로 JPA의 엔티티와 연관관계 기능을 활용하여 만든다.
- 라이프사이클이 같은 엔티티끼리는 묶는다.
- 예를들어, 상품과 상품 태그는 하나의 어그리거트로 묶고 상품과 상품 리뷰는 다른 어그리거트이다.
- query 기능의 경우, 화면에 뿌려줄 데이터를 가져오는 기능들을 말한다.
- 인터페이스를 놓고 구현체들은 JPA, Mybatis, JdbcTemplate 등 해당 기능을 구현하는데 쉬운 방법을 사용할 것이다.
- 스프링 카프카를 활용하여 브로커와 통신
- 아웃박스 패턴과 멱등 컨슈머를 활용함
- 단일 서버임으로 session 사용하였음. 추후 서비스 분리를 위해서 self-contained token 인증 방식으로 바꿈
- 인증이 필요한 컨트롤러 호출의 경우, 인터셉터에서 토큰을 검증한다.
- 도커 컴포즈를 활용하여 로컬 테스트시 필요한 인프라 기동할 수 있게 만듬
- Mysql
- Prometheus, Grafana
- Kafka, Kafka-ui
테스트 및 로컬 개발 환경에서 docker-compose를 활용해 MySQL 등 의존 서비스를 자동으로 실행합니다. 또한, GitHub Actions를 사용한 CI 파이프라인이 설정되어 있습니다.
spring-boot-docker-compose의존성 추가
→ 테스트 또는 로컬 실행 시docker-compose.yml에 정의된 의존 컨테이너(MySQL 등)가 자동 실행됩니다.
- 클래스와 메서드 단위로 단위 테스트(Unit Test) 작성
- 외부 인프라와의 연동을 검증하는 통합 테스트(Integration Test) 작성
현재는 회원, 주문, 상품 컨텍스트를 유지중