8.7 KiB
8.7 KiB
category, tags, title, description, last_updated
| category | tags | title | description | last_updated | ||
|---|---|---|---|---|---|---|
| Unified |
|
클린 아키텍처 (Clean Architecture) | 클린 아키텍처(Clean Architecture)는 로버트 C. | 2026-05-02 |
클린 아키텍처 (Clean Architecture)
📌 Brief 시 Summary
클린 아키텍처(Clean Architecture)는 로버트 C. 마틴("Uncle Bob")이 대중화한 설계 철학으로, 비즈니스 로직과 애플리케이션 규칙을 시스템의 중심에 배치하는 접근법입니다 [1]. 소프트웨어를 동심원 형태의 계층으로 구성하여 데이터베이스, 사용자 인터페이스(UI), 프레임워크 등 외부 요소로부터 시스템을 독립적으로 만듭니다 [1]. 핵심 원칙인 '의존성 규칙(Dependency Rule)'을 통해 모든 소스 코드의 의존성이 내부의 비즈니스 로직을 향하도록 강제함으로써, 고도로 테스트 가능하고 유지보수 및 조정이 용이한 시스템을 구축하는 것을 목표로 합니다 [1].
📖 Core Content
클린 아키텍처는 코드베이스를 역할에 따라 뚜렷한 책임 계층으로 분리하여 관리합니다 [2].
-
동심원 계층 구조 (Concentric Layers):
- 엔티티 (Entities): 가장 안쪽 계층으로, 전사적인 비즈니스 규칙과 핵심 데이터 구조를 포함합니다 [2]. 이 계층은 외부 계층의 변화에 전혀 영향을 받지 않는 순수한 도메인 객체들로 구성됩니다 [2].
- 유즈케이스 (Use Cases): 애플리케이션에 특화된 비즈니스 규칙을 담고 있는 계층입니다 [2]. 엔티티로 들어오고 나가는 데이터의 흐름을 오케스트레이션하여 특정 비즈니스 목표를 달성하도록 지시합니다 [2].
- 인터페이스 어댑터 (Interface Adapters): 유즈케이스 및 엔티티에서 사용하기 가장 편리한 형식의 데이터를 데이터베이스나 웹 등 외부 에이전시에 편리한 형식으로 변환하는 역할을 합니다 [2]. 프레젠터(Presenters), 뷰(Views), 컨트롤러(Controllers)가 이 계층에 속합니다 [2].
- 프레임워크 및 드라이버 (Frameworks & Drivers): 가장 바깥쪽 계층으로, 데이터베이스, 웹 프레임워크, UI 등 시스템에서 가장 변동성이 큰 외부 도구와 프레임워크들로 구성됩니다 [2].
-
의존성 관리와 코드베이스 분석 원리:
- 의존성 규칙(Dependency Rule) 강제: 모든 소스 코드의 의존성은 반드시 안쪽(핵심 비즈니스 로직)을 향해야 하며, 내부 계층은 외부 계층에 대해 전혀 알지 못해야 합니다 [1, 3].
- 의존성 역전(Dependency Inversion)의 활용: 내부 계층에서 외부의 기능이 필요할 때는 '포트(Ports)' 역할을 하는 인터페이스를 정의하고, 외부 계층에서 이를 구체화하는 '어댑터(Adapters)'를 구현합니다 [3, 4].
- 코드베이스 해독 전략: 대규모 시스템의 코드베이스를 분석할 때, 엔지니어는 인터페이스를 찾고 이를 구현하는 구체적인 클래스들이 외부 패키지에 위치하는지를 확인하여 클린 아키텍처의 준수 여부와 전체적인 의존성 방향을 해석할 수 있습니다 [4].
⚖️ Trade-offs & Caveats
- 높은 구현 복잡성 (High Implementation Complexity): 엄격한 동심원 형태의 계층화와 추상화를 강제하므로, 경계를 설계하고 유지하는 데 초기에 높은 복잡성이 따릅니다 [5].
- 요구되는 자원과 역량: 이 구조를 올바르게 구현하고 유지하려면 숙련된 개발자와 포괄적인 테스트 환경이 요구됩니다 [5].
- 오버엔지니어링의 위험: 단순한 애플리케이션의 경우 클린 아키텍처의 도입이 불필요한 추상화 계층을 양산할 수 있으며, 이 패턴은 주로 수명이 길고 미션 크리티컬(mission-critical)한 다중 UI 시스템에 가장 적합합니다 [5].
🔗 Knowledge Connections
Related Concepts
[관계 유형 A (아키텍처/설계 원칙)]
-
의존성 역전 원칙 (Dependency Inversion Principle)
- 연결 이유: 클린 아키텍처의 핵심인 '의존성 규칙'을 실제로 코드 상에서 구현하게 해주는 SOLID 원칙의 핵심 요소입니다 [3, 4, 6].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 내부의 비즈니스 로직이 외부 데이터베이스나 프레임워크에 직접적으로 의존하지 않도록, 인터페이스(포트)와 구현체(어댑터)를 분리하여 코드를 읽고 설계하는 구조적 원리 [3, 4].
-
계층형 아키텍처 (Layered Architecture)
- 연결 이유: 시스템을 계층으로 나눈다는 점에서는 유사하나, 의존성의 방향이 단방향(하향식)으로 흐르는 전통적 구조로 클린 아키텍처와 자주 비교됩니다 [1, 7].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 프레젠테이션, 비즈니스 로직, 데이터 액세스 계층으로 나누는 전통적 방식의 한계와, 왜 클린 아키텍처가 비즈니스 룰을 최중심에 보호하려 하는지 비교 분석할 수 있습니다 [1, 7].
[관계 유형 B (구현/활용 도구)]
- 의존성 주입 (Dependency Injection)
- 연결 이유: 클린 아키텍처 구조에서 외부 계층의 구체적인 구현체(어댑터)를 런타임 시점에 내부 계층(포트)과 연결하기 위해 필수적으로 사용되는 기술입니다 [3].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 외부 프레임워크와의 결합도를 낮추고(loose coupling), 핵심 비즈니스 로직을 격리하여 코드의 단위 테스트(Testability)를 용이하게 만드는 방법 [3].
Deeper Research Questions
- 전통적인 계층형 아키텍처와 비교하여, 클린 아키텍처의 의존성 역전 구조는 장기적인 코드베이스 유지보수성과 확장성에 어떤 구체적인 이점을 제공하는가?
- 클린 아키텍처의 유즈케이스(Use Cases) 계층과 엔티티(Entities) 계층 간의 책임을 명확히 구분하는 기준은 무엇이며, 실제 복잡한 도메인 코드에서 이를 어떻게 식별할 수 있는가?
- 인터페이스 어댑터(Interface Adapters) 계층에서 외부 데이터 형식과 내부 데이터 형식을 변환할 때 발생하는 보일러플레이트 코드와 성능적 오버헤드를 어떻게 최소화할 수 있는가?
- 모놀리식 시스템에서 마이크로서비스 아키텍처로 점진적 이관을 수행할 때, 클린 아키텍처로 작성된 코드베이스의 경계 분리가 어떤 구조적 이점을 가져다주는가?
- 엄격한 의존성 규칙과 다수의 추상화 계층이 초기 개발 속도와 애자일(Agile) 조직의 기능 배포 주기에 미치는 부정적인 영향(Trade-off)은 무엇인가?
Practical Application Contexts
- Implementation: 순수한 비즈니스 로직(Entities, Use Cases)을 외부 프레임워크나 데이터베이스 관련 종속성 없이 작성하고, 의존성 주입(DI) 도구를 사용해 런타임에 외부 컴포넌트와 결합하도록 구현합니다 [3].
- System Design: 장기간 유지보수되어야 하는 미션 크리티컬한 시스템이거나, 웹 및 모바일 등 다양한 UI를 동시에 지원해야 하는 복잡한 분산 환경 시스템을 설계할 때 주된 청사진으로 사용됩니다 [5].
- Operation / Maintenance: 데이터베이스, UI, 서드파티 라이브러리 등 변동성이 높은 외부 인프라가 변경되더라도, 격리된 핵심 비즈니스 로직은 수정할 필요가 없어 장애 위험을 줄이고 유지보수성을 극대화합니다 [1].
- Learning Path: 복잡한 시스템의 코드베이스를 읽을 때, '포트' 역할을 하는 인터페이스와 '어댑터' 구현체를 식별하여 시스템의 의존성 방향과 아키텍처 스타일의 인지 능력을 높이는 학습 전략으로 활용됩니다 [4, 8].
- My Project Relevance: 코드베이스 탐색 시 하향식(Top-down) 및 상향식(Bottom-up) 분석을 수행할 때, 코드가 어떤 계층(외부 프레임워크인지 핵심 비즈니스 로직인지)에 속하는지 파악하여 코드의 역할과 한계를 명확히 분리하여 이해할 수 있습니다 [4, 9].
Adjacent Topics
- 도메인 주도 설계 (Domain-Driven Design, DDD)
- 확장 방향: 클린 아키텍처의 중심부에 위치하는 '엔티티'와 '유즈케이스'를 효과적으로 모델링하기 위해, 비즈니스 도메인 전문가와의 공통 언어(Ubiquitous Language)를 개발하고 시스템을 바운디드 컨텍스트(Bounded Contexts)로 분할하는 전략을 함께 탐구할 수 있습니다 [4, 10, 11].
Last updated: 2026-05-02