클린 아키텍처란?
클린 아키텍처는 무엇을 말하는 걸까요? 그리고 왜 사용하는 걸까요?
클린 아키텍처는 Robert C. Martin이 제안한 아키텍처로 "소프트웨어 시스템의 구조를 비즈니스 규칙 중심으로 설계하고, 유지보수성, 테스트 용이성, 확장성을 강조하는 아키텍처 패턴"입니다.
위의 그림처럼 외부 원에서 내부 원 방향으로 화살표가 향하는 것을 볼 수 있습니다.
이는 🔗의존성 방향으로 원 중앙으로 갈수록 "내부는 외부를 의존하지 않는다", "내부는 외부가 뭘 하는지 모른다"라는 의미입니다.
비즈니스 규칙 중심으로 설계한다는 말은 비즈니스가 가장 중요한 부분이므로 외부의 영향을 받지 않도록 설계한다는 말입니다.
즉, 비즈니스 또는 내부는 외부에 의존하지 않고 고유하게 작동되도록 관심사를 분리해 설계하는 것이 클린 아키텍처의 핵심입니다.
여기서 내부 원으로 갈수록 고수준이라 하며, 외부 원으로 갈수록 저수준이라고 합니다.
의존성의 방향은 저수준에서 고수준으로 향하며 고수준 계층은 저수준 계층을 알지 못합니다. (의존성 방향 : 저수준 → 고수준)
이는 고수준 계층의 요소에서 저수준 계층에 선언된 이름(class, function, variable 등)이 언급되지 않아야 한다는 말입니다.
클린 아키텍처의 구조
클린 아키텍처는 네 가지 계층으로 구분됩니다. 각 계층의 구성 요소는 특정 역할을 수행하며 시스템의 층을 나누고 관심사를 분리합니다.
엔터프라이즈 비즈니스 규칙 Enterprise Business Rules
가장 고수준에 해당하는 계층으로 비즈니스 도메인에 대한 핵심 규칙, 로직를 정의하는 계층입니다.
이 계층은 어떠한 프레임워크나 기술에 의존하지 않고 비즈니스 로직을 처리합니다.
핵심 비즈니스 도메인 로직을 추상적으로 정의하며 업무 규칙이 변경되더라도 다른 계층에 영향을 미치지 않도록 격리되어야 합니다.
EX. 은행의 계좌 개설, 입출금 등의 비즈니스 규칙
어플리케이션 비즈니스 규칙 Application Business Rules
엔터프라이즈 비즈니스 규칙을 실제 어플리케이션에서 실행 가능한 형태로 구현하는 계층입니다.
엔터프라이즈 비즈니스 규칙을 구체적인 어플리케이션 로직으로 변환하고, 어플리케이션의 흐름을 관리합니다.
즉, 비즈니스 도메인의 구체적인 구현을 다룹니다.
EX. 은행 어플리케이션에서 계좌를 생성하거나 입출금을 처리하는 로직
인터페이스 어댑터 Interface Adapters
사용자 인터페이스, 데이터베이스, 외부 서비스와의 상호작용, 웹 프레임워크 등과의 통신을 처리합니다.
내부 어플리케이션 계층과 외부 리소스 및 서비스를 연결하며, 외부 데이터를 내부 데이터 모델로 변환하거나 그 반대의 변환도 수행합니다.
즉, 내부 어플리케이션과 외부와의 인터페이스 및 데이터 흐름을 처리합니다.
EX. 사용자와 어플리케이션의 상호작용 / 데이터베이스와의 상호작용 / 외부 웹 서비스 API 통신
프레임워크 및 드라이버 Frameworks & Drivers
이 계층은 가장 외부에 위치하며 실제 프레임워크, 라이브러리, 데이터베이스, 웹 서버 등과 상호작용합니다.
외부 리소스와 기술적인 부분을 관리하며 프레임워크와 통합을 처리합니다.
EX. 웹, 앱 프레임워크 / 데이터베이스 드라이버 / HTTP 서버의 외부 요청 처리, 응답 생성
클린 아키텍처의 장단점
장점
- 코드 테스트 커버리지 증대
- 패키지 구조 탐색 용이
- 집중화된 클래스에 따른 프로젝트 유지 관리 증대
- 새 기능을 빠르게 적용 가능
- 이후의 개발에도 안정적인 구현
- 명확한 규율로 전반적으로 따라야 할 Best Practice 제공
단점
- 가파른 학습 곡선. 모든 레이어가 함께 작동하는 방식을 이해하는 것이 어렵다.
- 많은 클래스를 추가하므로 복잡성이 낮은 프로젝트에는 적합하지 않다.
모든 프로젝트에 클린 아키텍처를 반드시 적용해야 하는 것은 아닙니다.
프로젝트의 규모, 난이도에 따라 클린 아키텍처를 도입할 수도 있고, 특정 레이어를 구현하지 않을 수도 있습니다.
클린 아키텍처의 개념을 학습하고 프로젝트에 실제로 구현하는 것은 많은 연습이 필요합니다.
저 역시 처음에는 많이 헤매고 여러 프로젝트에 적용해보며 하나씩 개념을 이해하고 동작하는 방식을 이해했습니다.
그래도 아직 모르는 부분도 많고 올바른 구현인지도 헷갈리지만
확실한 것은 프로젝트의 아키텍처의 틀이 한 번 잡히면 빠른 기능 추가와 디버깅이 용이함을 체감했습니다.
본인이 다루고 있는 프레임워크에서 Entities, Controller 등의 개념을 실제로 어떻게 구현해야 하는지 막막할 수 있습니다.
또한 구현했다고 해서 동작 원리나 데이터의 흐름을 처음에는 한눈에 파악하기 어려울 수 있습니다.
따라서 각자의 프레임워크안에서 클린 아키텍처와 일치되는 개념을 파악하고
특정 역할을 수행하도록 관심사에 따라 레이어를 나누고,
의존성을 고려하며 계층을 구분해서 클린 아키텍처의 원들이 떠오르게 구현해보세요.
다른 분들의 코드를 살펴보는 것도 많은 도움이 됩니다.
그러나 정답이라는 것이 없어 각자의 방식이 조금씩 달라 더 헷갈릴 수도 있습니다.
그러니 프로젝트에 계속 적용해보고 실험해보면서 자신만의 방식을 찾아 개선시켜나가는 것이 좋습니다.