본문으로 건너뛰기

Hexagonal-Architecture

1 Hexagonal Architecture

2 Hexagonal-Architecture의 구조

2.1 Adapter

  • 애플리케이션과 다른 시스템 간의 번역을 담당한다

2.1.1 인커밍 어댑터

  • 주도하는 어댑터라고도 한다
  • 애플리케이션 코어를 호출하는하고 무슨일을 해야 할지 알려준다
  • 인커밍 어뎁터는 애플리케이션 서비스에 의해 구현된 인터페이스인 전용 포트를 통해 애플리케이션 계층과 통신한다

웹 어댑터

  • 대표적인 인커밍 어댑터이다
  • HTTP 요청을 애플리케이션 유스케이스에 대한 메서드 호출로 변환하고 결과를 다시 HTTP로 변환하고 어떠한 도메인 로직도 수행하지 않는다
  • 반면 애플리케이션 계층은 HTTP에 대한 상세 정보를 노출시키지 않도록 HTTP와 관련된 작업을 해서는 안 된다
    • 이렇게 하면 웹 어댑터를 다른 어댑터로 쉽게 교체할 수 있다
  • 웹 컨트롤러를 나눌 때 모델을 공유하지 않는 여러 작은 클래스들을 만드는 것을 두려워하지마라
  • 작은 클래스는 파악이 쉽고 테스트 하기 쉬우면 동시 작업을 지원한다

2.1.2 아웃고잉 어댑터

  • 주도되는 어댑터라고도 한다
  • 애플리케이션 코어에 의해 호출되는 어댑터
  • 대표적으로 영속성 어댑터가 있다

영속성 어댑터

  • 대표적인 아웃고잉 어댑터
  • 입출력 모델이 영속성 어댑터가 아니라 애플리케이션 코어에 위치한다

영속성 어댑터 동작과정

  1. 영속성 어댑터는 포트 인터페이스를 통해 입력 모델을 받는다
    • 입력 모델을 인터페이스가 지정한 도메인 엔티티나 특정 데이터베이스 연산 전용 객체다
  2. 이후 쿼리를 하거나 변경하는 데 사용할 수 있는 포맷으로 입력 모델을 변환한다
    • JPA를 사용한다면 입력 모델을 JPA 엔티티 객체로 매핑할 것이다
    • JPA를 사용하지 않는다면 입력 모델을 평범한 SQL 구문에 매핑할 것이다
  3. 변환된 입력을 데이터베이스로 보낸다
  4. 데이터베이스 출력을 애플리케이션 출력 모델 포맷으로 매핑한다
  5. 출력 모델을 반환한다

2.2 Port

  • 애플리케이션 코어와 어댑터들 간의 통신이 가능하려면 애플리케이션 코어가 각각의 포트를 제공해야 한다
  • Port는 애플리케이션에 포함된다

2.2.1 인커밍 포트

  • 입력 포트라고도 불린다
  • 인커밍 포트는 코어에 있는 유스케이스 클래스들에 의해 구현되는 인터페이스다
  • 인커밍 포트를 생략하고 애플리케이션 서비스를 직접 호출하면 안될까?
    • 다시보기

2.2.2 아웃고잉 포트

  • 출력 포트라고도 한다
  • 출력 포트는 주도되는 어댑터에 의해 구현되는 인터페이스다

영속성 포트

  • 대표적인 아웃고잉 포트
  • 애플리케이션 서비스는 영속성 기능을 사용하기 위해 영속성 포트 인터페이스를 호출한다
  • 이 포트는 실제로 영속성 작업을 수행하고 데이터베이스와 통실할 책임을 가진 영속성 어댑터 클래스에 의해 구현된다
  • 영속성 포트를 사용하는 이유는 애플리케이션 서비스와 영속성 코드 사이의 간접적인 계층을 두기 위해서다
    • 간접적인 계층을 통해 영속성 코드를 리팩터링하더라도 애플리케이션 서비스 코드를 변경하는 결과로 이어지지 않는다

2.3 서비스

  • 포트의 구현체

2.4 도메인