만들면서 배우는 클린 아키텍쳐 1장 보완
클린 아키텍처에서 다루는 많은 인사이트를 책 한권에 담으려는 시도가 보였다.
이 책을 읽고나면 포트 앤 어댑터 패턴 중 헥사고날 아키텍쳐(Hexagonal architecture) 패턴의 개념에 대해 이해할 수 있다.
책의 내용만 읽기에는 다소 오해할 수 있는 표현이나 보완된 내용이 필요한 것 같아서 따로 요약했다.
클린 아키텍처
로버트 C. 마틴은 클린 아키텍처(Clean Architecture)라는 용어를 같은 이름의 책에서 정립했다.
클린 아키텍처에서는 설계가 비즈니스 규칙의 테스트를 용이하게 하고, 비즈니스 규칙은 프레임워크, 데이터베이스, UI, 그 밖의 애플리케이션이나 인터페이스로부터 독립적일 수 있다고 서술했다.
이는 도메인 코드가 바깥으로 향하는 어떤 의존성도 없어야 함을 의미한다.
대신 의존성 역전 원착의 도움으로 모든 의존성이 도메인 코드를 향하고 있다.
포트 앤 어댑터 패턴 혹은 헥사고날 아키텍처 패턴
포트 앤 어댑터 패턴, 다른 말로 헥사고날 아키텍쳐는 서로 같은 의미로 사용한다.
헥사고날 아키텍쳐라는 이름이 붙여진 건 책 Object-oriented software design (2005)
에서 앨리스터 콕번이 계층 간의 바람직하지 않은 종속성 주입과 사용자 인터페이스 코드를 개선하는 방법으로 소개가 되었는데, 육각형이란 이름이 붙여진 이유는 단순히 애플리케이션 코어와 외부 세계 사이에 다양한 인터페이스를 그리기 위해 붙인 이름이였다.
헥사고날 아키텍처가 의미하는 바는 외부 세계(UI, 데이터베이스, 서드파티 통합, 인프라)와 애플리케이션 코어(도메인) 계층으로 코드베이스가 분리하는 것을 의미한다.
여기서 주요 규칙은 의존성의 방향은 외부 계층이 애플리케이션 코어 계층에 의존하며 절대 그 반대 방향으로 구성되지 않아야 한다.
계층형 아키텍처에 대한 오해
책에서는 소프트웨어가 커지기 시작하면 계층형 아키텍처는 객체지향 프로그래밍의 원칙을 위배하기 쉬워지고, 문제가 발생하기 쉬워진다는 점을 근거로 계층형 아키텍쳐의 단점을 보완할 수 있는 방안으로 헥사고날 아키텍처를 소개하는데 조금은 오해를 불러 일으킬 수 있는 표현이라고 생각한다.
계층형 아키텍처에서 주요 규칙은 계층 사이의 의존성은 모두 아래를 향한다는 점인데, 복잡한 설계를 하지 않고도 어플리케이션을 작동시켜주는 아키텍처라는 이점이 있다.
마틴 파울러(Martin Fowler)는 소프트웨어가 커지고 복잡하기 시작하면 더 작게 모듈화를 시키는 방법을 해법으로 놓았다. (클린 아키텍처, p316)
"저는 이러한 레이어를 모듈의 한 형태로 생각합니다. 모듈은 우리가 소프트웨어를 상대적으로 독립적인 조각으로 묶는 방법에 사용하는 일반적인 단어입니다."
"I consider these layers to be a form of module, which is a generic word I use for how we clump our software into relatively independent pieces." - Martin Fowler
모듈화를 하는 이유는 아래의 문서에서 자세히 읽을 수 있다.
여기에는 계층형 아키텍쳐를 사용하다가, 기능 중심으로 모듈화를 진행하는 맥락에 대해 알 수 있다.
사용된 인터페이스와 클래스는 이전과 모두 동일하지만, 업무 도메인에 대해 말할 수 있는 무언가로 바뀌는 변화가 생긴 지점이라고 볼 수 있다.
기존의 의존성을 다루는 방법이 복잡해짐에 따라, 계층과 계층 사이에 다른 별도의 계층으로 분할 하고 이러한 각각의 경계는 도메인과 외부 경계를 잇는 이음매
를 만들 수 있기 때문에 테스트와 유지보수도 수월해진다는 장점이 있다.
소프트웨어가 복잡해짐에 따라 만들어야 하는 기능을 정의하고, 유지보수를 쉽게 하는 방향으로 변화를 해 간 것이고 이 고민은 문제를 해결해가는 사람이라면 누구나 마주하게 될 부분으로 이해를 했다.