Hexagonal-Architecture
1 Hexagonal Architecture
2 Hexagonal-Architecture의 구조
2.1 Adapter
- 애플리케이션과 다른 시스템 간의 번역을 담당한다
2.1.1 인커밍 어댑터
- 주도하는 어댑터라고도 한다
- 애플리케이션 코어를 호출하는하고 무슨일을 해야 할지 알려 준다
- 인커밍 어뎁터는 애플리케이션 서비스에 의해 구현된 인터페이스인 전용 포트를 통해 애플리케이션 계층과 통신한다
웹 어댑터
- 대표적인 인커밍 어댑터이다
- HTTP 요청을 애플리케이션 유스케이스에 대한 메서드 호출로 변환하고 결과를 다시 HTTP로 변환하고 어떠한 도메인 로직도 수행하지 않는다
- 반면 애플리케이션 계층은 HTTP에 대한 상세 정보를 노출시키지 않도록 HTTP와 관련된 작업을 해서는 안 된다
- 이렇게 하면 웹 어댑터를 다른 어댑터로 쉽게 교체할 수 있다
- 웹 컨트롤러를 나눌 때 모델을 공유하지 않는 여러 작은 클래스들을 만드는 것을 두려워하지마라
- 작은 클래스는 파악이 쉽고 테스트 하기 쉬우면 동시 작업을 지원한다
2.1.2 아웃고잉 어댑터
- 주도되는 어댑터라고도 한다
- 애플리케이션 코어에 의해 호출되는 어댑터
- 대표적으로 영속성 어댑터가 있다
영속성 어댑터
- 대표적인 아웃고잉 어댑터
- 입출력 모델이 영속성 어댑터가 아니라 애플리케이션 코어에 위치한다
영속성 어댑터 동작과정
- 영속성 어댑터는 포트 인터페이스를 통해 입력 모델을 받는다
- 입력 모델을 인터페이스가 지정한 도메인 엔티티나 특정 데이터베이스 연산 전용 객체다
- 이후 쿼리를 하거나 변경하는 데 사용할 수 있는 포맷으로 입력 모델을 변환한다
- JPA를 사용한다면 입력 모델을 JPA 엔티티 객체로 매핑할 것이다
- JPA를 사용하지 않는다면 입력 모델을 평범한 SQL 구문에 매핑할 것이다
- 변환된 입력을 데이터베이스로 보낸다
- 데이터베이스 출력을 애플리케이션 출력 모델 포맷으로 매핑한다
- 출력 모델을 반환한다
2.2 Port
- 애플리케이션 코어와 어댑터들 간의 통신이 가능하려면 애플리케이션 코어가 각각의 포트를 제공해야 한다
- Port는 애플리케이션에 포함된다
2.2.1 인커밍 포트
- 입력 포트라고도 불린다
- 인커밍 포트는 코어에 있는 유스케이스 클래스들에 의해 구현되는 인터페이스다
- 인커밍 포트를 생략하고 애플리케이션 서비스를 직접 호출하면 안될까?
- 다시보기
2.2.2 아웃고잉 포트
- 출력 포트라고도 한다
- 출력 포트는 주도되는 어댑터에 의해 구현되는 인터페이스다
영속성 포트
- 대표적인 아웃고잉 포트
- 애플리케이션 서비스는 영속성 기능을 사용하기 위해 영속성 포트 인터페이스를 호출한다
- 이 포트는 실제로 영속성 작업을 수행하고 데이터베이스와 통실할 책임을 가진 영속성 어댑터 클래스에 의해 구현된다
- 영속성 포트를 사용하는 이유는 애플리케이션 서비스와 영속성 코드 사이의 간접적인 계층을 두기 위해서다
- 간접적인 계층을 통해 영속성 코드를 리팩터링하더라도 애플리케이션 서비스 코드를 변경하는 결과로 이어지지 않는다
2.3 서비스
- 포트의 구현체