- 하나의 애플리케이션(프로젝트) 안을 여러 모듈로 나누어 관리하는 방식.
- 보통 Gradle, Maven 같은 빌드 툴에서 모듈을 정의해서 공통 코드, 도메인별 코드 등을 분리함.
- 하나의 프로세스로 동작 → 배포 시에도 하나의 애플리케이션으로 패키징/배포
- 모듈 간 의존성을 빌드 툴로 관리 → 컴파일 타임에 강하게 결합
- 주로 코드 재사용과 관심사 분리가 목적
- CI/CD 파이프라인도 대부분 하나
ex :
core 모듈 → DTO, 유틸, 공통 로직
domain-user, domain-order 모듈 → 각 도메인별 비즈니스 로직
api 모듈 → Controller, REST API endpoint
하나로 빌드해서 app.jar 로 배포 => 모듈로만 나누어져 있고, 동일 JVM 내에 메서드 호출로 동작
Multi-Module-App/
├── common/ # 공통 DTO, 유틸
├── user/ # 사용자 도메인 (UserService, UserRepository)
├── order/ # 주문 도메인 (OrderService, OrderRepository)
└── api/ # Controller, REST API
- 애플리케이션을 완전히 독립적인 서비스 단위로 쪼개어 배포하는 아키텍처.
- 각 서비스가 독립된 프로세스로 동작 → 네트워크 통신(REST, gRPC, 메시지 큐 등)으로 연결
- 각각 별도 배포/스케일링 가능
- DB까지 분리하는 경우가 많음 (폴리글랏 퍼시스턴스)
- 팀별로 독립적으로 개발할 수 있음
- 장애 격리 가능 (특정 서비스가 죽어도 전체 서비스는 유지 가능)
- CI/CD 파이프라인도 서비스별로 따로 운영
ex :
user-service, order-service, payment-service → 각각 Spring Boot 애플리케이션
각자 따로 빌드 & 배포 → 컨테이너 기반(Kubernetes)으로 스케일링 가능
MSA-Architecture/
├── user-service/ # 사용자 서비스
└── order-service/ # 주문 서비스
@RestController
public class UserController {
@PostMapping("/users")
public UserDto createUser(@RequestParam String name) {
return new UserDto(1L, name);
}
}
@RestController
@RequiredArgsConstructor
public class OrderController {
private final RestTemplate restTemplate = new RestTemplate();
@PostMapping("/orders")
public String createOrder(@RequestParam String username) {
// user-service 호출
UserDto user = restTemplate.postForObject(
"http://localhost:8081/users?name=" + username,
null,
UserDto.class
);
return user.name() + "님의 주문 생성 완료";
}
}
➡️ 실행 순서
user-service (8081 포트) 실행
order-service (8082 포트) 실행
POST /orders?username=철수 요청 → order-service → 내부에서 user-service HTTP 호출 → 결과 조합
서비스별 별도 배포 & 실행
통신은 HTTP (네트워크)
user-service 만 따로 스케일링 가능
결론 : 멀티모듈은 코드 구조 정리를 주된 목적으로 / MSA는 배포 단위를 쪼개는 것을 목적으로 하는 아키텍처임. 따라서 멀티모듈은 하나의 AP이고, MSA는 여러개의 AP들이 모여서 동작하는 형태