- 친구가 원하는 비즈니스 요구사항을 정확하게 처리하기 위해 도메인 주도 설계를 적용했어요.
- 요구사항에 대해 명확하게 이해할 수 있었고, 도메인 모델을 통해 비즈니스 로직을 구현하는 데 도움이 되었어요.
- 결제 및 배송 외부 모듈이 아직 결정되지 않아, 추후에 모듈을 쉽게 추가하거나 교체할 수 있도록 헥사고날 아키텍처를 채택했어요.
- 헥사고날 아키텍처를 활용함으로써 핵심 비즈니스 로직을 외부 종속성으로부터 분리하여 시스템의 유연성과 유지보수성을 높이려 했어요.
-
MSA를 경험해 보기 위해 애플리케이션을 멀티 모듈 방식으로 분리했어요.
-
이를 통해 Spring + Kotlin 서비스도 경험해 볼 수 있었어요.
-
완벽한 MSA는 아니지만 서비스 간 결합도를 낮춰 서비스의 확장성을 높이려 했어요.
-
멀티 모듈의 장점을 살려 Gradle 명령어로 Docker 이미지 빌드와 푸시를 쉽게 할 수 있도록 구성했어요.
- 비동기 처리가 가능한 부분은 Kafka를 이용하여 응답 속도를 높이고 시스템의 성능을 향상 시키려 노력했어요.
- 또한, 서비스 간 결합도를 낮추어 서비스의 확장성을 높이려 했어요.
- Kubernetes를 사용하여 컨테이너 오케스트레이션을 관리하고,
- Helm을 사용하여 Kubernetes 리소스를 편리하게 관리 했어요.
- 이를 통해 배포와 확장이 쉽고 효율적으로 이루어질 수 있었어요.
- 테스트 자동화와 Docker 이미지 빌드를 쉽게 할 수 있도록 Makefile을 구현했어요.
- Github Actions를 이용해서 민감한 정보는 환경변수로 관리하고, Makefile에 환경변수를 넘겨주어 사용할 수 있게 구성했어요.
- Spring API Gateway를 이용하여 인증이 필요한 API와 인증이 필요 없는 API를 구분 했어요.
- 인증이 필요한 API는 JWT를 이용하여 안전하고 상태 없는 인증을 처리했어요.
request Header
- Api-Type : no-auth
request Header
- Authorization : Bearer ${accessToken}
- 프로젝트는 기본적으로 헥사고날 아키텍처를 기반으로 구성되어 있어요.
adapter
에서는 외부, 내부에서 사용되는 api를 패키지 단위로 분리했어요.domain
에는 JPA 관련 코드도 adapter로 분리하여 최대한 도메인 로직에 집중할 수 있도록 구성했어요.
.
├── adapter
│ ├── in
│ │ └── web
│ │ ├── dto
│ │ │ ├── request
│ │ │ └── response
│ │ ├── external
│ │ └── internal
│ └── out
│ ├── kafka
│ └── persistence
│ └── jpa
│ └── service
│ └── product
├── application
│ └── port
│ ├── in
│ ├── out
│ └── service
├── config
└── domain