
이 두 아키텍처는 각 레이어의 역할과 책임을 명확히 나누어, 코드의 유지보수성을 높이고 테스트 용이성을 제공하는 것을 목표로 합니다.
1. 클린 아키텍처 (Clean Architecture)
클린 아키텍처는 로버트 C. 마틴(Robert C. Martin, "Uncle Bob")이 제안한 아키텍처 패턴으로, 시스템을 여러 레이어로 나누어 각 레이어가 명확한 책임을 갖도록 합니다. 클린 아키텍처의 주요 특징은 의존성 규칙 (Dependency Rule)에 따라 내부(비즈니스 로직) 레이어가 외부(데이터베이스, UI 등) 레이어에 의존하지 않는다는 점입니다. 즉, 내부 레이어는 외부 레이어의 변경에 영향을 받지 않도록 분리됩니다.
주요 레이어:
- 엔티티(Entity): 시스템의 핵심 비즈니스 객체들로, 주로 데이터 모델이나 도메인 객체들이 위치합니다.
- 유즈 케이스(Use Cases): 애플리케이션의 구체적인 동작을 나타내는 로직으로, 엔티티와 상호작용합니다.
- 인터페이스(Interfaces): 유즈 케이스가 외부 시스템(데이터베이스, UI 등)과 상호작용하는 방법을 정의합니다.
- 외부 시스템(External Systems): 데이터베이스, UI, 외부 API 등 실제 구현체들이 위치하며, 내부 시스템과 인터페이스를 통해 상호작용합니다.
이러한 구조는 핵심 비즈니스 로직을 외부 변화(UI, 데이터베이스 등)로부터 분리시키며, 시스템이 더욱 견고하고 확장 가능하도록 합니다.
2. 헥사고날 아키텍처 (Hexagonal Architecture), 또는 포트 앤 어댑터 아키텍처 (Ports and Adapters Architecture)
헥사고날 아키텍처는 시스템을 포트(port)와 어댑터(adapter)를 이용해 외부와 상호작용하도록 설계하는 패턴입니다. 이 아키텍처에서는 애플리케이션을 핵심 도메인 로직과 외부 시스템(UI, 데이터베이스 등) 사이에 분리된 포트를 두고, 어댑터를 통해 외부 시스템과 상호작용합니다.
주요 개념:
- 핵심 도메인: 비즈니스 로직이 위치하며, 외부 시스템과는 포트를 통해 연결됩니다.
- 포트(Port): 핵심 도메인과 외부 시스템을 연결하는 인터페이스 역할을 합니다.
- 어댑터(Adapter): 포트를 구현하는 컴포넌트로, 외부 시스템과의 연결을 담당합니다. 예를 들어, 데이터베이스 어댑터, API 어댑터 등이 있습니다.
헥사고날 아키텍처도 클린 아키텍처와 유사하게 비즈니스 로직을 외부의 변화로부터 보호하며, 시스템의 테스트 가능성과 확장성을 높이는 데 도움을 줍니다.
비교 및 결론
- 클린 아키텍처는 시스템의 핵심 비즈니스 로직을 외부와 분리하고, 각 레이어의 역할을 명확히 구분하는 아키텍처입니다.
- 헥사고날 아키텍처는 외부 시스템과의 연결을 포트와 어댑터를 통해 관리하며, 비즈니스 로직을 외부 시스템으로부터 보호하는 방식입니다.
둘 다 의존성 역전 원칙(Dependency Inversion Principle)을 적용하여 비즈니스 로직과 외부 환경을 분리하며, 유지보수와 확장성을 용이하게 만드는 아키텍처입니다.