본문 바로가기
프로그래밍

클린 아키텍처 개념과 핵심 원칙 총정리 🧱✨

by Mastre 2024. 10. 27.

서론: 클린 아키텍처란 무엇인가?

클린 아키텍처(Clean Architecture)는 소프트웨어 설계의 복잡성을 줄이고, 시스템의 유지보수성과 확장성을 높이는 데 중점을 둔 설계 원칙입니다. 이 아키텍처는 소프트웨어가 견고하고 유연하게 설계되어야 한다는 전제하에, 의존성을 최소화하고 계층 구조를 분리해 모듈화를 이끌어냅니다. 로버트 C. 마틴(‘Clean Code’의 저자)으로부터 제안된 이 개념은 개발자들이 높은 품질의 코드와 구조를 유지할 수 있도록 돕는 핵심 원칙들을 제시합니다.

핵심 키워드

  • 의존성 관리
  • 계층 분리
  • 유지보수성
  • 확장성

클린 아키텍처의 4가지 핵심 계층 🏛️

1. 엔티티(Entity) 계층

엔티티 계층은 애플리케이션의 핵심 비즈니스 로직을 담당합니다. 이 계층의 구성 요소는 주로 데이터베이스나 외부 요소에 종속되지 않고 독립적입니다. 이를 통해 높은 재사용성을 유지하며 애플리케이션 전반에 걸쳐 일관된 상태를 유지할 수 있습니다.

  • 역할: 비즈니스 규칙 정의
  • 특징: 외부 의존성 없음
  • 예시: 고객 정보 관리 로직, 상품 가격 계산 규칙

2. 유스케이스(Use Cases) 계층

유스케이스 계층은 사용자와의 상호작용을 관리하며, 비즈니스 로직의 흐름을 제어합니다. 이 계층은 엔티티 계층을 활용하여 구체적인 작업을 수행하는 로직을 포함하고 있으며, 인터페이스를 통해 외부 요청을 수용합니다.

  • 역할: 특정 작업 및 프로세스 관리
  • 특징: 인터페이스를 통해 독립성 유지
  • 예시: 주문 프로세스 관리, 결제 처리

3. 인터페이스 인터랙터(Interface Adapters) 계층

이 계층은 데이터가 유스케이스 계층과 엔티티 계층에서 다룰 수 있도록 변환을 담당합니다. 데이터베이스, UI, API와 같은 외부 요소를 내부 계층과 연결하여 상호작용을 가능하게 합니다. 따라서, 애플리케이션이 외부와 연결되는 입출력 포트 역할을 수행합니다.

  • 역할: 외부 시스템과의 데이터 통신 관리
  • 특징: 외부 시스템과의 연결 인터페이스 구현
  • 예시: REST API를 통한 데이터 전송, UI 업데이트

4. 프레임워크 및 드라이버(Frameworks & Drivers) 계층

프레임워크 및 드라이버 계층은 애플리케이션이 실행되는 실제 환경을 구성합니다. 이 계층은 웹 서버, 데이터베이스, UI 프레임워크 등을 포함하며, 외부 구성 요소를 애플리케이션에 연결합니다. 이 계층은 비즈니스 로직에 영향을 주지 않도록 의존성을 외부에서 내부로만 전달하는 것이 중요합니다.

  • 역할: 실행 환경과 애플리케이션을 연결
  • 특징: 애플리케이션 핵심 로직과 분리된 계층
  • 예시: Django, Spring, MySQL, HTTP 클라이언트

클린 아키텍처의 핵심 원칙 🎯

1. 의존성 역전 원칙 (Dependency Inversion Principle)

클린 아키텍처는 의존성 역전 원칙(DIP)을 따릅니다. 이 원칙에 따르면, 상위 계층은 하위 계층에 의존하지 않고, 추상화된 인터페이스를 통해 소통합니다. 이를 통해 각 계층이 독립적으로 변경될 수 있습니다.

  • 핵심 개념: 상위 모듈은 하위 모듈에 의존하지 않는다.
  • 장점: 각 계층이 독립적으로 관리 가능해, 유지보수 비용 절감.

