클린 아키텍쳐의 핵심 아이디어

clean architecture


밥 아저씨의 클린 아키텍쳐에 대한 아이디어가 공유된 이후 많은 분들이 여기에 관심을 가지고 있고, 각자 나름대로 해석한 설명을 공유하고 있습니다. 구현한 예도 많이 있죠.

최근 아키텍쳐에 대해서 여러 분들과 얘기를 하면서 느낀것은 아키텍쳐에 대해서 이해가 많지 않다는 아쉬움과 클린아키텍쳐에 대해서도 명확한 개념을 갖고 있지 못하다는 점이다.

클린 아키텍쳐는 “깨끗한” 아키텍쳐가 아니다. 엉클밥이 제안하는 여러 아이디어들에 대한 브랜드 네임이다.


아키텍쳐가 무엇이냐?

우리는 플랫폼과 프레임워크에서 제공되는 여러 기능들을 사용해서 응용 어플리케이션을 만들고 있다.
예를들어 흔히들 만드는 ToDo 앱을 iOS용으로 만든다고 하면, 극단적으로 TodoViewController 하나만으로 모든 서비스를 다 만들 수 있다. 또 다른 방법으로는 View, ViewModel, Controller, Model 등등으로 여러 레이어를 만들고 코드를 나눠서 만들 수도 있다.

서비스를 만드는 관점에서 보면 어떤방식으로 만들더라도 상관 없다. 그럼 왜 코드를 분리해서 만들어야 하느냐? 나눈다면 어떤구성으로 어떻게 나누는 것이 좋은냐? 하는 것이 아키텍쳐를 이해하는 올바른 접근이라고 생각한다.

우리가 만드는 서비스는 한 번 만들고 끝이 아니다. 계속 기능이 추가/삭제되고 끊임없이 변경되어간다. 또 여럿이 같이 만들기도 하고, 만들던 사람이 나가고 새로운 사람이 그 자리를 채워서 이어서 개발하기도 한다. 이런 상황에서 서비스를 잘 관리할 수 있으려면 한 덩어리로 뭉쳐있는 코드보다는 기능별로 여럿으로 나눠져 있는 것이 편할 것이다. 이것이 “왜 코드를 나누는가?”에 대한 답변이다.

다음 어떻게 나눠야 하는가? 에 대한 답이 바로 아키텍쳐이다. 어떤 기준으로 나누고, 어떻게 구성해야 하는가. 즉, 코드를 어떻게 배치할 것인가 하는 답이 아키텍쳐이다. 어떤 아키텍쳐를 선택하느냐에 따라서 코드를 나누고 배치하는 기준이 달라질 것이다.

아키텍쳐는 코드의 배치에 대한 얘기이다.


클린아키텍쳐는 무엇을 제시하는가?

여러 아키텍쳐 모델들이 있다. 그 중에서 엉클밥이 제시한 클린아키텍쳐가 많이 회자되는 것은 그것이 제시하는 방식이 적당하겠다고 많은 개발자들이 공감하기 때문일 것이다.
그럼 클린아키텍쳐가 제시하는 핵심 아이디어에 대해서 올바르게 알아야 할 것이다.

클린아키텍쳐에 여러 용어들이 나온다. Entity, Usecase, Controller 등이다. 그런데 이런 구성의 요소들이 클린아키텍쳐가 말하고자하는 주요 아이디어가 아니다. 클린아키텍쳐가 말하는 주요 아이디어는

  1. 프로그램을 구성하는데는 이러한 요소들이 있고,
  2. 그것들은 레이어로 나뉘어 있어야 한다.
  3. 레이어들은 비지니스에 가까운가와 플랫폼에 가까운가를 기준으로 구분한다.
  4. 각 레이어 사이에는 인터페이스 분리되어 있어야 한다.
  5. 그리고 사용에 대한 방향은 한쪽으로만 흘러야 한다.

라는 것이다. 아주 단순하지만 명쾌한 아이디어다. 그리고 기준과 아이디어만으로 구성된 이론이기 때문에 어떤 프로그램에도 적용할 수 있다.


결론

클린아키텍쳐를 적용한다 라는 것은 이 핵심 아이디어를 따른 다는 뜻이다. Entity, Usecase 같이 예시로 제시한 그런 용어에 매몰되서 이게 맞네 아니네, 이건 이름을 이것으로 지어야 하네.. 그런 논쟁을 하는 것은 아무런 의미가 없다.

또 당연히, 지금의 아키텍쳐가 클린아키텍쳐를 따르는가를 평가하는 기준에도 역시 그 핵심 아이디어를 따르는 것만 확인하면 된다.

뭣이 중요한지 잘 판단하자.


끝.