이번에 리뷰할 책은 너무나도 유명한 로버트 마틴의 <클린 아키텍처>다. 로버트 마틴의 책은 왜 이렇게 인기가 많을까? 내 생각에 로버트 마틴 책의 가장 큰 장점은 ‘명쾌함’이다. 복잡한 문제를 단순하게 해결한다. 그 해결책이 피상적이지 않고 누구나 적용가능하며 실용적이다. 저자의 오랜 경험에서 나온 통찰 없이는 불가능한 일이다.

 

이 책 <클린 아키텍처>는 그런 로버트 마틴의 ‘명쾌함’이 가장 잘 드러난 책이다. 소프트웨어 아키텍처라는 복잡한 주제를 로버트 마틴 특유의 단순함으로 해결한다. 실로 명쾌하지 않을 수 없다. 소프트웨어 아키텍처 혹은 설계에 어려움을 느끼거나, 입문하려는 사람, 실무에 적용 가능한 강력한 원칙을 가지고 싶은 사람은 이 책이 도움일 될 것이다.

 

약간의 사견을 이야기해 보면 로버트 마틴의 책은 현대 소프트웨어를 설명하기에는 너무 기술적 관점에만 초점이 맞춰졌다는 생각이 든다. 현대 소프트웨어는 로버트 마틴이 개발자로 활발히 활동했던 시절보다 훨씬 기능적으로 복잡해지고, 더 비즈니스 변화에 민감해졌다. 전보다 기능적 관점으로 소프트웨어를 바라보는 게 중요해진 것이다. 하지만 로버트 마틴의 책은 기술적 관점에 치중되어 있다. 물론 기술적 관점은 여전히 중요하다. 중요한 건 기능적 관점과 기술적 관점의 조화를 이루는 것인데, 로버트 마틴의 책에서는 이 부분이 결여되어있다.

 

책의 ‘컴포넌트’ 정의에서 이러한 관점을 볼 수 있다. 먼저 로버트 마틴의 컴포넌트에 대한 정의를 보자.

컴포넌트는 배포 단위다. 컴포넌트는 시스템의 구성 요소로, 배포할 수 있는 가장 작은 단위다. 자바의 경우 jar 파일이 컴포넌트다.

다음은 이 책 후반부에 있는 시몬 브라운의 컴포넌트에 대한 정의다.

컴포넌트는 멋지고 깔끔한 인터페이스로 감싸진 연관된 기능들의 묶음으로, 애플리케이션과 같은 실행환경 내부에 존재한다.

로버트 마틴의 컴포넌트에 대한 정의는 다분히 기술적이다. 반면 시몬 브라운의 정의는 기능적 관점이 더욱 드러난다. 개인적으로 현대 소프트웨어에서는 시몬 브라운의 정의가 더 적절하다고 생각한다. 물론 로버트 마틴도 이 사실을 알고 책에 항상 다양한 관점을 가진 개발자들의 기고문을 싣는다는 것은 책이 또 다른 장점이 될 것이다.

 

그렇다고 이 책의 내용이 시대 지난 고리타분한 것이라는 이야기가 아니다. 이 책에서 주장하는 원칙은 시간이 지나도 유지될 정말 본질적인 원칙이다. 단지 현대 소프트웨어가 더 복잡해져 이 책의 정의보다 더 많은 것을 포함해야 한다는 이야기이다.

 

 

클린 아키텍처는 무엇인가?

핵사고날 아키텍처 또는 포트와 어댑터라고 불리는 이 책에서 주장하는 클린 아키텍처는 무엇인가? 사실 클린 아키텍처를 이해하기 위해서는 책에서 일관적으로 주장하는 소프트웨어 설계 원칙을 이해해야 한다. 간단하게 이야기하면 ‘저수준의 세부 사항이 고수준의 추상화에 의존하도록 해라’ 이거다.

 

클린 아키텍처는 이 원칙을 따라 고수준의 업무 규칙과 저수준의 세부 사항인 외부 구성 요소를 계층으로 분리하는 것이다.

