Backend

모놀리와 MSA의 차이점

niahh 2025. 5. 11. 18:06

모놀리 아키텍처란 (Monolith Architecture)?

모놀리(Monolith) 구조는 애플리케이션의 모든 기능이 하나의 통합된 코드베이스에서 실행되는 방식이다. 일반적으로 하나의 프로젝트 안에 사용자 인터페이스, 비즈니스 로직, 데이터 접근 로직이 모두 포함되어 있으며, 하나의 프로세스로 실행되고 하나의 서버에 배포된다. 

MSA란 (Microservices Architecture)?

MSA(Microservices Architecture)는 애플리케이션을 작고 독립적인 서비스들의 집합으로 분리한 아키텍처다. 각 서비스는 하나의 명확한 책임만 가지고 독립적으로 개발, 배포, 확장, 유지보수가 가능하다. 서비스 간에는 보통 HTTP API나 메시지 브로커를 통해 통신한다. 기술 스택도 서비스별로 다르게 선택할 수 있다.


코드 베이스란?

 

하나의 프로젝트 또는 애플리케이션을 구성하는 모든 소스 코드 파일의 집합이다.

 

예를 들어, 모놀리 아키텍처에서는 사용자 관리, 결제 기능, 상품 관리 등 모든 기능을 하나의 프로젝트 폴더 안에서 구현한다. 이 폴더 안에는 Java 파일, HTML, CSS, JavaScript, 설정 파일, 테스트 코드 등 모든 코드가 함께 있다.

 

하나의 코드베이스 = 하나의 프로젝트 구조 = 하나의 배포 단위

 

반대로 MSA에서는 각 기능마다 별도의 코드베이스가 존재한다.
예를 들어,

  • user-service 폴더 (사용자 관리만 담당)
  • payment-service 폴더 (결제 기능만 담당)
  • product-service 폴더 (상품 관리 전용)

이렇게 서비스마다 독립된 폴더와 코드 구조를 가지고, 각기 다른 Git 리포지토리로 관리될 수도 있다.


모놀리 아키텍처의 코드베이스 구조 (Spring 기반)

  • 모놀리는 하나의 코드베이스와 프로세스로 구성된다.
shop-monolith/
├── src/
│   ├── main/
│   │   ├── java/com/example/shop/
│   │   │   ├── controller/
│   │   │   │   ├── UserController.java
│   │   │   │   ├── ProductController.java
│   │   │   │   └── OrderController.java
│   │   │   ├── service/
│   │   │   │   ├── UserService.java
│   │   │   │   ├── ProductService.java
│   │   │   │   └── OrderService.java
│   │   │   ├── repository/
│   │   │   │   ├── UserRepository.java
│   │   │   │   ├── ProductRepository.java
│   │   │   │   └── OrderRepository.java
│   │   │   └── domain/
│   │   │       ├── User.java
│   │   │       ├── Product.java
│   │   │       └── Order.java
│   └── resources/
│       └── application.properties
└── build.gradle (또는 pom.xml)

MSA 아키텍처의 코드베이스 구조 (Spring 기반)

  • MSA는 각 기능을 별도의 마이크로서비스로 나누어 독립적으로 실행된다.
shop-microservices/
├── user-service/
│   ├── src/main/java/com/example/user/
│   │   ├── controller/UserController.java
│   │   ├── service/UserService.java
│   │   ├── repository/UserRepository.java
│   │   └── domain/User.java
│   └── resources/application.yml
│
├── product-service/
│   ├── src/main/java/com/example/product/
│   │   ├── controller/ProductController.java
│   │   ├── service/ProductService.java
│   │   ├── repository/ProductRepository.java
│   │   └── domain/Product.java
│   └── resources/application.yml
│
├── order-service/
│   ├── src/main/java/com/example/order/
│   │   ├── controller/OrderController.java
│   │   ├── service/OrderService.java
│   │   ├── repository/OrderRepository.java
│   │   └── domain/Order.java
│   └── resources/application.yml
│
└── gateway-service/ (API Gateway)
    └── src/main/java/com/example/gateway/
        └── GatewayApplication.java

배포 방식

  • 모놀리는 전체 애플리케이션을 한 번에 빌드하고 배포한다. 전체 코드베이스가 하나로 묶여있기 때문에 전체 애플리케이션을 다시 빌드하고 배포해야한다. 그동안 시스템은 전체 재시작이 필요할 수 있다.
  • MSA는 서비스 단위로 선택적으로 배포할 수 있다. 기능을 수정, 추가한 뒤 바로 운영 서버에 배포하고 사용자에게 반영할 수 있어 빠른 배포 주기를 가진다.

유지보수와 개발 편의성

  • 모놀리는 전체 코드를 한 눈에 보기 쉽고 IDE 지원이 강력하다. 그러나 규모가 커지면 유지보수가 어렵고 코드 충돌이 잦아진다.
  • MSA는 각 서비스가 작고 책임이 명확하여 팀 단위 개발과 유지보수가 수월하다. 다만 초기 구성과 서비스 간 통신, 모니터링 등의 복잡성이 있다.

확장성

  • 모놀리는 트래픽이 증가하면 전체 시스템을 확장해야 한다.
  • MSA는 특정 서비스만 선택적으로 확장할 수 있어 자원 효율이 높다.

장애 대응

  • 모놀리는 하나의 기능에서 오류가 발생하면 전체 서비스에 영향을 줄 수 있다.
  • MSA는 각 서비스가 분리되어 있기 때문에, 장애가 전체 시스템에 영향을 주지 않고 특정 서비스에만 영향을 미친다. 하지만 네트워크 지연이나 통신 실패에 대한 대응은 필요하다.

기술 선택

  • 모놀리는 한 가지 기술 스택으로 통일되어 있어 일관성 있는 개발이 가능하다.
  • MSA는 각 서비스별로 기술 스택을 자유롭게 선택할 수 있어, 도메인에 맞는 최적의 기술을 적용할 수 있다.

선택 기준

  • 작은 팀이나 단순한 서비스는 모놀리가 적합하다.
  • 대규모 서비스, 빠른 배포 주기, 독립적 확장이 필요한 경우는 MSA가 유리하다.