헥사고날 아키텍처에 대해서
업데이트:
헥사고날 아키텍쳐
헥사고날 아키텍처는 소프트웨어 설계 패턴으로, 애플리케이션의 핵심 비즈니스 로직을 외부 요소로부터 분리하는 것을 목표로 합니다. 이 아키텍처는 애플리케이션의 유지보수성, 확장성, 그리고 테스트 용이성을 크게 향상시킵니다.
헥사고날 아키텍처의 등장
2005년, 알리스터 코번(Alistair Cockburn)은 사용자 인터페이스와 데이터베이스가 애플리케이션과 상호작용하는 방식이 유사하다는 점을 관찰했습니다. 이를 바탕으로 그는 애플리케이션을 이러한 ‘외부’ 요소들로부터 독립시키고, 포트와 어댑터를 통해 상호작용하게 하는 개념을 제안했습니다.
헥사고날 아키텍처란?
헥사고날 아키텍처의 핵심은 애플리케이션의 핵심 로직과 외부 요소를 분리하는 데 있습니다. 이렇게 분리함으로써 애플리케이션의 핵심 로직을 테스트하고 변경하기 쉽게 만들어 줍니다.
이 개념은 기술보다 비즈니스 도메인의 중요성을 강조하는 도메인 주도 설계(Domain-Driven Design, DDD)와 유사합니다. 하지만 헥사고날 아키텍처와 DDD는 서로 보완할 수 있는 개념일 뿐, 동일한 것은 아닙니다.
헥사고날 아키텍처는 ‘포트와 어댑터’라고도 불리며, 외부 시스템이나 사용자가 애플리케이션의 포트를 통해 어댑터로 입력을 전달하고, 반대로 애플리케이션이 포트를 통해 어댑터로 출력을 보내는 구조를 갖고 있습니다. 이 추상화 계층을 통해 애플리케이션의 핵심이 외부 기술 및 도구로부터 보호되고, 비즈니스 로직이 격리됩니다.
애플리케이셕 핵심(헥사곤)
애플리케이션의 중심에는 비즈니스 로직이 위치합니다. 이는 외부 요소와 독립적으로 존재하며, 도메인 모델, 비즈니스 규칙, 그리고 애플리케이션 서비스를 포함합니다.
포트(Port)
포트는 애플리케이션 핵심과 외부 세계 사이의 인터페이스 역할을 합니다. 이는 추상화된 계약으로, 애플리케이션이 외부와 어떻게 상호작용할지를 정의합니다.
어댑터(Adapter)
어댑터는 포트를 구현하여 실제 외부 시스템과의 통신을 처리합니다. 이는 애플리케이션 핵심과 외부 기술 사이의 번역기 역할을 합니다.
구동 측(Driving Side)과 구동당하는 측(Driven Side)
-
구동 측(Driving Side): 애플리케이션에 요청을 보내는 외부 요소들 (예: UI, API 클라이언트)
-
구동당하는 측(Driven Side): 애플리케이션이 사용하는 외부 서비스나 리소스 (예: 데이터베이스, 외부 API)
헥사고날 아키텍처는 세 가지 주요 구성요소로 이루어져 있습니다.
1. 비즈니스 로직의 분리
비즈니스 로직은 기술적 구현과 분리되어야 합니다. 이러한 분리를 통해 애플리케이션은 세 가지 주요 부분으로 나뉩니다:
-
비즈니스(또는 코어) 부분
-
인터페이스 부분: 드라이버 또는 1차 액터로, 애플리케이션을 호출하는 역할을 합니다.
-
인프라 부분: 구동체 또는 2차 액터로, 애플리케이션에 의해 호출되는 외부 시스템을 의미합니다.
비즈니스 부분은 헥사고날(육각형)로 표현되는 가상의 구조 안에 격리되어 있기 때문에 ‘헥사고날 아키텍처’라는 이름이 붙었습니다.
2. 비즈니스 부분의 독립성
헥사고날 아키텍처에 따르면 비즈니스 로직은 다른 부분들과 독립적이어야 합니다. 비즈니스 로직에 의존하는 것은 인터페이스 및 인프라 부분입니다. 즉, 종속성은 항상 헥사고날의 외부에서 내부로 흐르게 됩니다.
3. 포트 및 어댑터
비즈니스 부분과 외부 요소를 연결하는 방법은 포트와 어댑터를 사용하는 것입니다. 어댑터는 비즈니스 도메인과 외부 기술 요소 사이에서 연결을 담당하며, 포트는 어댑터가 코어와 상호 작용할 수 있도록 인터페이스를 정의합니다. 이 둘은 비즈니스 로직에 영향을 주지 않으면서도 외부 세계의 변화를 관리하는 데 중요한 역할을 합니다.
이러한 구조는 애플리케이션의 유연성을 높이고, 테스트 가능성을 향상시키며, 새로운 요구 사항을 쉽게 수용할 수 있도록 도와줍니다.
헥사고날 아키텍처의 장점
헥사고날 아키텍처는 소프트웨어 개발에서 널리 사용되는 이유가 있는 여러 가지 중요한 장점을 제공합니다.
1. 기술 변경 시 기능 회귀 위험 감소
비즈니스 로직이 외부 기술과 분리되어 있어, 기술 스택 변경 시 핵심 기능에 미치는 영향이 최소화됩니다.
헥사고날 아키텍처의 가장 큰 장점 중 하나는 기술적인 변경이 있을 때 기능 회귀의 위험을 줄일 수 있다는 점입니다. 다른 아키텍처에서는 비즈니스 로직이 기술적 요소와 강하게 결합될 수 있지만, 헥사고날 아키텍처는 비즈니스 로직을 육각형 구조 안에 격리합니다. 덕분에 데이터베이스, 저장 시스템, 기타 기술적 구성 요소를 변경하더라도 비즈니스 로직은 크게 영향을 받지 않습니다. 이러한 격리는 기능적 회귀를 최소화하여, 기술적인 변화가 발생하더라도 애플리케이션의 안정성을 유지할 수 있도록 도와줍니다.
2. 새로운 기능 추가 및 기존 기능 수정의 용이성
모듈화된 구조로 인해 새로운 기능을 쉽게 추가하고 기존 기능을 수정할 수 있습니다.
비즈니스 로직이 기술적 구현과 독립되어 있기 때문에 새로운 기능을 도입하더라도 기존의 기능에 영향을 미칠 가능성이 적습니다. 이로 인해 애플리케이션의 확장성을 높일 수 있고, 비즈니스 로직을 안전하게 보호하면서 더 유연한 개발이 가능해집니다. 개발자는 시스템의 다른 부분에 미치는 영향을 걱정하지 않고도 애플리케이션을 확장하는 데 집중할 수 있습니다.
3. 비즈니스 로직 테스트의 간편함
외부 의존성 없이 비즈니스 로직을 독립적으로 테스트할 수 있어 단위 테스트가 쉬워집니다.
비즈니스 로직이 명확하게 분리되어 있으며 기술적 의존성이 없기 때문에, 복잡한 의존성을 처리하지 않고도 핵심 로직을 테스트할 수 있습니다. 자동화된 테스트를 작성하고 실행하기 쉬워지며, 이는 테스트 주도 개발(TDD)이나 행동 주도 개발(BDD) 같은 개발 방식을 촉진합니다. 이러한 테스트의 간편함은 코드 품질을 개선하고, 비즈니스 로직이 의도한 대로 작동하는지 확신할 수 있게 해줍니다.
4. BDD와 DDD 접근 방식 촉진
비즈니스 중심의 설계를 강조하여 행동 주도 개발(BDD)과 도메인 주도 설계(DDD)를 자연스럽게 지원합니다
BDD는 애플리케이션이 기대하는 동작에 중점을 두고, DDD는 복잡한 비즈니스 도메인을 모델링하는 데 초점을 맞춥니다. 헥사고날 아키텍처는 비즈니스 로직을 분리하고 자동화된 테스트를 사용함으로써, 이러한 접근 방식을 쉽게 구현할 수 있도록 도와줍니다. 이를 통해 애플리케이션이 기대하는 동작을 더 명확히 이해하고, 비즈니스 도메인을 정밀하게 모델링할 수 있어 전체적인 애플리케이션 품질을 향상시킬 수 있습니다.
헥사고날 아키텍처의 의존성 역전
의존성 역전 원칙(DIP)은 높은 수준의 모듈이 낮은 수준의 모듈에 의존하지 않고, 둘 다 추상화에 의존해야 한다는 개념입니다. 헥사고날 아키텍처에서 포트는 추상화된 인터페이스 역할을 하며, 어댑터는 이를 구현합니다. 구동 측에서는 어댑터가 포트에 의존하고, 구동당하는 측에서는 애플리케이션 서비스가 포트를 사용하므로 의존성이 역전됩니다.
의존성 역전 원칙을 따르면, 애플리케이션의 핵심 로직은 외부 시스템에 의존하지 않고, 외부 시스템이 애플리케이션에 의존하도록 만들 수 있습니다. 이를 통해 애플리케이션은 외부 시스템의 변화에 유연하게 대응할 수 있으며, 비즈니스 로직을 보호하면서도 확장성을 높일 수 있습니다.
결론
헥사고날 아키텍처는 모든 상황에 적합한 만능 해결책은 아니지만, 복잡한 엔터프라이즈 애플리케이션에서 특히 강점을 발휘합니다. 이 아키텍처를 통해 개발자는 비즈니스 로직에 집중하면서도 기술적 유연성을 유지할 수 있습니다. 도메인 주도 설계(DDD)와 결합하여 사용하면, 장기적인 시스템의 가치와 유지보수성을 크게 향상시킬 수 있습니다.
참고사이트
https://scalastic.io/en/hexagonal-architecture/
https://netflixtechblog.com/ready-for-changes-with-hexagonal-architecture-b315ec967749
댓글남기기