클린 아키텍처 다이어그램
클린 아키텍처 다이어그램, 외부원이 내부원에 의존한다.

계층은 흔히 엔터프라이즈 업무 규칙 ← 유스케이스 업무 규칙 ← 인터페이스 어댑터(뷰, 컨트롤러, 프레젠터) ← 프레임워크와 드라이버로 이뤄지며, 외부 영역에 위치한 어떤 것도 내부 영역에 영향을 미치지 못한다.

 

 

왜 클린 아키텍처를 사용하는가?

좋은 아키텍처란 무엇일까? 소프트웨어 세계에서는 시간의 흐름에 따른 변화에 대응하기 용이한 아키텍처가 좋은 아키텍처일 것이다. 그렇다면 무엇이 변화에 대응하기로 어렵게 하는가? 바로 ‘결합’이다. 시스템의 구성요소가 서로 결합하여 단위가 점점 커질수록 변화에 대응하기 어려워진다. 조금만 변해도 전체가 변경 범위에 포함되기 때문이다. 시스템에 결합은 어쩔 수 없다. 결국 시스템을 구성하려면 요소들은 어떠한 형식으로라도 서로 결합해야 한다. 즉 중요한 건 어떻게 결합해야지 가장 변경에 효율적이냐는 것이다.

 

클린 아키텍터는 저수준의 세부 사항이 고수준의 업무 규칙에 의존하도록 결합하는 아키텍처다. 이렇게 결합함으로써 자주 변하는 저수준의 세부 사항과 자주 변하지 않는 고수준의 업무 규칙을 분리한다. 이렇게 분리하면 다음과 같은 이점을 얻을 수 있다.

  1. 변경 범위를 명확하게 그리고 제한한다: 수준에 따라 계층이 나뉘도록 결합하는 것은 변화가 일어났을 때 어디 부분을 변경해야 할지 명확하게 해주며, 그곳만 변경해도 되도록 한다.
  2. 변경으로부터 보호한다: 저수준의 세부 사항에 변화가 생기더라도 고수준의 정책은 전혀 영향을 받지 않는다. 즉 변경으로부터 고수준의 정책은 보호된다.
  3. 모듈을 독립적으로 만든다: 저수준의 세부 사항이 영향을 주지 않으므로 세부 사항은 마치 플러그인처럼 독립적으로 개발하고 배포할 수 있다.
  4. 세부 사항에 대한 결정을 최후로 미룰 수 있다.: 고수준의 정책이 세부 사항에 영향받지 않기 때문에 세부 사항에 대한 결정을 충분한 정보를 얻어 가장 최선의 결정을 내릴 수 있는 순간에 큰 비용 없이 내릴 수 있다.

 

 


 

 

말 그대로 '클린' 아키텍처다

내가 로버트 마틴 책 중에서 가장 좋아하는 부분은 ‘클린’이란 부분이다. 세상에 자신의 훌륭하고 화려한 기교를 뽐낼 수 있는 사람은 많지만, 과연 자신의 방법이 ‘클린’하다고 말할 수 있는 사람이 몇이나 될까? 그리고 수만 명에 사람들이 이를 납득할 수 있도록 글을 쓸 수 있는 사람은 몇 명이나 될까? 로버트 마틴은 이런 측면에서 독보적인 존재다.

 

서평 위에 로버트 마틴에 대한 부정적인 측면도 적었지만, 이 책에 있는 내용들, 제시한 원칙들, 정의들은 여전히 유효하며 강력하다. 여전히 책에서 제시한 원칙으로 소프트웨어를 경계 짓고 관계 짓는 것은 소프트웨어 설계의 본질이며, 앞으로도 그럴 것이다. 그런 의미에서 이 책은 ‘클린’하다. 이 책의 맺음말을 인용하며 글을 마치겠다.

 

<Lean JSON Cloud NoSQL for Dummies>라는 책을 중고로 팔아버린 후에도 수년간 당신의 책장에 그대로 꽃혀 있을 책이 바로 이 책이 될 것이라는 사실을 조금도 의심치 않는다. - 제이스 고먼 -