팀프로젝트
MSA와 DDD 적용하여 프로젝트 구성하기 위한 이해 필요
KimMZ
2025. 3. 12. 22:49
먼저, 각 서비스와 모듈을 명확하게 분리하는 이유는?
1. 모듈화 및 분리의 원칙
- 비즈니스 도메인 분리하여 다른 서비스 간의 의존성을 최소화
2. 응집도 및 결합도
- 높은 응집도 : 각 서비스의 코드는 해당 도메인과 관련된 기능으로 응집되어 있고, 코드의 가독성 및 유지보수성이 향상됨
- 낮은 결합도 : 서비스 간의 의존성을 줄임으로써 변경이 필요할 때 다른 서비스에 미치는 영향을 최소화함
3. 독립적인 배포
- 각 서비스를 독립적으로 배포할 수 있음. 서비스의 개별적인 확장성 및 배포 주기를 가능하게 하고, 전체 시스템의 안정성을 높임.
4. 스케일링
- 각 서비스를 비즈니스 요구에 따라 개별적으로 스케일링 할 수 있음. 해당 서비스만 스케일 아웃하여 성능을 최적화할 수 있음.
5. 기술 스택의 유연성
- 각 서비스별 다른 기술 스택을 사용할 수 있음.
6. 테스트의 용이성
- 각 서비스가 독립적으로 구성되어 있어 각 서비스 단위로 테스트 진행 가능. 버그를 조기에 발견하고 수정하는데 도움이 됨.
7. 공통 모듈의 활용
- 공통 모듈을 통해 여러 서비스에서 재사용 가능한 코드(공통 DTO, 유틸리티 클래스 등)를 관리할 수 있음. 중복 코드를 줄이고 일관성을 유지 가능
8. 구성 관리
- config 서비스와 같이 별도의 서비스는 환경 설정을 중앙에서 관리할 수 있게 해줌. 모든 서비스가 동일한 설정을 공유하고, 설정 변경 시 일관성을 유지할 수 있음.
구조적 분리는 장기적으로 유지 보수성과 확장성을 높이고 팀의 생산성을 향상시키는데 기여할 수 있을 것이다.
project-root/
│── account-service/ # 사용자 계정 서비스 (Microservice)
│ ├── src/main/java/com/example/account/
│ │ ├── application/ # 응용 계층 (서비스, 유스케이스)
│ │ │ ├── service/ # 비즈니스 로직 (도메인 서비스)
│ │ │ ├── dto/ # 요청/응답 DTO
│ │ │ ├── exception/ # 예외 처리 클래스
│ │ ├── domain/ # 도메인 계층
│ │ │ ├── model/ # 핵심 도메인 엔티티, VO
│ │ │ ├── repository/ # 도메인 리포지토리 인터페이스
│ │ ├── infrastructure/ # 인프라 계층
│ │ │ ├── repository/ # 실제 데이터 저장소 (JPA, Redis 등 구현체)
│ │ │ ├── client/ # 외부 API 연동 (FeignClient 등)
│ │ │ ├── config/ # 설정 관련 클래스 (DB, Security 등)
│ │ ├── interface/ # 인터페이스 계층 (입출력)
│ │ │ ├── controller/ # REST 컨트롤러
│ │ │ ├── handler/ # 요청 예외 처리 핸들러
│ ├── src/test/java/com/example/account/ # 테스트 코드
│ ├── build.gradle # Gradle 설정 파일
│ ├── Dockerfile # Docker 빌드 파일
│ ├── application.yml # 서비스별 환경설정 파일
│
│── order-service/ # 주문 서비스 (Microservice)
│ ├── src/main/java/com/example/order/
│ │ ├── application/ # 응용 계층
│ │ ├── domain/ # 도메인 계층
│ │ ├── infrastructure/ # 인프라 계층
│ │ ├── interface/ # 인터페이스 계층
│ ├── src/test/java/com/example/order/
│ ├── build.gradle
│ ├── application.yml
│
│── common/ # 공통 모듈 (유틸, 공통 DTO 등)
│ ├── src/main/java/com/example/common/
│ │ ├── dto/ # 공통 DTO
│ │ ├── exception/ # 공통 예외 처리
│ │ ├── utils/ # 공통 유틸리티 클래스
│ ├── build.gradle
│
│── config-server/ # Spring Cloud Config Server (환경 설정 관리)
│ ├── src/main/java/com/example/configserver/
│ ├── application.yml
│
│── discovery-service/ # Eureka Service Discovery (서비스 검색)
│ ├── src/main/java/com/example/discovery/
│ ├── application.yml
│
│── gateway-service/ # API Gateway (Spring Cloud Gateway)
│ ├── src/main/java/com/example/gateway/
│ ├── application.yml
│
│── docker-compose.yml # Docker Compose 설정
│── README.md # 프로젝트 설명
│── .gitignore # Git Ignore 설정