최근 아키텍처 공부를 하면서 흔히 접할 수 있는 Clean Architecture와 Hexagonal Architecture를 만나게 되었습니다.
여러 블로그들과 글들을 읽으면서 Clean Architecture와 Hexagonal Architecture의 다른 점이 무엇인지 점점 모호해지는 것을 느꼈습니다.
왜냐면 두 아키텍처에서는 Entity를 중심에 두고 그다음 UseCase를 통해 로직을 정의 한 다음 그다음 DIP를 적용하여 의존성을 내부 Core로 의존관계를 형성하면서, 외부의 변경 ( API변경, DB변경 등 )으로부터 내부 구현체들은 안전하다는 장점을 띄고 있기 때문입니다.
그렇다면 두 아키텍처는 어떤 점에서 차이를 보이고 있는지 알아보도록 하겠습니다.
Clean Architecture - Robert C. Martin
클린 아키텍처를 한 번이라도 보았다면 많이 익숙한 그림일 것입니다.
해당 그림은 의존관계를 내부로 의존하도록 하는 것을 가시화하여 보여주고 있습니다.
그림과 같은 의존관계를 형성한다면 파란색 원 즉 UI, Web, DB와 같은 외부 시스템 변경이 있다 하더라도 Application내부에는 영향이 없는 관계를 형성할 수 있습니다.
즉, 우리가 보호하려 하는 도메인의 정책 및 비즈니스 규칙들이 보호된다는 강점을 가질 수 있습니다.
클린 아키텍처에서는 다음과 같은 특징을 가집니다.
프레임워크에 독립적이다.
비즈니스 로직들 즉 내부 로직들은 외부 통신 없이 테스트 가능하다.
내부 영향 없이 쉽게 외부 시스템을 변경할 수 있다.
데이터베이스 종류와 관계없이 변경할 수 있다.
외부 시스템에서는 Application 내부의 일에 대해 알 수 없다.
이러한 특징들은 외부와 분리된 흔히 모듈화 된 Application를 만들 수 있다는 점이 있습니다.
그럼 클린 아키텍처에서는 어떤 점을 중요하게 보아야 할까? 바로 종속성 규칙을 가장 중요하게 보면 될 거 같습니다.
종속성 규칙이 유효하다면 위 그림에 존재하는 원의 개수가 달라진다 하더라도 클린 아키텍처를 따르고 있다고 볼 수 있습니다.
다만, 종속성 규칙을 위배한다면 클린 아키텍처를 온전히 적용하였다고 보기는 어려울 것 같습니다.
Hexagonal Architecture - Alistair Cockburn
해당 아키텍처는 2005년에 처음 소개하면서"Ports and Adapters"아키텍처라고 불렸습니다.
처음 소개 된 이름을 보면 감이 오시겠지만 핵사고 날 아키텍처에서 가장 중요한 개념은 Ports와 Adapters입니다.
Ports는 시스템이 외부와 통신하는 인터페이스를 정의하며,
Adapters는 Ports와 외부 시스템 간의 실제 구현을 담당합니다.
즉, 이 또한 DIP를 활용하여 Application에서 외부에 의존하지 않고, Ports라는 Interface를 제공함으로써 Application이 하나의 모듈화 되는 아키텍처입니다.
그렇다면 왜 이 아키텍처 이름은 "Hexagonal Architecture"라 불리게 되었는지 의문이 들게 됩니다.
왜 "Hexagonal"인가?
다양한 외부 인터페이스 표현 육각형은 여러 방향에서 포트를 연결할 수 있는 모양을 상징합니다. 이는 애플리케이션이 다양한 외부 시스템과 상호작용할 수 있다는 점을 강조합니다.
대칭성 육각형의 대칭성은 애플리케이션이 외부 시스템과의 관계에서 특정 방향에 종속되지 않고, 내부 도메인 로직이 외부 의존성에서 독립적이어야 한다는 철학을 나타냅니다.
시각적 단순화 Cockburn은 육각형이 포트와 어댑터를 배치하는 데 직관적인 도형이라고 보았습니다. 이 도형은 외부 시스템과 내부 도메인 간의 관계를 명확히 표현할 수 있습니다.
위와 같은 이유로 "Hexagonal Architecture"로 불리고 있습니다.
그럼 위 그림을 보면 Adapters는 두 육각형을 연결하는 역할 즉, 실질적인 구현체라는 것은 알겠지만,
Ports는 어디에 있는 걸까요?
그림을 자세히 보면 내부 육각형의 면이 굵은 것을 확인할 수 있습니다.
바로 이 육각형의 면이 외부 시스템과 연결을 위해 제공되는 Interface 즉, Ports입니다.
Hexagonal Architecture는 추후 Clean Architecture와 Onion architecture의 철학에 영향을 미치게 됩니다.
Clean Architecture와 Hexagonal Architecture의 차이
두 아키텍처는 기본적으로 같은 목표를 가진 설계 철학을 가지고 있어 혼동하기 쉽습니다.
그게 그거 아닌가!라고 생각 할 수 있지만, 딱 잡고 말하자면
Clean Architecture는 애플리케이션을 여러 계층으로 나누고, 의존성 방향을 바깥에서 안쪽으로 향하는 아키텍처이고,
Hexagonal Architecture는 Ports와 Adapters를 통해 외부 시스템과 내부 시스템을 분리하여 의존 방향이 Application 내부로 향하는 아키텍처입니다.
즉, 두 아키텍처는 유지보수성과 확장성을 높이고, Core를 외부 시스템으로부터 분리하는데 초점을 맞춘다는 공통점이 존재합니다.
그럼 어떤 아키텍처를 사용하는 것이 좋을까요?
만약 애플리케이션의 종속성 규칙을 엄격하게 지키고 싶다면 Clean Architecture를,
외부 시스템과 내부 시스템의 엄격한 분리를 원한다면 Hexagonal Architecture를,
만약 둘 다 엄격하게 가져가고 싶다면 섞어 사용하면 될 것 같습니다.
결국 우리가 이야기하는 아키텍처는 하나의 시스템을 설계하는 방법일 뿐 상황에 맞춰 최선의 방법으로 설계하는 것이 가장 중요하다 생각합니다.