서론
요즘은 단순 기능 개발에 목표를 두는 게 아닌 가독성 좋고 효율적인 코드를 작성하기 위해 노력 중이다. 위 목표를 달성하기 위해 최근 클린 아키텍처에 대한 개념을 학습 중에 있다. 아직 이해도가 많이 부족하다고 느끼지만 한번 정리해보려 한다.
Clean Architecture란?
클린 아키텍처(Clean Architecture)란 소프트웨어 개발에 사용되는 디자인 패턴 중 하나로, Robert C. Martin이 제안한 아키텍처 원칙이다. 위 아키텍처는 소프트웨어를 모듈화 하고 느슨하게 결합된 컴포넌트로 구성하여 유지보수성과 테스트 용이성을 높이는 것을 목표로 한다.
클린 아키텍처의 의존성은 외부에서 내부로 향하고, 외부 요소는 내부 요소에 영향을 미치지 않는다. 즉, 안쪽으로 갈수록 고수준(추상화된 개념)으로 표현되고 바깥쪽으로 갈수록 저수준(덜 중요하고 세부적인 영역)으로 표현된다.
각 영역에 대해 설명하자면 아래와 같다.
Entities(엔티티)
- 핵심 업무 규칙을 캡슐화함
- 메서드를 가지는 객체, 일련의 데이터 구조와 함수의 집합
- 가장 변화가 없고 외부로부터 영향을 받지 않는 영역
UseCases(유즈 케이스)
- 애플리케이션의 특화된 업무 규칙을 포함
- 시스템의 모든 유즈 케이스를 캡슐화하고 구현함
- 엔티티로 들어오고 나가는 데이터 흐름을 조정하고 조작함
Interface Adapter(인터페이스 어댑터)
- 일련의 어댑터들로 구성함
- 외부 인터페이스에서 들어오는 데이터를 유즈 케이스와 엔티티에서 처리하기 편한 방식으로 변환하며, 유즈 케이스와 엔티티에서 나가는 데이터를 외부 인터페이스에서 처리하기 편한 방식으로 변환함
- 컨트롤러, 프레젠터, 게이트웨이 등이 속함
Frameworks & Drivers(프레임워크와 드라이버)
- 시스템의 핵심 업무와는 관련 없는 세부 사항
- 프레임 워크나 데이터베이스, 웹 서버 등이 해당
고수준? 저수준?
고수준과 저수준의 개념은 아래와 같다.
고수준
- 상위 수준의 개념, 추상화된 개념
- ex) 데이터를 저장한다, 쇼핑을 한다.
저수준
- 추상화된 개념을 실제로 어떻게 구현할지에 대한 세부적인 개념
- ex) DB에 데이터를 저장한다, 현대 백화점에서 쇼핑을 한다.
클린 아키텍처의 핵심은 경계이고, 로버트 마틴은 경계에 대해 아래와 같이 설명했다.
소프트웨어 아키텍처는 선을 긋는 기술이며, 나는 이러한 선을 경계(boundary)라고 부른다.
경계는 소프트웨어 요소를 서로 분리하고, 경계 한편에 있는 요소가 반대편에 있는 요소를 알지 못하도록 막는다.
또한, 클린 아키텍처의 핵심 개념은 의존성 역전 원칙(Dependency Inversion Principle)이다.
위 원칙에 따르면 고수준 모듈은 저수준 모듈에 의존하면 안 되며 두 가지 모듈 모두 추상화에 의존해야 한다. 즉, 상위 수준의 모듈은 하위 수준 모듈의 세부 구현에 의존해서는 안되고 모두 추상화된 인터페이스에 의존해야 한다. 이를 통해 시스템의 유연성과 확장성을 높일 수 있다.
DI에 대한 개념은 이전에 정리한 포스팅 참고하면 좋을 듯 합니다.
[Android] 의존성 주입(Dependency Injection)
서론 요즘 Android 개발자에게 요구하는 기본 stack 중 하나인 의존성 주입에 대해 정리해보려 한다. 의존성 주입에 Dagger, Hilt, Koin 같은 다양한 라이브러리를 활용하는 것으로 알고 있는데, 라이브
ystech.tistory.com
클린 아키텍처를 꼭 사용해야 하나?
사실 클린아키텍처를 꼭 사용해야 하는 것은 아니다. 다만, 진행하는 프로젝트가 클린 아키텍처를 적용했을 때 이점이 있다면 시도해 보는 것은 좋은 것 같다. 클린 아키텍처에 대한 코드를 작성해 보며 느낀 점은 기존 MVC + 단일 모듈로 작성된 코드보다 클래스의 수가 비교가 안될 정도로 많아진다는 것이다. 따라서, 해당 코드를 수정하기 위해서는 클린 아키텍처의 개념 + 적용된 기술 + 소스 코드의 전반적인 이해도가 뒷받침되어야 한다.
그러므로, 만약 간단한 프로젝트를 계획 중이라면 클린 아키텍처를 설계하고 개발하는데 시간이 훨씬 오래 걸릴 수 있다. 하지만 복잡한 프로젝트의 경우 각 계층이 명확하기 분리되어 있는 클린 아키텍처를 사용한다면 테스트와 유지보수가 용이해지는 장점을 가진다. 추가적으로, 인터페이스에 대한 의존성이 없어져 인터페이스가 변경되더라도 클라이언트는 그대로 사용할 수 있다는 등의 장점도 있다.
어디까지나 아키텍처의 개념이기 때문에 조금 더 효율적인 방법을 선택하는 게 가장 좋은 선택일 것 같다.
마치며
클린 아키텍처의 개념에 대해 학습하면서 코드를 조금 더 구조적으로 짜기 위해 노력하고 있다. 사실 위 내용으로만 봤을 때는 큰 이점을 느끼지 못하지만, 실제 코드를 작성하다 보니 기존 기능의 수정이라던가 추가 등에는 효율적이라고 느꼈다. 아직 학습할 부분들이 많아서 추가적으로 학습하며 글을 작성해 볼 계획이다.
Reference
Clean Coder Blog
The Clean Architecture 13 August 2012 Over the last several years we’ve seen a whole range of ideas regarding the architecture of systems. These include: Though these architectures all vary somewhat in their details, they are very similar. They all have
blog.cleancoder.com
[Android] 요즘 핫한 Clean Architecture 왜 쓰는 거야? : NHN Cloud Meetup
[Android] 요즘 핫한 Clean Architecture 왜 쓰는 거야?
meetup.nhncloud.com