ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 헥사고날 아키텍처 공부중..
    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를 이용해 플러그인처럼 유연하게 처리해야 한다.

    댓글

Designed by Tistory.