책너두 (도메인 주도 설계로 시작하는 마이크로서비스 개발) 11일차 (~93p)

요약

  • 마이크로서비스의 애플리케이션 아키텍처의 나머지 부분에 대해 이해함.
    • 헥사고날 아키텍처와 클린 아키텍처
      • 레이어드 아키텍처
        • 소프트웨어의 구성요소를 기능별로 분리하고 계층화하여 결합도를 낮추고 응집도를 높이는 아키텍처임.
        • 주로 프레젠테이션 계층, 애플리케이션 계층, 도메인 계층, 인프라스트럭처 계층으로 구성되며, 각 계층은 상위 계층에서 하위 계층으로의 의존성을 갖는다.
      • 헥사고날 아키텍처
        • 내부 영역과 외부 영역으로 나뉨.
        • 내부 영역은 순수한 비즈니스 로직을 담당하며, 외부 영역은 인바운드 어댑터와 아웃바운드 어댑터로 구성됨.
      • 클린 아키텍처
        • 겹겹이 둘러싸인 영역으로 구성되며, 중앙에서부터 밖으로 엔티티, 유스케이스, 세부사항으로 구분됨.

메모

3.2 헥사고날 아키텍처와 클린 아키텍처

  • 이번 절에서는 전통적으로 가장 많이 사용되는 레이어드 아키텍처를 설명한다.
  • 그리고, 최근의 마이크로서비스 설계자들이 마이크로서비스의 내부 구조를 유연하게 구성하기 위해 적용하는 헥사고날 아키텍처와 클린 아키텍처를 살펴본다.

3.2.1 레이어드 아키텍처

  • 레이어드 아키텍처는 논리적인 개념으로, 물리적 서버 티어의 레이어를 프레젠테이션, 비즈니스 로직, 데이터 액세스의 3개의 논리적 계층으로 구분할 수 있음.
    • 이러한 계층은 복잡한 시스템을 분리할 때 사용되며, 각 계층은 다음과 같은 관심사를 가짐
      • 프레젠테이션 층: 화면 표현 및 전환 처리
      • 비즈니스 로직 층: 비즈니스 개념, 규칙, 흐름 제어
      • 데이터 액세스 층: 데이터 처리
  • 레이어드 아키텍처는 다음 규칙을 따라 레이어 간 응집성을 높이고 의존도를 낮춤
    • 상위 계층이 하위 계층을 호출하는 단방향성 유지
    • 상위 계층은 바로 밑의 근접 계층만 활용
    • 상위 계층이 하위 계층에 영향 받지 않게 구성
    • 하위 계층은 상위 계층을 알지 못하게 구성
    • 계층 간 호출은 인터페이스를 통해 이루어짐
  • 하지만 일반적인 레이어드 아키텍처에서는 객체지향 설계 원칙 중 의존성 역전 원칙(DIP)과 개방 폐쇄 원칙(OCP)이 적용되지 않을 수 있음.
    • 모든 계층이 각기 자신이 제공하는 기능에 대한 추상 인터페이스를 직접 정의하고 소유하고 있는 구조이기 때문임.
    • DIP를 제대로 적용하기 위해 데이터 액세스 계층에서 정의한 인터페이스를 비즈니스 로직 계층으로 옮겨, 고수준 영역이 저수준 영역의 변경에 영향을 받지 않도록 함.
    • 이를 통해 의존 관계를 역전시키고 고수준 영역을 보호함.

3.2.2 헥사고날 아키텍처

  • 위 그림은 헥사고날 아키텍처의 포트와 어댑터를 표현한 것임.
  • 헥사고날 아키텍처는 레이어드 아키텍처의 한계를 극복하기 위해 제안된 아키텍처로, 앨리스테어 콕번(Alistair Cockburn)이 제시함.
    • 이 아키텍처는 '포트 앤드 어댑터 아키텍처(ports and adapters architecture)'로도 불림.
    • 현대 애플리케이션은 다양한 인터페이스와 시스템, 저장소와 상호작용하며, 헥사고날 아키텍처는 이를 지원할 수 있음.
  • 헥사고날 아키텍처는 내부 영역외부 영역으로 나뉨.
    • 내부 영역
      • 순수한 비즈니스 로직을 표현하는 기술 독립적인 영역으로, 외부 영역과 연계되는 포트를 가짐.
    • 외부 영역
      • 요청을 처리하는 인바운드 어댑터와 외부와 연계되는 아웃바운드 어댑터로 구성됨.
  • 헥사고날 아키텍처의 핵심은 내부 영역이 외부의 구체 어댑터에 전혀 의존하지 않게 한다는 것임.
    • 이를 가능하게 하는 것이 포트임.
    • 포트는 인바운드/아웃바운드 포트로 구분되며, 인바운드 포트는 내부 영역의 사용을 위한 API이고, 아웃바운드 포트는 내부 영역이 외부를 호출하는 방법을 정의함.
    • 아웃바운드 어댑터는 아웃바운드 포트에 의존하여 구현되며, DIP 원칙이 적용됨.
  • 외부 영역에 존재하는 어댑터의 예시
    • 인바운드 어댑터
      • REST API 컨트롤러, 웹 페이지를 구성하는 스프링 MVC 컨트롤러, 커맨드 핸들러, 이벤트 메시지 구독 핸들러 등
    • 아웃바운드 어댑터
      • 데이터 액세스 처리를 담당하는 DAO, 이벤트 메시지를 발행하는 클래스, 외부 서비스를 호출하는 프락시 등

3.2.3 클린 아키텍처

  • 클린 아키텍처는 로버트 C. 마틴이 제안한 아키텍처로, 헥사고날 아키텍처와 유사한 아이디어를 가지고 있음.
    • 이 아키텍처는 소프트웨어의 구조 가치를 중요시하며, 중요하지 않은 세부사항을 가능한 한 오랫동안 열어둘 것을 목표로 함.
    • 클린 아키텍처는 겹겹이 둘러싸인 영역으로 구성되어 있으며, 중앙에서부터 밖으로 엔티티, 유스케이스, 그 외 세부사항으로 구분함.
      1. 엔티티
        • 중앙에 위치한 엔티티는 핵심 업무 규칙과 데이터를 가지고 있는 객체임.
        • 엔티티는 간단한 객체여야 하며, 프레임워크, 데이터베이스 등의 복잡한 것에 의존해서는 안 됨.
      2. 유스케이스
        • 엔티티를 감싸는 유스케이스는 애플리케이션에 특화된 업무 규칙을 표현하며, 엔티티 내부의 핵심 업무 규칙을 호출하여 시스템을 사용하는 흐름을 담당함.
        • 고수준의 엔티티 영역은 저수준의 유스케이스 영역에 의존해서는 안 됨.
      3. 세부사항
        • 유스케이스를 감싸는 나머지 영역은 세부사항이며, 입출력 장치, 저장소, 웹 시스템, 서버, 프레임워크, 통신 프로토콜 등이 여기에 해당함.
        • 세부사항과 유스케이스 간의 관계는 의존 관계 역전 원칙을 이용해 플러그인처럼 유연하게 처리해야 함.
  • 클린 아키텍처는 명확한 결합의 분리를 통해 테스트 용이성, 개발 독립성, 배포 독립성을 강화할 수 있음.
    • 이렇게 함으로써, 클린 아키텍처는 소프트웨어를 유연하게 유지하는 데 도움을 주는 아키텍처로 인정받고 있음.

댓글

Designed by JB FACTORY