Blog
책 리뷰
헥사고날 아키텍처 설계와 구현

1장 헥사고날 아키텍처란?

Hexagonal Architecture : 여러분의 애플리케이션을 UI나 데이터베이스 없이도 동작하도록 만드십시오. 그러면 애플리케이션에 대해 자동화된 회귀 테스트를 실행할 수 있고, 데이터베이스를 사용할 수 없을 때도 동작합니다. 그리고 어떤 사용자의 개입 없이도 애플리케이션을 함께 연결할 수 있습니다. - 알리스테어 코크번(Alistair Cockburn)

즉, 요약하자면 우리 어플리케이션이 UI와 데이터베이스 관련 기술뿐 아니라 그 어떤 기술 없이도 동작하게 만드는 것이다. 비즈니스 측면이 비즈니스 목표를 달성하는 데 사용되는 기술에 대한 우려 없이도 발전할 수 있어야 하고 비즈니스 코드에 피해를 주지 않고도 기술 코드를 변경할 수 있어야 한다.

  • 도메인 헥사곤 : 주요한 키워드는 엔티티(Entity)와 값 객체(Value Object)이다.
    • Entity : 식별자를 할당할 수 있는 것을 의미한다.
    • Value Object : 엔티티를 합성하기 위해서 사용하는 불변 객체이다.
  • 애플리케이션 헥사곤 : 도메인 헥사곤에서 나오는 비즈니스 규칙을 사용, 처리하고 조정하는 방법이다.
    • UseCase : 도메인 제약사항을 지원하기 위해 시스템의 동작을 소프트웨어 영역 내에 존재하는 애플리케이션 특화 오퍼레이션을 통해 나타낸다. 간단하게 말해서 이 어플리케이션이 도메인을 활용해서 어떤 것을 할 수 있는지를 나타내는 인터페이스이다.
public interface RouterViewUseCase {
  List<Router> getRouters(Predicate<Router> filter);
}
  • 입력포트(Input Port) : 유스케이스가 인터페이스라면 유스케이스 인터페이스를 구현한 부분이다.
  • 출력포트(Out Port) : 유스케이스가 목표를 달성하기 위해 리소스에서 데이터를 가져와야 하는 상황이다. 유스케이스나 입력 포트가 오퍼레이션을 수행하기 위해 어떤 종류의 데이터를 외부에서 가져와야 하는지를 기술에 구애받지 않고 설명하는 인터페이스로 표현된다.
public interface RouterViewOutPort {
  List<Router> fetchRouters();
}
  • 프레임 워크 헥사곤 : 외부 인터페이스를 제공한다. Rest나 gRPC 엔드포인트를 설정하거나 DB 연결등에 해당하는 부분이 이곳이다.
    • 소프트웨어와 통신할 수 있는 기술을 결정하는 헥사곤이다. 통신은 드라이빙, 드리븐 방식으로 나뉠 수 있다.
      • driving : 입력어댑터
      • driven : 출력어댑터, 애플리케이션 레이어의 출력 포트를 implement하고 DI가 일어난다.

Info

헥사고날 아키텍쳐 설계와 구현 요약