2. 엔티티 보호 원칙 (Entities First)

엔티티 계층은 애플리케이션의 핵심 비즈니스 로직을 담당하므로, 다른 계층에서 이 계층을 직접 수정하지 않도록 보호해야 합니다. 이를 통해 데이터의 일관성을 유지하고 비즈니스 로직이 안전하게 관리됩니다.

  • 핵심 개념: 엔티티 계층은 독립적이며 안전하게 보호됨.
  • 장점: 비즈니스 로직의 변경이 쉽게 이루어지며, 데이터 일관성 보장.

3. 경계 설정 원칙 (Boundary Setting Principle)

클린 아키텍처에서는 각 계층이 명확한 경계를 설정하여 상호 간의 의존성을 최소화합니다. 이러한 경계를 통해 각 계층이 다른 계층에 쉽게 영향을 받지 않으며, 변경 가능성과 확장성이 증가합니다.

  • 핵심 개념: 계층 간의 명확한 경계를 설정하여 의존성 최소화.
  • 장점: 유지보수성 향상, 코드 변경에 대한 충격 감소.

4. 단일 책임 원칙 (Single Responsibility Principle)

각 계층과 모듈은 단일 책임(Single Responsibility Principle, SRP)을 가져야 합니다. 이를 통해 각 모듈은 특정한 기능만을 담당하며, 필요 시 각 기능을 독립적으로 변경할 수 있습니다. 이는 버그 발생 가능성을 줄이고 코드의 가독성을 높이는 데 기여합니다.

  • 핵심 개념: 각 계층은 단일한 책임만을 수행한다.
  • 장점: 가독성 향상, 변경 용이성 증가, 코드 품질 향상.

클린 아키텍처의 이점과 도입 시 고려 사항 💡

클린 아키텍처는 모듈화된 코드 구조를 제공하여 유지보수성과 확장성이 뛰어난 소프트웨어 시스템을 구축할 수 있습니다. 그러나 초기 도입 시 학습 비용이 높고, 각 계층을 명확히 분리하는 데 시간이 소요될 수 있다는 점에서 신중한 고려가 필요합니다. 특히 소규모 프로젝트에서는 과도한 아키텍처 설계가 오히려 개발 속도를 저하시킬 수 있으므로, 프로젝트의 규모와 복잡성을 평가하여 적절히 적용하는 것이 중요합니다.


클린 아키텍처 도입 시 자주 묻는 질문 (Q&A) 🙋‍♂️

Q1. 클린 아키텍처는 어떤 프로젝트에 적합한가요?

  • 클린 아키텍처는 장기적인 유지보수와 확장이 요구되는 대규모 프로젝트에 적합합니다. 소규모 프로젝트에는 과도한 설계일 수 있습니다.

Q2. 클린 아키텍처를 도입하면 성능에 영향을 미치나요?

  • 일부 계층 구조로 인해 성능이 다소 느려질 수 있으나, 최적화된 설계를 통해 이러한 영향을 최소화할 수 있습니다.

Q3. 클린 아키텍처의 계층을 모두 사용해야 하나요?

  • 필요에 따라 일부 계층을 생략할 수 있습니다. 중요한 것은 의존성을 제어하고 비즈니스 로직을 명확히 분리하는 것입니다.

Q4. 클린 아키텍처와 다른 설계 패턴을 함께 사용할 수 있나요?

  • 네, 클린 아키텍처는 MVCMVVM과 같은 다른 설계 패턴과 함께 사용할 수 있으며, 이러한 패턴들이 클린 아키텍처의 원칙을 따르도록 구성할 수 있습니다.

Q5. 클린 아키텍처의 단점은 무엇인가요?

  • 초기 학습 곡선이 있으며, 프로젝트의 복잡성이 커질 수 있습니다. 소규모 프로젝트에서는 비효율적일 수 있습니다.