Backend/공부,개념

헥사고날 아키텍처 공부중..

지수쓰 2023. 3. 6. 01:43
반응형

쓰면서 정리하고 있어서 좀 더 보완해서 다시 수정할 예정 

 

레이어드 아키텍처

  • 인터페이스를 통해 의존성을 낮춘다고 해도, 데이터 액세스 계층이 변경되었을 때 비즈니스 로직 계층의 클래스가 데이터 액세스 계층에 존재하는 인터페이스를 의존하기 때문에 영향을 받을 수밖에 없다.
  • 데이터 액세스 인터페이스의 위치
    • 데이터 액세스 계층에 존재
    • 항상 하위 계층에 의존해야함
    • 애플리케이션 -> 비즈니스 로직이 핵심임
    • 프레젠테이션, 데이터 액세스 계층을 저수준영역이라 하고 비즈니스 영역을 고수준영역이라고 하는데 레이어드 아키텍처의 규칙에 따르면 고수준 영역이 저수준 영역에 의존하게 되는 상태
  • DIP를 이용해 데이터 액세스 계층에서 정의한 인터페이스 위치를 비즈니스로직 계층으로 이동시켰음. 데이터 액세스 계층의 구현체는 비즈니스 로직 계층의 인터페이스를 바라보게 됨

배경

  • 애플리케이션이 중심이고 DB, 웹 프레임워크 등은 애플리케이션이 사용하는 부품으로 보는 아키텍처가 주목받기 시작한다
  • 대표적으로 헥사고날 아키텍처와 클린 아키텍처

헥사고날아키텍처

  • 포트 앤 어댑터 아키텍처(ports and adapters architecture) by Alistair Cockburn

  • 내부영역
    • 순수 비즈니스 로직을 표현하는 기술 독립적인 영역
    • 외부영역과 연계되는 포트를 가짐
  • 외부영역
    • 외부에서 들어오는 요청을 처리하는 인바운드 어댑터
      • REST API 발행 컨트롤러
      • 웹페이지 구성하는 스프링 MVC 컨트롤러
      • 커맨드 핸들러
      • 이벤트 메시지 구독 핸들러
    • 비즈니스 로직에 의해 호출되어 외부와 연계되는 아웃바운드 어댑터
      • DAO (데이터 액세스 처리)
      • 이벤트 메시지 발행 클래스
      • 외부 서비스 호출 프락시

구조

어댑터 -> 애플리케이션 > 도메인
이 의존성 흐름을 역행하면 안됨

도메인

  • 레이어드 아키텍처에서의 도메인 레이어 개념과 같음
  • 애플리케이션의 핵심이 되는 도메인

애플리케이션

  • 도메인을 이용한 애플리케이션의 비즈니스 로직 제공 : Service
  • 포트를 가지고 있음

포트

  • 헥사고날의 가장 큰 특징인 고수준의 내부영역이 어댑터에 전혀 의존하지 않게 한다. 는는 포트를 통해 가능해짐
  • 외부 어댑터를 끼울 수 있는 인터페이스
  • 인 바운드 포트
    • 애플리케이션으로 흐름이 들어오는 포트
    • 내부 영역 사용을 위해 표출된 API
    • 외부영역의 인 바운드 어댑터가 호출
  • 아웃 바운드 포트
    • 애플리케이션에서 흐름이 나가는 포트
    • 내부 영역이 외부 영역을 호출하는 방법을 정의
    • 아웃바운드 어댑터가 아웃바운드 포트에 의존하여 구현됨

어댑터

  • 애플리케이션 내에 있는 포트에 끼울 수 있는 구현체
  • 포트를 나타내는 인터페이스를 상속받아 구현

예시

src/
  adapter/ -- 애플리케이션 계층의 인커밍 포트를 호출하는 인커밍(웹)어댑터와 아웃고팅 포트에 대한 구현을 제공하는 아웃고잉(영속성) 어댑터를 포함
    inbound/
      web/
        SendMoneyController
        ...
    outbound/
      persistence/
        AccountUpaEntity
        AccountMapper
        AccountPersistenceAdapter
        ActivityJpaEntity
        I)ActivityRepository
        I)SpringDataAccountRepository
  application/ -- 도메인 모델에 대한 비즈니스 로직을 수행하는 서비스 계층 
    service/ 
      GetAccountBalanceService -- GetAccountBalanceQuery구현
      MoneyTransferProperties
      NoOpAccountLock
      SendMoneyService -- SendMoneyUseCase 구현
      ThreshholdExccededException
    port/
      inbound/
        I)GetAccountBalanceQuery
        SendMoneyCommand
        I)SendMoneyUseCase
      outbound/
        I)AccountLock
        I)LoadAccountPort
        I)UpdateAccountSatePort
  domain/ -- 도메인 모델이 속해있는 패키지
    Account
    Activity
    ActivityWindow
    Money
common/
  @PersistenceAdpter
  @Usecase
  @WebAdapter

육각형 내부

  • 도메인 엔티티
  • 도메인 엔티티와 상호작용하는 유스케이스(서비스)
  • 모든 의존성은 코어(도메인)를 향함

육각형 바깥

  • 웹과 상호작용하는 웹 어댑터, 외부시스템 어댑터, 영속성 어댑터 등
  • driving adapter : 주도하는 어댑터. 왼쪽. 애플리케이션 코어를 호출
    • 포트가 코어에 있는 유스케이스 클래스에 의해 구현되고 호출되는 인터페이스
  • driven adapter : 주도되는 어댑터. 오른쪽. 코어에 의해 호출됨
    • 포트가 어댑터에 의해 구현이 되고 코어에 의해 호출되는 인터페이스

클린 아키텍처

  • 헥사고날 아키텍처의 아이디어와 유사함

  • 엔티티
    • 제일 중앙에 위치
  • 유스케이스
    • 엔티티를 감싸는 객체
    • 자동화된 시스템을 사용하는 처리 절차를 기술
    • 애플리케이션에 특화된 업무규칙을 표현하며 내부의 핵심 업무규칙을 호출하며 시스템을 사용하는 흐름을 담음
    • 엔티티(고수준)는 유스케이스(저수준)를 알게 하면 안 된다.
    • 간단한 객체여야 하고 데이터베이스, 프레임워크등에 의존되어서는 안 되고 유스케이스 객체를 통해서만 엔티티를 조작해야 한다.
  • 세부사항
    • 유스케이스를 감싸고 있는 모든 영역
    • 입출력장치, 저장소, 웹 시스템, 서버, 프레임워크, 통신프로토콜
    • DIP를 이용해 플러그인처럼 유연하게 처리해야 한다.