67 lines
9.8 KiB
Markdown
67 lines
9.8 KiB
Markdown
---
|
|
id: P-REINFORCE-WIKI-9A9A2669
|
|
category: "10_Wiki/💡 Topics/02_Architecture_Principles"
|
|
confidence_score: 0.95
|
|
tags: ['클린-아키텍처-(clean-architecture)', '헥사고날-아키텍처-(hexagonal-architecture)', '계층형-아키텍처-(layered-architecture)', '의존성-역전-원칙-(dependency-inversion-principle)', '마이크로서비스-아키텍처-(microservices-architecture)', 'architecture-principles']
|
|
last_reinforced: 2026-05-02
|
|
---
|
|
|
|
# [[클린 아키텍처 (Clean Architecture)]]
|
|
|
|
## 📌 Brief Summary
|
|
로버트 C. 마틴(Robert C. Martin)이 대중화한 클린 아키텍처는 소프트웨어를 여러 추상화 수준을 나타내는 동심원 계층으로 구성하는 설계 패러다임입니다 [1]. 이 아키텍처의 핵심 목적은 데이터베이스, UI, 프레임워크와 같은 외부 기술 요소로부터 애플리케이션의 핵심 비즈니스 규칙을 완벽하게 격리하고 보호하는 것입니다 [1, 2]. 의존성은 항상 외부에서 내부로만 향해야 한다는 엄격한 규칙을 적용하여, 장기적인 유지보수성과 기술 독립성, 그리고 뛰어난 테스트 용이성을 제공합니다 [3].
|
|
|
|
## 📖 Core Content
|
|
- **동심원 구조와 4가지 계층**: 클린 아키텍처는 일반적으로 4개의 동심원 계층으로 나뉩니다.
|
|
- **엔티티(Entities)**: 가장 안쪽에 위치하며 기술이나 특정 유스케이스에 얽매이지 않는 핵심적이고 재사용 가능한 비즈니스 규칙을 캡슐화합니다 [2].
|
|
- **유스케이스(Use Cases)**: 애플리케이션에 특화된 비즈니스 규칙을 포함하며, 엔티티를 오가는 데이터의 흐름을 조율합니다 [2].
|
|
- **인터페이스 어댑터(Interface Adapters)**: 유스케이스나 엔티티에 가장 편리한 데이터 형식을 웹, 데이터베이스, UI 등의 외부 기관이 요구하는 형식으로 변환하는 역할을 합니다 [2].
|
|
- **프레임워크 및 드라이버(Frameworks and Drivers)**: 가장 바깥쪽 계층으로, 웹 프레임워크, 데이터베이스, 메시징 시스템 등의 외부 도구와 기술을 포함합니다 [2].
|
|
- **의존성 규칙(Dependency Rule)**: 클린 아키텍처의 가장 중요한 원칙은 의존성이 반드시 '바깥쪽에서 안쪽으로만' 향해야 한다는 것입니다 [3, 4]. 외부 계층은 내부 계층에 의존하지만, 내부 계층은 외부의 데이터 형식이나 기술 구현을 전혀 알지 못합니다 [3, 5].
|
|
- **보안 및 규정 준수 향상**: 외부 시스템과 도메인 로직을 격리하여 방어적인 설계가 가능해집니다 [5]. 입력값 유효성 검사, 인증 및 인가는 어댑터 계층에 집중되어 악의적인 페이로드나 SQL 인젝션의 위험을 줄이고 핵심 로직을 보호합니다 [5]. 또한, 조정된 접근 제어를 통해 GDPR이나 HIPAA와 같은 규정 준수 프레임워크를 쉽게 충족시킬 수 있습니다 [6].
|
|
- **도메인 중심(Domain-centric)의 구조**: 기존의 전통적인 계층형 아키텍처(Layered Architecture)가 하향식(Presentation → Business → Database)으로 구성되었다면, 클린 아키텍처는 비즈니스 도메인이 중심이 되어 양쪽 기술 요소로부터 보호받는 구조(Presentation → Business ← Database)를 지향합니다 [7].
|
|
|
|
## ⚖️ Trade-offs & Caveats
|
|
- **과도한 오버헤드와 복잡성**: 대규모 엔터프라이즈 시스템에서는 장기적인 유지보수성을 제공하여 큰 이점을 주지만, 단순한 프로젝트나 스타트업의 빠른 MVP(Minimum Viable Product) 개발에 적용하기에는 초기 설정과 엄격한 계층 구조가 과도한 오버헤드를 유발합니다 [8-10].
|
|
- **보일러플레이트 코드 증가**: 각 계층마다 데이터 모델(또는 값 객체)을 독립적으로 정의하고 이를 변환(Mapping)하는 과정이 필요하기 때문에, 초기에는 패키지마다 복사-붙여넣기 한 것과 같은 유사한 보일러플레이트(Boilerplate) 코드가 다수 발생할 수 있습니다 [4].
|
|
- **가파른 학습 곡선**: 추상화, 디자인 패턴 등에 대한 높은 이해도와 원칙을 준수하기 위한 엄격한 규율이 요구되므로, 경험이 부족한 주니어 팀에게는 도입과 유지가 어려울 수 있습니다 [8, 11].
|
|
|
|
## 🔗 Knowledge Connections
|
|
|
|
### Related Concepts
|
|
|
|
#### [관계 유형 A: 아키텍처/기반 기술]
|
|
- [[헥사고날 아키텍처 (Hexagonal Architecture)]]
|
|
- 연결 이유: 클린 아키텍처는 헥사고날 아키텍처의 포트와 어댑터(Ports and Adapters) 개념을 수용하고 더 구체화한 형태이며, 외부 인프라로부터 핵심 로직을 격리한다는 철학을 직접적으로 공유합니다 [1, 12].
|
|
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 어떻게 외부 세계의 변경(데이터베이스 변경, API 통신 방식 변경)에도 애플리케이션 코어가 영향을 받지 않도록 플러그 앤 플레이(Plug-and-play) 방식의 유연성을 확보할 수 있는지 파악할 수 있습니다 [13].
|
|
- [[계층형 아키텍처 (Layered Architecture)]]
|
|
- 연결 이유: 클린 아키텍처가 극복하고자 하는 문제점(시간이 지남에 따른 컴포넌트 간 강한 결합 및 비즈니스 로직 분산)을 이해하기 위한 기본 대조군 아키텍처입니다 [7, 8, 14].
|
|
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 아키텍처를 매크로 관점(팀 및 조직 구조 매핑)에서 바라보는 것과, 핵심 비즈니스 레이어 내부를 보호하기 위한 마이크로 관점 설계의 차이를 이해할 수 있습니다 [15, 16].
|
|
|
|
#### [관계 유형 B: 구현/활용 도구]
|
|
- [[의존성 역전 원칙 (Dependency Inversion Principle)]]
|
|
- 연결 이유: 외부 어댑터(데이터베이스 등)가 내부 인터페이스(도메인)에 의존하도록 의존성 방향을 뒤집어(Inversion), 클린 아키텍처의 핵심인 '의존성 규칙'을 코드로 실현시키는 원리입니다 [17, 18].
|
|
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 인터페이스를 비즈니스 로직 쪽에 정의하고 구현은 인프라 영역에 둠으로써 결합도를 어떻게 극적으로 낮추는지 알 수 있습니다.
|
|
|
|
### Deeper Research Questions
|
|
- 클린 아키텍처를 적용할 때 각 계층을 통과하며 발생하는 객체 매핑(Mapping) 오버헤드와 보일러플레이트 코드를 최소화하면서도 계층의 독립성을 보장하는 실용적인 설계 전략은 무엇인가?
|
|
- 대규모 복잡성을 다루기 위한 클린 아키텍처를 작은 단위로 쪼개진 '마이크로서비스' 내부에 적용하는 것이 성능 및 개발 속도 측면에서 항상 합리적인가? (마이크로서비스와 클린 아키텍처의 결합 한계)
|
|
- 스타트업 환경에서 개발 속도를 위해 계층형 아키텍처로 시작한 시스템을 시스템 성장에 맞춰 점진적으로 클린 아키텍처로 리팩토링하는 단계별 접근법은 무엇인가?
|
|
- 의존성 역전 원칙(DIP) 구현 시 DI(Dependency Injection) 컨테이너에 대한 의존이 아키텍처의 프레임워크 독립성을 해칠 수 있는 딜레마를 어떻게 해결할 수 있는가?
|
|
- 데이터베이스나 외부 API 같은 세부 구현 기술이 전혀 정해지지 않은 프로젝트 초기 단계에, 클린 아키텍처의 엔티티와 유스케이스만을 사용하여 비즈니스 로직을 구축하고 테스트하는 구체적 사례는 어떠한가?
|
|
|
|
### Practical Application Contexts
|
|
- **Implementation:** 인프라 설정 전이라도 엔티티와 유스케이스를 먼저 코딩하고, 인메모리(in-memory) 구현체를 사용하여 도메인 로직에 대한 순수한 유닛 테스트를 빠르고 안정적으로 실행하는 환경을 구축합니다 [19].
|
|
- **System Design:** 보안 및 감사 요구사항이 높은 의료 데이터 시스템(HIPAA 준수 등)이나 글로벌 금융 뱅킹 플랫폼 설계 시, 규제 로직과 외부 인터페이스 어댑터를 중앙 핵심 비즈니스 로직으로부터 분리하기 위해 적극 도입합니다 [5, 6, 20].
|
|
- **Operation / Maintenance:** 서비스 중인 시스템의 UI 프레임워크를 변경하거나(예: React에서 Angular로), 기존 상용 데이터베이스를 오픈소스(예: Oracle에서 PostgreSQL)로 이관해야 할 때, 내부 비즈니스 로직의 수정 없이 최외곽 어댑터만 교체하여 안정적인 운영 마이그레이션을 돕습니다 [3, 20, 21].
|
|
- **Learning Path:** 단순 MVC 또는 계층형 아키텍처에서 출발하여 한계를 경험한 개발자가 SOLID 원칙(특히 의존성 역전)의 효용성을 깨닫고, 유연하고 테스트 가능한 소프트웨어 설계를 학습하는 고급 과정에 위치합니다.
|
|
- **My Project Relevance:** 나의 프로젝트가 장기적인 생명주기를 가지며 비즈니스 로직이 고도로 복잡할 경우 채택할 수 있으나, 만약 빠른 시간 안에 기능 검증이 목표인 초기 MVP 프로젝트라면 도입이 오버엔지니어링일 수 있어 신중한 판단이 필요합니다 [9, 22].
|
|
|
|
### Adjacent Topics
|
|
- [[마이크로서비스 아키텍처 (Microservices Architecture)]]
|
|
- 확장 방향: 시스템을 여러 서비스로 분할한 뒤, 복잡한 비즈니스 로직을 지닌 개별 마이크로서비스 '내부'의 견고함을 확보하기 위해 클린/헥사고날 설계 사상을 어떻게 결합하는지 확장하여 연구할 수 있습니다 [21].
|
|
- [[도메인 주도 설계 (Domain-Driven Design, DDD)]]
|
|
- 확장 방향: 클린 아키텍처의 코어인 '엔티티'와 '유스케이스'를 풍부하고 유의미하게 설계하기 위해, 비즈니스 도메인을 탐색하고 바운디드 컨텍스트(Bounded Context)를 모델링하는 구체적인 소프트웨어 공학 기법으로 학습이 이어집니다.
|
|
|
|
---
|
|
*Last updated: 2026-05-02* |