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를 이용해 플러그인처럼 유연하게 처리해야 한다.
- 출처
- sk c&c 마이크로서비스 내부 아키텍처 - 2회 : 클린 아키텍처와 헥사고널 아키텍처 https://engineering-skcc.github.io/microservice%20inner%20achitecture/inner-architecture-2/
- github.io [소프트웨어 아키텍처 패턴] 헥사고날(hexagonal) 아키텍처 https://6mini.github.io/software%20architecture%20pattern/2022/11/23/hexagonal-architecture/
- 티스토리 [Clean Architecture] 육각형 아키텍처 (헥사고날 아키텍처) 패키지 구조 https://devkingdom.tistory.com/342