2024. 1. 21. 11:07ㆍ카테고리 없음
헥사고날 아키텍처
클린 아키텍처의 일종으로 전통적인 계층형 아키텍처 (Layered Architecture)를 보완하기 위해 탄생했다.
- 도메인 중심의 아키텍처로 클린 아키텍처를 일반화한 구조 중 하나이다.
- 포트와 어댑터 (Ports and Adapter)아키텍처라고도 말한다.
* 도메인: 영역 혹은 집합을 뜻하는 말로 여기에서는 비즈니스 로직을 뜻한다.
계층형 아키텍처의 문제
1. 데이터 베이스(영속성)에 대한 의존성이 도메인 계층이 전파된다.
계층형 아키텍의 도메인 계층은 영속성에 의존하고있다.
즉, 데이터 베이스에 변화가 일어난다면 도메인 계층도 변화가 생겨서 유연함이 떨어지고 변화에 취약해진다.
* 영속성: 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터
2. 계층을 Skip 할 수 있다.
계층형 구조에서 많이 나타내는 형태로 계층을 건너뛰는 것이 가능하다.
예를 들어서 구현이 간단한 경우 Controller에서 바로 Repository를 참조해 로직을 작성할 수 있다.
이 경우 첫 번째 문제는 기능의 확장이다.
기능이 추가되면 해당 로직을 서비스 계층으로 옮기겠지 라고 생각하고 컨트롤러에서 Repository를 바로 참조했지만
다른 동료는 그렇게 하지 않을 수도 있다.
두 번째 문제는 테스트가 복잡해진다는 것이다. Controller가 바로 Repository를 참조하기 때문에 Controller의 유닛 테스트를 위해 Repository를 Mocking 해야 하는 상황이 발생하면서 테스트가 복잡해진다.
요약
기존의 계층형 아키텍처의 문제는 결국 변화에 유연하게 대처하기 힘들다는 점과 테스트를 하기 불편하다는 점이다.
헥사고날 아키텍처
헥사고날 아키텍처(육각형 아키텍처)는 알레스테어 콕번이 만든 용어로 클린 아키텍처를 일반화한 구조 중 하나이다.
* 육각형 모양은 사실 아무 의미가 없다. 애플리케이션이 다른 시스템이나 어댑터와 연결되는 4개의 면을 나타내기 위해 육각형을 사용했다 고 한다.
아래의 사진처럼 기존의 계층형 아키텍처는 비즈니스 로직이 영속성 계층을 바라보며 의존하고 있다.
위에서 언급했다시피 변화에 유연하게 대처하기 힘드므로 우선은 비즈니스 로직과 영속성 계층의 의존성을 끊어야 한다.
그렇다면 어떻게 끊을 수 있을까?
헥사고날에서 사용하는 방법은 비즈니스 로직과 영속성 계층 사이에 인터페이스를 두어 의존성을 끊는 것이다.
아래의 사진을 보면 Service가 영속성 계층인 Repository를 의존하지 않고 인터페이스인 IRepository를 의존하고 Repository가 IRepository를 의존하고 있는 것을 볼 수 있다.
이것을 의존하는 방향이 역전되었다고 해서 의존성 역전 (DIP)라고 부른다.
앞에서는 영속성 계층을 Repository, 의존성을 끊는 인터페이스를 IRepository라고 불렀지만
헥사고날 아키텍처에서는 인터페이스를 Port, Repository를 Adapter라고 부른다.
하지만 정확히 말하자면 Adapter는 비즈니스 로직인 Service가 데이터를 요구하는 로직 외부의 것들을 말하고 Port는 Service와 Adapter의 연결 부분이다.
아래의 사진을 보면 콘센트 같은 것을 꽂는 모양이 보일텐데 우리가 콘센트에 전기코드를 꼽았다 뺐다 하는 것처럼 언제든지 바꿔낄 수 있게 만드는 것이 헥사고날 아키텍처의 핵심이다.
헥사고날 아키텍처의 장점
- 테스트에 용이하다
- 각각의 의존성을 끊어놨기 때문에 테스트하기에 용이한 코드가 나온다.
- 확장 가능성
- 각각의 역할이 명확하기에 에러를 찾기가 쉬워지며 기능을 확장하거나 보수할 때에도 매우 용이히다.
헥사고날 아키텍처의 단점
- 작성할 코드가 많이 늘어나기 때문에 개발속도가 더딜 수 있다.
헥사고날 아키텍처를 이용한 Nest 게시판 깃허브 링크: https://github.com/striker1826/hexagonal_Architecture_Nest.JS