MSA 프로젝트 소프트웨어 아키텍처

배지원·2024년 5월 13일

MSA

목록 보기
4/12

1. MSA에서의 소프트웨어 아키텍처

MSA에서는 유연성, 확장성, 낮은 응집도/결합도 등 MSA만의 특성이 각 Micro Service안에서도 필요하다. 그 이유로는

(1) 당장 요청에 대한 완료 응답을 필요는 없지만, 높은 성능을 요구하는 작업

  • 대규모 Command 작업을 수행하는 Cron Job

(2) 당장 응답해야만 하지만, 적은 성능을 요구하는 작업

  • 일반적인 조회-Query 서비스

(3) 호출하던 외부 서비스의 스펙이 변경되는 경우

  • Request / Response Params가 변동 되었고, 영향도 없이 빠르게 적용이 필요한 경우
  • 성능이 조정되어, 최적의 Connection Pool 갯수 혹은 timeout수치가 변경되는 경우

(4) 통신 방식이 변경되는 경우

  • Sync 방식에서 Async 방식으로 변경되어 비동기 CallBack방식으로 같은 로직을 처리할 경우


2. 대표적인 2개의 소프트웨어 아키텍처

(1) Layered Architecture(계층화 아키텍처)

많이 사용하고 있는 아키텍처로 여러개의 계층으로 나누어 각 계층에서 하는 일을 한정시켜 계층별로 독립적으로 개발, 배포, 확장이 가능합니다.
Presentation / Application / Domain / Infra Layer 등으로 이루어져 있습니다.
각 계층 내에서는 코드 수정과 유지보수 등이 비교적 쉽습니다. 또한 계층 간 접근이 자유롭습니다.

  • 1DB로 인한 각 계층의 역할, 목적과 계층 간 의존성 구분이 희미해짐
    • 그러나, 각 계층 내에서는 비교적 유연한 대처 가능
  • 하지만 처음 개발 이후, 큰 비즈니스 로직의 변화가 존재하지 않는다면 오히려 안정적임
  • 비교적 자유로운 접근 방향성으로 인한 빠른 개발, 코드의 재사용 그리고 편한 테스팅 가능

즉, 계층화 아키텍처는 모놀리스 구조와 계층별로 구분된 일반적인 프로젝트 조직구조에 최적화합니다.

(2) Hexagonal Architecture(헥사고날 아키텍처)

각 계층에서 하던 일들을 "내부와 외부"라는 개념으로 나누어 각각에 맞는 별도의 인터페이스를 정의합니다.
"내부"의 로직은 오직 "외부" 인터페이스를 통해서만 접근이 가능합니다.
모든 비즈니스 로직은, 오직 외부에서 내부 방향으로만 호출이 가능하고 경계 간 이동이 제한되어 있습니다.

  • 모든 외부 시스템과의 직접적인 상호작용은 "어댑터"의 역할
  • 각 서비스에서 비즈니스 로직에 맞게 정의된 인터페이스는 "포트"
  • 즉, 외부 서비스와의 상호 작용(어댑터)는 비즈니스 로직과의 작업을 정의한 인터페이스(포트)랑만 서로 통신

모든 비즈니스 로직은, 오직 외부에서 내부 방향 / 내부에서 외부 방향으로만 호출이 가능합니다.

  • 인바운드 어댑터 -> 인바운드 포트 -> 비즈니스 로직
  • 비즈니스 로직 -> 아웃바운드 포트 -> 아웃바운드 어댑터

어댑터(Adapter)

서비스의 입장에서 이 서비스가 사용하는 외부 시스템과의 직접적인 구현 및 상호작용을 처리

  • 외부 시스템(UI) 으로부터 들어온 Request가 가장 처음 만나는 Controller는 "인바운드 어댑터"
  • 메세지 브로커(Kafka)로부터 Consume하는 동작을 처리하는 로직 핸들러는 "인바운드 어댑터"
  • DB(MySQL,...)에 직접적으로 접근하여 다양한 작업(CRUD)를 처리하기 위한 DAO는 "아웃바운드 어댑터"

포트(Port)

비즈니스 로직 입장에서 어댑터와 통신하기 위한 동작을 정의한 인터페이스

  • Controller로부터 들어온 요청으로부터 특정 비즈니스 로직을 수행하기 위한 동작을 정의한 인터페이스
  • Consume한 메세지를 처리하기 위한 비즈니스 로직의 동작을 정의한 인터페이스
    -> "인바운드 포트"



MSA(Microservices Architecture)에서는 전통적인 계층화(layered) 아키텍처보다는 유연하고 확장 가능한 구조를 선호하는 경향이 있습니다. 따라서 hexagonal 아키텍처와 같은 특정한 아키텍처 스타일을 채택하는 경우가 많습니다. 또한 hexagonal 아키텍처와 같은 유형의 아키텍처를 통해 각 마이크로서비스의 독립성과 유연성을 강화하고, 외부와의 인터페이스를 명확히 구분함으로써 유지보수성을 향상시키는 데 주안점을 두는 추세가 있습니다.

profile
Web Developer

0개의 댓글