Policy vs. Detail
소프트웨어 아키텍처에서 Policy 와 Detail 의 분리는 시스템의 핵심 비즈니스 규칙과 외부 인터페이스, 기술적 구현을 명확히 구분하는 원칙이다. 정책은 시스템의 전체적인 동작과 구조를 정의하는 중요한 비즈니스 규칙과 관련된 결정으로, 변경될 가능성이 적고 안정적이다. 반면 상세 구현은 정책을 실행하기 위한 특정 기술, 프레임워크, 데이터베이스 등과 같은 구체적인 실행 방법에 관한 것으로, 상대적으로 자주 변경된다. 이러한 분리는 의존성을 올바른 방향으로 관리하여 시스템의 유연성, 확장성, 유지보수성을 크게 향상시키는 데 핵심적인 역할을 한다. 의존성 규칙을 통해 세부사항이 정책에 의존하도 함으로써 비즈니스 로직의 안정성을 보장하고, 기술적 변경으로부터 핵심 로직을 보호할 수 있다.
배경
Policy vs. Detail 개념은 Robert C. Martin 의 Clean Architecture 에서 체계화되었으며, 다음과 같은 문제점들을 해결하기 위해 등장했다:
- 기술 중심 설계의 문제: 비즈니스 로직이 기술적 세부사항에 강하게 결합
- 변경의 파급효과: 데이터베이스나 프레임워크 변경이 비즈니스 로직에 영향
- 테스트의 어려움: 외부 의존성으로 인한 단위 테스트 복잡성
- 재사용성 부족: 특정 기술에 종속된 비즈니스 로직
Policy vs. Detail 비교
Policy 와 Detail 의 구분은 소프트웨어 시스템에서 변경의 이유와 빈도, 중요도에 따라 결정된다. 이 분리를 통해 시스템의 핵심 가치를 보호하고 기술적 변경에 대한 유연성을 확보할 수 있다.
구분 | 정책 (Policy) | 상세 구현 (Detail) |
---|---|---|
정의 | 시스템의 고수준 비즈니스 규칙과 핵심 도메인 로직 | 정책을 실현하는 저수준 기술과 구체적 구현 메커니즘 |
역할 | " 무엇 " 과 " 왜 " 를 결정 | " 어떻게 " 를 구현 |
포함 내용 | 비즈니스 로직, 도메인 규칙, 엔티티, 유스케이스, 도메인 서비스 | 데이터베이스, UI, 웹 프레임워크, 외부 API, 통신 프로토콜 등 |
특징 | 안정적이며 변경 빈도가 낮음기술적 세부사항에 독립적시스템의 핵심 가치를 반영 | 변동성이 크고 교체 가능함구체적 기술과 환경에 의존정책을 지원하는 수단 |
결정 주체 | 아키텍트, 설계자 | 개발자, 인프라 담당자 |
의존 방향 | 외부 (상세 구현) 을 알지 않음 | 내부 (정책) 에 정의된 추상화에 의존함 |
추상성 | 높음 | 낮음 |
안정성 요구 | 높음 | 상대적으로 낮음 |
변경 빈도 | 낮음 | 높음 |
변경 이유 | 비즈니스 요구사항 변경 | 기술적 요구사항 변경 |
유연성 | 높음 (변화에 강함) | 낮음 (기술 변화에 민감) |
문서화 | 선언적, 개념적 | 절차적, 구체적 |
영향 | 시스템 전체에 영향 | 특정 모듈/컴포넌트에 국한 |
재사용성 | 높음 | 낮음 |
예시 | 주문 생성 시 재고 검증, 가격 계산 규칙, 포인트 적립 정책 등 | PostgreSQL, React, REST API, Kafka, gRPC 등 |
- 정책과 상세 구현을 분리함으로써 변경에 대한 영향을 최소화하고, 시스템의 유연성과 유지보수성을 향상시킬 수 있다.
- 정책과 상세 구현을 분리하기 위해서는 명확한 경계 (Boundary) 설정이 필요하다:
- 아키텍처 경계는 시스템의 다양한 영역 간의 명확한 구분선
- 각 경계는 인터페이스와 어댑터를 통해 소통
- 경계를 넘어서는 데이터는 단순하고 독립적인 구조여야 함
- 경계 인터페이스는 내부 원 (정책) 이 소유해야 함
- 각 영역에서 사용하는 데이터 형식은 해당 영역의 필요에 최적화되어야 함
- 로버트 C. 마틴 (Uncle Bob) 의 클린 아키텍처 (Clean Architecture) 는 정책 vs 상세 구현 원칙을 잘 구현한 아키텍처 패턴이다:
- 동심원 형태의 계층 구조로 표현됨
- 내부로 갈수록 더 높은 수준의 추상화 (정책) 를 포함
- 외부 원은 메커니즘 (상세 구현) 을, 내부 원은 정책을 담당
- 의존성 규칙을 철저히 준수하여 내부로만 향하도록 설계
- 정책은 구체적인 기술 선택에 영향을 받지 않음
Policy 중심 설계 vs. Detail 중심 설계 강점과 약점:
접근 방식 | 강점 | 약점 |
---|---|---|
Policy 중심 설계 | • 비즈니스 로직 안정성 • 높은 재사용성 • 독립적 테스트 가능 • 기술 변경에 유연함 | • 초기 설계 복잡도 • 추상화 오버헤드 • 학습 곡선 존재 |
Detail 중심 설계 | • 빠른 프로토타이핑 • 단순한 구조 • 프레임워크 활용 용이 | • 기술 종속성 • 변경 시 파급효과 • 테스트 어려움 • 재사용성 부족 |
의존성 규칙 (Dependency Rule):
항목 | 내용 |
---|---|
정의 | 소스 코드 의존성이 항상 내부 (정책) 를 향해야 한다는 원칙 |
주요 원칙 | - 고수준 모듈은 저수준 모듈에 의존하지 않음 - 저수준 모듈은 고수준 모듈이 정의한 인터페이스에 의존 |
기반 원칙 | 의존성 역전 원칙 (Dependency Inversion Principle) |
목적 | 시스템의 핵심 비즈니스 로직을 기술 변화로부터 보호하고, 아키텍처의 유연성과 유지보수성 향상 |
목적 및 효과
목적
목적 | Policy (정책) | Detail (상세 구현) |
---|---|---|
핵심 가치 보호 | 핵심 비즈니스 로직의 안정성과 지속성 보장 | 기술적 세부사항 변화로부터 정책 보호 |
유연성 확보 | 다양한 구현 환경에 적응 가능정책 재사용 용이 | 기술 스택 또는 외부 시스템의 자유로운 교체 가능 |
테스트 용이성 | 외부 의존성 없이 순수한 로직 테스트 가능 | Mock/Stub 등을 통한 외부 시스템 테스트 가능 |
유지보수성 향상 | 정책 변경이 시스템 전체에 영향을 주지 않도록 국소화 | 기술 업그레이드가 비즈니스 로직에 영향 없음 |
효과
핵심 효과 | Policy (정책) | Detail (상세 구현) |
---|---|---|
시스템 복잡성 관리 | - 비즈니스 로직을 명확히 분리해 상위 개념 중심으로 시스템 구조화 - 도메인 중심 설계로 이해도 향상 | - 구현 계층을 모듈화하여 기술적 복잡성 캡슐화 - 프레임워크, 라이브러리 의존 분리로 유지 쉬움 |
변경 영향 범위 최소화 | - 정책 변경 시 UI, DB 등 외부 요소에 영향 없음 - 규칙 변경의 국소화 가능 | - 기술 변경 시 정책에 영향 없음 - 구현 교체 (예: DB, API) 시 다른 계층에 영향 제한 |
시스템 유지보수성 향상 | - 규칙 중심으로 기능을 명확히 분리 - 확장성과 구조 변경이 쉬움 | - 기술 진화에 따른 모듈 교체 용이 - 환경별 구성 차이에 대응 쉬움 |
기술적 결정 유연성 확보 | - 초기 설계 시 기술에 의존하지 않고 정책 중심으로 설계 가능 - 기술 결정 지연 가능 | - 최신 기술 도입 시 정책과 무관하게 모듈 교체 - 선택 자유도 및 확장성 확보 |
테스트 용이성 증가 | - 순수 로직 테스트가 가능하므로 빠르고 안정적인 단위 테스트 가능 | - 의존성 격리를 통한 Mock 테스트 가능 - 통합 테스트 구성 용이 |
개발자의 관점에서 정책 (Policy) 과 상세 구현 (Detail) 의 분리는 관심사의 분리 (Separation of Concerns, SoC) 원칙을 매우 효과적으로 실현한다.
SoC 관점 요소 | 정책과 상세 구현 분리가 기여하는 방식 |
---|---|
기능별 책임 분리 | 비즈니스 규칙 (정책) 은 ’ 무엇을 할 것인가 ‘ 에만 집중하고, 기술 세부사항 (상세 구현) 은 ’ 어떻게 할 것인가 ‘ 에 집중함 |
모듈 간 결합도 감소 | 정책과 구현 간의 결합도를 낮추고, 구현은 정책의 추상화 (인터페이스) 에만 의존함으로써, 구현체 변경이 정책에 영향 없음 |
변경에 대한 영향 최소화 | 프레임워크, DB 등 저수준 세부사항 변경 시에도 정책 (핵심 로직) 은 영향받지 않음 → 하나의 concern 이 다른 concern 에 영향을 주지 않음 |
독립적 개발 및 테스트 가능 | 정책을 외부 시스템과 분리해 개발할 수 있으며, 테스트 시에도 구현 (예: DB, API) 없이 mock/stub 으로 검증 가능 |
코드 가독성과 유지보수성 향상 | 각 레이어가 명확한 책임을 갖기 때문에 의도 파악과 코드 구조 이해가 쉬워지고, 유지보수 비용이 낮아짐 |
주요 기능 및 역할
정책 vs 상세 구현 원칙은 소프트웨어 아키텍처에서 다음과 같은 주요 기능과 역할을 수행한다:
핵심 항목 | 설명 |
---|---|
관심사 분리 (Separation of Concerns) | - 각 계층이 단일 책임 원칙 (SRP) 을 가짐 - 비즈니스 로직이 기술 구현으로부터 격리됨 - 개발자는 한 가지 관심사에 집중 가능 |
의존성 관리 (Dependency Management) | - 의존성은 항상 상세 구현 → 정책 방향으로 흐름 - 안정적인 정책 계층이 변동성 높은 구현 계층에 영향받지 않음 - 의존성 역전 원칙 (DIP) 적용 |
아키텍처 경계 정의 (Architectural Boundaries) | - 관심사 간 명확한 인터페이스 정의 - 데이터 변환 및 통신 규약 명세 - 계층 간 데이터 포맷 및 메시지 구조 표준화 |
플러그인 아키텍처 지원 (Plug-in Architecture) | - 상세 구현을 독립적이고 교체 가능한 플러그인으로 취급 - UI, DB, 프레임워크 등을 유연하게 교체 가능 - 핵심 정책 로직과 구현 간 결합도 최소화 |
특징
정책 vs 상세 구현 원칙의 주요 특징은 다음과 같다:
핵심 원칙 | 설명 |
---|---|
계층화된 아키텍처 | - 정책은 내부, 구현은 외부에 위치한 동심원 구조 - 각 레이어는 추상화 수준에 따라 분리됨 - 레이어 간 통신은 명확한 인터페이스 기반 |
소스 코드 의존성 방향 제어 | - 저수준 모듈 → 고수준 모듈 방향으로만 의존성 흐름 - 고수준 모듈은 저수준 모듈의 존재를 모름 - 런타임 의존성과 컴파일 의존성 분리 가능 |
프레임워크 독립성 | - 정책 계층은 프레임워크에 전혀 의존하지 않음 - 프레임워크는 " 플러그인 " 처럼 사용 - 교체 및 업그레이드가 용이한 구조 확보 |
테스트 용이성 | - 비즈니스 로직은 외부 요소 없이 단독 테스트 가능 - 각 계층은 독립적으로 테스트 가능 - 테스트 자동화 및 커버리지 향상에 기여 |
정책과 구현 분리를 위한 핵심 아키텍처 설계 원칙
정책 vs 상세 구현 원칙을 구현하기 위한 핵심 원칙들은 다음과 같다:
원칙명 | 설명 |
---|---|
의존성 규칙 (Dependency Rule) | - 소스 코드 의존성은 항상 외부 → 내부 (저수준 → 고수준) 으로 향함 - 정책 계층은 구현 계층의 존재를 알지 않아야 함 - 안정적인 요소에만 의존하도록 설계 |
의존성 역전 원칙 (DIP) | - 고수준 모듈과 저수준 모듈 모두 추상화 (인터페이스) 에 의존 - 세부 구현은 추상화에 따라야 하며, 추상화는 구현에 의존하지 않음 SOLID 원칙 중 하나 |
플러그인 아키텍처 원칙 | - DB, UI, 프레임워크 등을 교체 가능한 플러그인 으로 간주 - 핵심 로직이 중심에 위치하고, 플러그인이 이를 참조함 - 플러그인은 핵심 로직이 정의한 인터페이스를 구현 |
경계 컨텍스트 원칙 (Boundary Context) | - 시스템을 도메인 또는 기능 단위로 명확한 경계 로 구분 - 인터페이스 및 데이터 포맷은 단순하고 중립적 - 한 영역의 변경이 다른 영역에 영향을 주지 않도록 설계 |
정책 (Policy) vs. 상세 구현 (Detail) 의 아키텍처 설계 원칙 정리
구분 | 설명 |
---|---|
의존성 방향 제어 | - 정책 (고수준) 은 구현 (저수준) 에 의존하지 않음 - 구현이 정책의 인터페이스에 의존함 - DIP (의존성 역전 원칙) 적용 |
계층화된 구조 | - 동심원 계층 구조 - 내부에서 외부 방향: Entities → Use Cases → Interface Adapters → Frameworks |
경계 및 인터페이스 설계 | - 각 계층 간 명확한 경계 정의 - 인터페이스는 정책 계층에서 소유 - 경계를 넘는 데이터는 중립적, 단순한 구조 사용 |
데이터 흐름 제어 | - 외부 → 내부: 사용자 입력, 외부 이벤트 등 - 내부 → 외부: 비즈니스 처리 결과를 외부에 전달 (예: UI, DB 저장 등) |
의존성 규칙 | - 소스코드 의존성은 항상 바깥에서 안쪽으로 향함 - 외부 계층 변경이 내부 계층에 영향을 주지 않음 |
flowchart TD %% Clean Architecture Layers subgraph "Clean Architecture Layers" D[Frameworks & Drivers<br/>프레임워크 & 드라이버] C[Interface Adapters<br/>인터페이스 어댑터] U[Use Cases<br/>유스케이스] E[Entities<br/>엔티티] end %% 의존성 흐름 D --> C C --> U U --> E %% 시맨틱 분류: Policy vs Detail classDef policy fill:#4caf50,color:#fff,stroke:#2e7d32,stroke-width:2px classDef adapter fill:#ff9800,color:#fff,stroke:#ef6c00,stroke-width:2px classDef detail fill:#f44336,color:#fff,stroke:#b71c1c,stroke-width:2px class E,U policy class C adapter class D detail
의존성 규칙 (Dependency Rule):
- 소스 코드 의존성은 항상 안쪽 (고수준) 을 향해야 함
- 내부 계층은 외부 계층에 대해 아무것도 알지 말아야 함
- 외부 계층의 변경이 내부 계층에 영향을 주지 않아야 함
분류에 따른 종류 및 유형
정책 vs 상세 구현 원칙은 다양한 아키텍처 패턴을 통해 구현될 수 있다:
유형 | 설명 | 특징 |
---|---|---|
클린 아키텍처 (Clean Architecture) | 로버트 C. 마틴 (Uncle Bob) 이 제안한 아키텍처 | - 동심원 형태의 레이어 - 의존성이 항상 내부로 향함 - 엔티티, 유스케이스, 인터페이스 어댑터, 프레임워크의 4 계층 구조 |
헥사고날 아키텍처 (Hexagonal Architecture) | 알리스테어 콕번 (Alistair Cockburn) 이 제안한 포트와 어댑터 아키텍처 | - 내부 (비즈니스 로직) 와 외부 (인프라) 구분 - 포트 (인터페이스) 와 어댑터 (구현) 로 연결 - 육각형 형태로 모든 방향의 외부 연결 표현 |
양파 아키텍처 (Onion Architecture) | 제프리 팔레모 (Jeffrey Palermo) 가 제안한 계층형 아키텍처 | - 동심원 형태의 구조 - 중심에 도메인 모델 위치 - 도메인 서비스, 애플리케이션 서비스, 외부 계층으로 구성 |
DCI 아키텍처 (Data, Context, Interaction) | 트라이그브 렌스켜그 (Trygve Reenskaug) 와 제임스 코플리엔 (James Coplien) 이 제안 | - 데이터 (객체 상태), 컨텍스트 (환경), 상호작용 (행위) 분리 - 역할 기반 모델링 - 사용자 멘탈 모델과 코드 일치 강조 |
BCE 아키텍처 (Boundary-Control-Entity) | 아이바 제이콥슨 (Ivar Jacobson) 이 제안한 객체지향 아키텍처 | - 경계 (UI), 제어 (비즈니스 로직), 엔티티 (데이터) 로 구분 - 유스케이스 중심 설계 - 자코비안 객체 지향 소프트웨어 공학 (OOSE) 의 일부 |
계층형 아키텍처 (Layered Architecture) | 가장 일반적인 다층 아키텍처 패턴 | - 수평적 계층으로 구성 - 각 계층은 특정 책임 담당 - 일반적으로 표현, 비즈니스, 영속성 계층으로 구분 |
CQRS (Command Query Responsibility Segregation) | 명령과 조회 책임 분리 | - 명령 (데이터 변경) 과 조회 (데이터 읽기) 모델 분리 - 각 모델에 최적화된 구현 가능 - 이벤트 소싱과 자주 결합 |
동심원 계층 구조 (Concentric Layer Structure)
클린 아키텍처에서는 동심원 형태의 계층 구조로 표현된다:
계층명 | 주요 역할 및 내용 | 의존성 | 특징 |
---|---|---|---|
엔티티 계층 (Entities Layer) | - 핵심 비즈니스 규칙과 데이터 구조 포함 - 기업 전반에 적용되는 도메인 모델 - 가장 안정적인 로직 포함 | 없음 (독립적) | - 변경 가능성 가장 낮음 - 재사용성 높음 |
유스케이스 계층 (Use Cases Layer) | - 애플리케이션의 특정 비즈니스 로직 - 유스케이스 단위의 도메인 로직 실행 - 엔티티와 상호작용 | 엔티티 계층만 의존 | - UI/DB 독립 - 비즈니스 절차 흐름 제어 |
인터페이스 어댑터 계층 (Interface Adapters Layer) | - 외부 ↔ 내부 데이터 변환 - 컨트롤러, 프레젠터, 게이트웨이 포함 - MVC 구성요소 위치 | 유스케이스, 엔티티 계층에 의존 | - 입출력 포맷 처리 - 외부 세계와 내부 도메인 연결 역할 |
프레임워크 및 드라이버 계층 (Frameworks & Drivers Layer) | - DB, UI, 웹 서버, 외부 API 등 - 기술적 구현 및 외부 도구 위치 - 상세 구현 담당 | 인터페이스 계층에서 정의한 추상화에 의존 (역방향) | - 변경 가능성 높음 - 내부 정책에 영향 주지 않아야 함 |
- 의존성 방향은 항상 바깥 → 안쪽 (Detail → Policy) 으로 향함
- 안쪽 계층 (Entities, Use Cases) 은 외부 기술에 대해 전혀 알지 않아야 함
- 가장 바깥 계층 (Frameworks & Drivers) 은 교체 가능한 플러그인처럼 동작해야 함
- 각 계층은 자신보다 더 안쪽 계층만 참조 가능
헥사고날 아키텍처 (Hexagonal Architecture) 구조
또 다른 구현 방식인 헥사고날 아키텍처는 다음과 같은 구조를 가진다:
구성 요소 | 설명 |
---|---|
내부 영역 (Inside) | - 핵심 비즈니스 로직 및 도메인 모델 - 외부 기술에 대한 의존 없음 - 포트를 통해 외부와 통신 |
외부 영역 (Outside) | - 데이터베이스, 사용자 인터페이스, 외부 API 등 - 내부 로직과 직접 연결되지 않음 - 어댑터를 통해 통신 |
포트 (Ports) | - 내부 영역에서 정의한 인터페이스 - 내부가 외부에 필요로 하는 동작의 명세 - 예: OrderRepository , PaymentGatewayPort |
어댑터 (Adapters) | - 포트를 구현한 실제 클래스 또는 모듈 - 외부 시스템과 포트 간 데이터 변환 수행 - 예: OrderRepositoryImpl , HttpPaymentGatewayAdapter |
- 내부는 순수한 비즈니스 로직만 포함하며, 외부와의 연결은 모두 추상화된 포트를 통해 이루어짐
- 외부 시스템 (예: DB, API) 은 내부의 포트를 구현하는 어댑터를 통해 연결됨
- 포트와 어댑터는 경계 (Interface) 와 구현체 (Implementation) 관계로 분리됨
- 이 구조는 테스트 용이성, 프레임워크 독립성, 유연한 기술 교체에 유리함
클린 아키텍처 계층 구조 및 의존성 흐름
graph TB subgraph "Policy Layer (정책 계층)" E[Entities<br/>엔티티] UC[Use Cases<br/>유스케이스] DS[Domain Services<br/>도메인 서비스] end subgraph "Detail Layer (세부사항 계층)" DB[(Database<br/>데이터베이스)] WEB[Web Framework<br/>웹 프레임워크] UI[User Interface<br/>사용자 인터페이스] API[External API<br/>외부 API] end subgraph "Interface Adapters (인터페이스 어댑터)" REPO[Repository<br/>저장소] CTRL[Controller<br/>컨트롤러] PRES[Presenter<br/>프레젠터] end E --> UC UC --> DS UC -.-> REPO UC -.-> CTRL UC -.-> PRES REPO --> DB CTRL --> WEB PRES --> UI API --> CTRL classDef policy fill:#e1f5fe,stroke:#01579b,stroke-width:2px classDef detail fill:#fff3e0,stroke:#e65100,stroke-width:2px classDef adapter fill:#f3e5f5,stroke:#4a148c,stroke-width:2px class E,UC,DS policy class DB,WEB,UI,API detail class REPO,CTRL,PRES adapter
계층 | 구성 요소 | 역할 및 설명 |
---|---|---|
Policy Layer (정책 계층) | Entities , Use Cases , Domain Services | 시스템의 핵심 비즈니스 로직과 도메인 규칙을 정의하는 가장 내부 계층 |
Interface Adapters (인터페이스 어댑터) | Repository , Controller , Presenter | 정책 계층과 세부 구현 계층을 연결하는 어댑터 계층. 추상화된 인터페이스와 구현체를 연결 |
Detail Layer (세부사항 계층) | Database , Web Framework , UI , External API | 기술적으로 구체적인 구현 세부사항을 포함하며, 변경 가능성이 높은 외부 요소들 |
범주별 구성 요소
구성 범주 | 구성요소 | 설명 |
---|---|---|
Policy Components (정책 구성요소) | Entities | 도메인의 핵심 비즈니스 규칙을 캡슐화한 객체 |
Use Cases | 사용자 요구사항을 처리하는 애플리케이션 비즈니스 로직 | |
Domain Services | 복수 엔티티 간의 도메인 규칙을 처리하는 도메인 계층의 서비스 | |
Detail Components (세부사항 구성요소) | Frameworks | Express, NestJS, Spring 등 웹 프레임워크 및 기술적 도구 |
Databases | PostgreSQL, MongoDB 등 데이터 저장소 | |
External Interfaces | 외부 API, 파일 시스템, 클라우드 서비스 등 시스템 외부와 통신하는 인터페이스 | |
Boundary Components (경계 구성요소) | Interface Adapters | 도메인 모델 ↔ 외부 세계 간 데이터 포맷 변환 역할 |
Controllers | 사용자 요청을 수신하여 유스케이스를 호출하는 입구 역할 | |
Presenters | 응답 데이터를 ViewModel 또는 DTO 로 변환하는 역할 | |
Optional Components (선택 구성요소) | Gateways | 외부 API 또는 시스템과의 연결을 위한 어댑터 역할 |
Event Buses | 도메인 이벤트 기반의 비동기 메시지 전달 메커니즘 | |
Caching Layer | Redis 등 캐시를 이용한 성능 최적화 계층 |
의존성 방향:
- 항상 바깥에서 안쪽 (Detail → Adapter → Policy) 으로 향함
- Use Case는 Repository, Controller, Presenter에 대해 추상화만 알고 있으며, 실제 구현은 어댑터 계층에서 담당
- 이는 정책은 구현을 몰라도 되며, 구현은 정책의 인터페이스를 따르도록 강제하는 구조
장점과 단점
항목 | 장점 | 단점 |
---|---|---|
유지보수성 | - 코드 구조가 명확하여 수정이 쉬움 - 변경 범위가 국한되어 안정성 향상 | - 인터페이스와 경계 설계에 초기 복잡성 존재 |
테스트 용이성 | - 비즈니스 로직을 외부 의존성 없이 테스트 가능 - mock/stub 기반 테스트 용이 | - 계층 구조로 인한 테스트 구성 비용 증가 가능 |
기술 독립성 | - 프레임워크나 DB 교체가 자유로움 - 핵심 로직은 기술 변화에 영향 없음 | - 모든 기술에 대한 추상화 구현 필요 - 과한 일반화는 오버엔지니어링 초래 가능 |
개발 생산성 | - 병렬 개발 가능 - 명확한 계약 (인터페이스) 기반 협업 용이 | - 초기 개발 속도 저하 - 설계 및 추상화 설계에 많은 노력 필요 |
시스템 수명/확장성 | - 오래된 구성 요소의 현대화 가능 - 새로운 기능 추가가 기존 코드 영향 없이 가능 | - 과도한 추상화는 복잡성 증가 및 성능 저하 유발 가능 |
관심사 분리 | - 각 계층이 명확한 책임을 가짐 - 복잡성 분산으로 이해 용이 | - 전 팀원의 설계 이해도 필요 - 원칙 미숙지 시 잘못된 분리 구조 발생 위험 |
문서 및 구조 명확성 | - 시스템의 구조와 흐름이 분명해짐 - 모듈 간 역할 구분이 명확 | - 인터페이스, 포트, 어댑터에 대한 문서화/관리 부담 증가 |
성능 및 효율성 | (간접 이점) → 변경 격리로 인해 운영 안정성 확보 가능 | - 계층 간 데이터 변환 및 호출로 인한 런타임 오버헤드 발생 가능 |
적용 범위 | - 대규모, 장기 시스템에 매우 적합 | - 소규모 프로젝트에서는 과도한 설계일 수 있음 (YAGNI 위반 가능성) |
- 장점: 유지보수성, 테스트성, 유연성, 확장성, 협업 구조에 탁월함
- 단점: 초기 설계 비용, 팀 역량, 성능 이슈, 과도한 추상화의 위험
실무 적용 예시
다양한 환경과 상황에서 정책 vs 상세 구현 원칙을 적용하는 방법에 대한 실무 예시는 다음과 같다:
시스템 유형별 계층화 아키텍처 구현
적용 분야 | 구현 방법 | 이점 | 주요 고려사항 |
---|---|---|---|
웹 애플리케이션 | - 컨트롤러: 요청 처리 및 라우팅 - 서비스 계층: 비즈니스 로직 - 리포지토리: 데이터 액세스 추상화 ORM: 데이터베이스 액세스 구현 | - UI 변경에 영향 받지 않는 비즈니스 로직 - 데이터베이스 교체 용이성 - 테스트 용이성 증가 | - 계층 간 데이터 변환 오버헤드 - 적절한 경계 설정 DTO 설계 |
마이크로서비스 | - API 게이트웨이: 외부 인터페이스 - 서비스 코어: 비즈니스 로직 - 인프라 어댑터: 외부 시스템 연동 - 메시지 브로커: 서비스 간 통신 | - 서비스 독립성 보장 - 기술 다양성 지원 - 독립적 배포 및 확장 | - 서비스 경계 설정 - 분산 시스템 복잡성 - 일관성 유지 |
모바일 앱 | - UI 계층: 화면 및 사용자 상호작용 - 프레젠터: 화면 로직 - 도메인 계층: 비즈니스 로직 - 데이터 계층: 로컬/원격 데이터 액세스 | - 다양한 플랫폼 지원 용이성 UI 변경 독립성 - 오프라인 동작 지원 | - 모바일 환경 제약 - 성능 최적화 - 디바이스 특화 기능 처리 |
임베디드 시스템 | - 하드웨어 추상화 계층 (HAL) - 드라이버 계층 - 미들웨어 - 애플리케이션 계층 | - 하드웨어 독립성 - 코드 재사용성 - 테스트 용이성 | - 자원 제약 환경 - 실시간 요구사항 - 최적화 필요성 |
기업 애플리케이션 | - 프레젠테이션 계층 - 애플리케이션 서비스 - 도메인 모델 - 인프라스트럭처 계층 | - 복잡한 비즈니스 규칙 관리 - 장기적 유지보수성 - 팀 간 병렬 개발 | - 복잡한 레거시 시스템 통합 - 대규모 팀 조정 - 성능 요구사항 |
클라우드 네이티브 | - API 게이트웨이 - 서버리스 함수 - 이벤트 기반 통합 - 관리형 서비스 어댑터 | - 클라우드 서비스 교체 용이성 - 서버리스 아키텍처 지원 - 멀티 클라우드 전략 | - 클라우드 의존성 관리 - 분산 시스템 복잡성 - 비용 최적화 |
게임 개발 | - 렌더링 엔진 - 게임 로직 - 물리 엔진 - 입력 처리 시스템 | - 엔진 교체 용이성 - 플랫폼 독립성 - 재사용 가능한 게임 로직 | - 성능 중심 설계 - 실시간 처리 요구사항 - 리소스 제약 |
업무 영역에 따른 Policy Vs Detail 구조 적용 사례
분야 | Policy 예시 | Detail 예시 | 분리 방법 |
---|---|---|---|
전자상거래 | 주문 처리 규칙, 할인 정책 | 결제 게이트웨이, 쇼핑몰 UI | Repository 패턴, Service 인터페이스 |
금융 시스템 | 대출 심사 규칙, 이자 계산 | 외부 신용평가 API, 웹 인터페이스 | Gateway 패턴, Adapter 패턴 |
콘텐츠 관리 | 콘텐츠 검열 규칙, 분류 로직 | 파일 저장소, CMS UI | Strategy 패턴, Factory 패턴 |
헬스케어 | 진단 알고리즘, 처방 규칙 | 의료기기 연동, EMR 시스템 | Observer 패턴, Command 패턴 |
교육 플랫폼 | 학습 진도 관리, 평가 기준 | LMS UI, 동영상 스트리밍 | Template Method, State 패턴 |
활용 사례
사례 1: 결제 시스템의 정책/세부사항 분리
시나리오: 결제 정책 (할인 규칙, 승인 조건 등) 이 자주 변경됨. 외부 결제 게이트웨이, DB, UI 등은 빈번히 교체/변경됨.
시스템 구성: 정책 (비즈니스 규칙) 은 도메인 계층에 집중, 외부 연동 및 데이터 저장은 인프라 계층에서 처리.
워크플로우:
- 사용자가 결제 요청 → 결제 정책 (Policy) 검증
- 정책 통과 시 외부 결제 게이트웨이 (Detail) 호출
- 결제 결과 저장 및 알림 처리 (Detail)
다이어그램
flowchart TD User[사용자] Policy["결제 정책(Policy)"] Gateway["결제 게이트웨이(Detail)"] DB["DB(Detail)"] User --> Policy Policy --> Gateway Gateway --> DB
사례 2: 온라인 뱅킹 시스템
시나리오: 대형 은행의 온라인 뱅킹 시스템 구축
시스템 구성
graph TB subgraph "Policy Layer - 은행 핵심 업무" AC[Account Entity<br/>계좌 엔티티] TR[Transfer Use Case<br/>이체 유스케이스] LN[Loan Service<br/>대출 서비스] FR[Fraud Detection<br/>부정거래 탐지] end subgraph "Interface Adapters - 어댑터" WC[Web Controller<br/>웹 컨트롤러] MF[Mobile Facade<br/>모바일 파사드] AR[Account Repository<br/>계좌 저장소] EG[External Gateway<br/>외부 게이트웨이] end subgraph "Details - 기술적 세부사항" WEB[Web UI<br/>웹 인터페이스] MOB[Mobile App<br/>모바일 앱] DB[(Core Banking DB<br/>핵심 은행 DB)] PAY[Payment Gateway<br/>결제 게이트웨이] KYC[KYC Service<br/>본인확인 서비스] end AC --> TR TR --> LN TR --> FR TR -.-> AR TR -.-> EG WC --> TR MF --> TR WEB --> WC MOB --> MF AR --> DB EG --> PAY EG --> KYC classDef policy fill:#e8f5e8,stroke:#2e7d32,stroke-width:3px classDef adapter fill:#fff3e0,stroke:#f57722,stroke-width:2px classDef detail fill:#ffebee,stroke:#c62828,stroke-width:2px class AC,TR,LN,FR policy class WC,MF,AR,EG adapter class WEB,MOB,DB,PAY,KYC detail
워크플로우:
- 이체 요청 처리:
- 사용자가 모바일 앱에서 이체 요청
- Mobile Facade 가 요청을 받아 Transfer Use Case 로 전달
- Transfer Use Case 가 비즈니스 규칙 검증 (잔액, 한도, 부정거래)
- Account Repository 를 통해 계좌 정보 조회/업데이트
- External Gateway 를 통해 타행 이체 처리
- 부정거래 탐지:
- Fraud Detection 서비스가 이체 패턴 분석
- 의심 거래 발견 시 이체 중단 및 알림
각 계층의 역할:
- Policy Layer (은행 핵심 업무):
- 계좌 관리 규칙: 최소 잔액, 이체 한도
- 이체 업무 규칙: 본인 확인, 수수료 계산
- 대출 심사 규칙: 신용 평가, 담보 평가
- 부정거래 탐지: 패턴 분석, 위험도 계산
- Detail Layer (기술적 세부사항):
- 웹/모바일 UI: 사용자 인터페이스
- 데이터베이스: Oracle, PostgreSQL 등
- 외부 연동: SWIFT, 카드사 API
- 인증 시스템: ActiveDirectory, LDAP
사례 3: 전자상거래 플랫폼의 할인 정책 적용
시나리오: 전자상거래 플랫폼의 할인 정책 적용
정책 (Policy): 특정 기간 동안 특정 상품에 대해 10% 할인 적용
세부사항 (Detail): 할인 계산 로직, UI 표시, 데이터베이스 저장 방식 등
시스템 구성 다이어그램:
graph TD A[Discount Policy Module] --> B[Discount Calculation Service] B --> C[UI Component] B --> D[Database]
Workflow:
- 사용자가 상품을 조회하면, 할인 정책 모듈에서 해당 상품에 대한 할인 여부를 확인
- 할인 계산 서비스에서 할인 금액을 계산
- UI 컴포넌트에서 할인 금액을 표시
- 주문 시 데이터베이스에 할인 금액 저장
차이점: 할인 정책 변경 시 정책 모듈만 수정하면 되며, 계산 로직이나 UI, 데이터베이스는 변경하지 않아도 되어 유지보수가 용이
실무에서 효과적으로 적용하기 위한 고려사항 및 주의할 점
분류 | 고려사항 | 설명 | 권장사항 |
---|---|---|---|
설계 원칙 | 계층 분리 | 정책 (비즈니스 로직) 과 상세 구현 (기술) 을 명확히 구분 | Clean Architecture, DDD 적용단일 책임 원칙 (SRP) 준수 |
인터페이스 정의 | 계층 간 통신은 추상화된 계약을 통해 이루어져야 함 | 인터페이스 기반 설계, 인터페이스 분리 원칙 (ISP) 적용 | |
의존성 관리 | 의존성은 고수준에서 정의하고, 저수준에서 구현 | 의존성 주입 (DI) 사용의존성 방향: 외부 → 내부 | |
테스트 전략 | 테스트 용이성 | 정책과 세부사항이 분리되어야 독립적 테스트 가능 | 단위 테스트 (UseCase, Entity), 통합 테스트 (Adapter, Infrastructure) 병행 |
데이터 전략 | 데이터 형식과 전달 구조 | 계층 간 데이터 형식이 복잡성 및 결합도에 영향 | 불변 DTO 사용, 중립적인 데이터 포맷, 양방향 매퍼 활용 |
데이터 변환 위치 | 데이터 변환 책임 위치가 명확하지 않으면 책임이 불분명해짐 | 각 계층의 진입점에서 변환 수행, 책임 명확히 구분 | |
경계 관리 | 경계 위치 결정 | 경계 설정이 과하거나 부족하면 시스템 유연성 저하 | 변경 가능성과 중요도 기준으로 경계 설정적절한 수의 경계 유지 |
경계 내부 구조 | 경계 내부도 잘 구조화되어야 유지보수성 확보 가능 | 내부 구조 계층화, 책임 분리, 세부 구현 은닉 | |
조직 운영 | 팀 구조와 역량 | 팀이 아키텍처를 이해하지 못하면 원칙이 무너지기 쉬움 | 아키텍처 교육 및 리뷰 문화 조성팀 구조를 아키텍처와 정렬 |
문서화 | 추상화 및 인터페이스 설계 시 명확한 설명 필요 | 정책은 선언적으로, 구현은 절차적으로 문서화아키텍처 결정 문서 (ADR) 유지 | |
도입 전략 | 점진적 도입 | 기존 시스템에 전면 적용 시 위험 | 새 기능부터 적용, 점진적 리팩토링 |
적절한 추상화 수준 | 불필요한 추상화는 복잡성만 증가 | YAGNI 원칙 적용실제 변경 가능성을 기반으로 추상화 | |
성능 최적화 | 계층 통신 및 응답 시간 | 계층 간 과도한 변환 및 호출은 성능 오버헤드 유발 | 성능 중요 경로 식별 및 최적화필요 시 계층 우회 허용적절한 캐싱 적용 |
메모리 사용량 | 중간 객체 과도 생성으로 인한 메모리 낭비 가능 | 객체 재사용, 객체 풀링 고려메모리 프로파일링 | |
도구/기술 | 프레임워크 및 도구 선택 | 기존 기술과의 호환성 또는 지원 부족 | DI 컨테이너 등 아키텍처 구현 지원 도구 활용기술 선택 시 아키텍처 적합성 고려 |
복잡성 제어 | 오버엔지니어링 방지 | 작은 프로젝트에서 불필요한 계층 도입은 역효과 | 프로젝트 규모/복잡도에 따라 추상화 적용최소한의 아키텍처로 시작, 필요 시 확장 |
- 설계, 데이터 처리, 경계 구조, 조직 운영, 도입 방식, 성능 고려 등 다면적 요소 필요
- 기술적 아키텍처뿐 아니라 조직적/문화적 기반도 함께 설계해야 성공적으로 적용 가능
- 실무에서는 과하지 않게, 점진적으로, 현실적인 변경 가능성 기반으로 설계하는 것이 핵심
최적화하기 위한 고려사항
최적화 대상 | 문제점 / 고려사항 | 권장 최적화 방법 |
---|---|---|
데이터 변환 | - 계층 간 DTO 변환 오버헤드 - 직렬화/역직렬화 비용 | - DTO 구조 최적화 - 필요한 필드만 선택 - 직렬화 포맷 개선 (e.g. MessagePack, Protobuf) |
메모리 사용 | - 중간 객체 과다 생성 - GC 부담 - 메모리 누수 가능성 | - 객체 풀링 / 재사용 - 불변 객체 사용 - 순환 참조 방지, 약참조 활용 |
계층 통신 구조 | - 과도한 계층 분리로 인한 호출 비용 - 중복된 호출 패턴 | - 불필요한 계층 제거 - 배치 처리, 일괄 요청 - 계층 우회 API 설계 |
데이터베이스 접근 | - N+1 쿼리 문제 - 느린 조인 / 하위 쿼리 - 불필요한 트랜잭션 | - JPQL 최적화, 쿼리 튜닝 - Lazy Loading + Fetch Join - 커넥션 풀 튜닝 |
네트워크 호출 | - 외부 API 또는 서비스 간 호출 지연 - 요청 수 증가에 따른 병목 | - 캐싱 적용 - 데이터 압축 - 지연 처리 (lazy/eager batching) |
CPU 사용률 | - 인터페이스 호출 오버헤드 - 비효율적인 알고리즘 | - 연산 병목 지점 식별 (HotSpot 분석) - 연산 최적화 (예: 정렬, 탐색) - 멀티 스레딩, JIT 활용 |
비동기 처리 | - 모든 요청을 동기적으로 처리할 경우 응답 지연 | - 메시지 큐 기반 이벤트 처리 - 비동기 I/O - Coroutine / Thread 기반 처리 |
캐싱 전략 | - 반복된 연산 / 외부 호출에 대해 캐시 미적용 - 캐시 일관성 유지 어려움 | - 다층 캐싱 구조 (메모리 + 디스크) - TTL/ETag 기반 만료 정책 - 읽기 중심 로직에 계산 캐시 적용 |
병렬 처리 / 동시성 | - 공유 자원 경합, 락 경쟁 - 단일 스레드 병목 | - 불변 객체 사용 - 병렬 분산 처리 - 메시지 패싱 방식 구조 적용 |
지연 로딩 | - 모든 데이터 즉시 로딩 시 오버헤드 발생 | - 실제 접근 시점에 로딩 (Lazy) - Fetch 전략 조절 (select only needed) - 필요한 필드만 쿼리 |
배치 처리 | - 동일 작업 반복 수행으로 인한 왕복 횟수 증가 | - 일괄 처리 API 도입 - 컬렉션 기반 처리 - 데이터 집계 및 정렬 사전 수행 |
로드 밸런싱 | - 트래픽 집중 시 특정 노드 과부하 | - 로드 밸런서 적용 (L7/L4) - 세션 스티키 전략 사용 - 클러스터링 |
모니터링 및 진단 | - 병목 위치 파악 어려움 - 성능 문제 사전 인지 불가 | - APM 도구 사용 (예: Prometheus, Grafana, Datadog) - 리소스/쿼리 프로파일링 - 지표 기반 최적화 |
조기 최적화 방지 | - 사용되지 않을 최적화 작업으로 복잡성 증가 | - 실측 기반의 최적화 - 우선순위 기반 병목 개선 - 가독성/유지보수성과의 균형 고려 |
- 핵심 최적화 방향: " 계층 경계 최소화 “, " 불필요한 데이터/자원 최소화 “, " 병목 지점 식별 후 집중 "
- 성능보다 먼저 고려할 것: 측정 기반 최적화, 유지보수성 유지, 실제 사용 패턴 반영
- 실무에서는 캐싱 + 비동기 + 병렬 처리의 적절한 조합이 가장 실용적인 성능 향상 수단
장점과 단점
구분 | 항목 | 설명 |
---|---|---|
✅ 장점 | 비즈니스 로직 보호 | 기술적 변경으로부터 핵심 로직 격리 |
높은 테스트 용이성 | Policy 계층의 독립적 단위 테스트 가능 | |
기술 독립성 | 프레임워크나 데이터베이스 교체 용이 | |
재사용성 향상 | 다양한 환경에서 Policy 재사용 가능 | |
유지보수성 | 변경 영향 범위 제한으로 안전한 수정 | |
확장성 | 새로운 Detail 추가 시 Policy 영향 없음 | |
⚠️ 단점 | 초기 복잡도 증가 | 설계 단계에서 더 많은 고민과 시간 필요 |
추상화 오버헤드 | 인터페이스와 어댑터로 인한 코드 증가 | |
성능 오버헤드 | 계층 간 데이터 변환으로 인한 처리 지연 | |
과도한 설계 위험 | 불필요한 추상화로 인한 복잡성 증가 | |
팀 학습 비용 | 새로운 개발 패러다임 습득 필요 |
주제와 관련하여 주목할 내용
주제 | 항목 | 설명 |
---|---|---|
설계 원칙 | 단일 책임 원칙 (Single Responsibility Principle) | 모듈이 하나의 책임만을 가지도록 설계하여 응집도를 높이는 원칙 |
인터페이스 분리 원칙 (Interface Segregation Principle) | 클라이언트가 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 분리하는 원칙 | |
의존성 역전 원칙 (Dependency Inversion Principle) | 고수준 모듈이 저수준 모듈에 의존하지 않고, 추상화에 의존하도록 설계하여 결합도를 낮추는 원칙 | |
관심사의 분리 (Separation of Concerns) | 시스템을 정책과 구현 세부사항 등 다양한 관심사로 분리하여 유지보수를 용이하게 함 | |
아키텍처 | 헥사고날 아키텍처 (Hexagonal Architecture) | 내부의 정책과 외부의 입출력 세부사항을 포트와 어댑터로 명확히 구분하는 아키텍처 |
클린 아키텍처 (Clean Architecture) | 핵심 비즈니스 로직 (Policy) 을 중심에 두고, 외부 세부사항은 바깥 계층으로 배치 | |
온리워드 (Onlyward) 종속성 원칙 | 내부 (core) 계층에서 외부 (detail) 계층으로만 의존이 향하도록 설계하는 원칙 | |
언어/도구 | 인터페이스 중심 설계 (Interface-driven Design) | 세부 구현보다 인터페이스 정의에 집중하여 유연한 구조를 구성할 수 있도록 함 |
테스트 | 모킹 (Mock) 기반 테스트 | 정책 계층은 테스트 대상이 되고, 세부사항은 Mock 처리하여 단위 테스트를 용이하게 함 |
하위 주제로 분류해서 추가적으로 학습해야할 내용들
카테고리 | 주제 | 설명 |
---|---|---|
설계 원칙 | SOLID 원칙 심화 | Policy-Detail 분리의 이론적 기반 |
관심사 분리 (SoC) | 시스템 구성 요소의 역할과 책임 분리 | |
최소 지식 원칙 (LoD) | 객체 간 결합도 최소화 방법 | |
아키텍처 패턴 | 계층형 아키텍처 | 전통적인 N-tier 아키텍처와의 비교 |
이벤트 기반 아키텍처 | 비동기 통신을 통한 결합도 감소 | |
서비스 지향 아키텍처 | 서비스 단위의 Policy-Detail 분리 | |
구현 기법 | 의존성 주입 프레임워크 | Spring, Guice, Dagger 등 활용법 |
모킹과 테스트 더블 | Policy 테스트를 위한 Detail 대체 기법 | |
설정 관리 | 환경별 Detail 설정 외부화 | |
도메인 설계 | 도메인 주도 설계 (DDD) | 비즈니스 도메인 중심의 Policy 설계 |
바운디드 컨텍스트 | 도메인 경계에 따른 Policy 분리 | |
애그리게이트 패턴 | 도메인 객체의 일관성 보장 |
관련 분야와 함께 추가로 학습해야할 내용들
관련 분야 | 주제 | 설명 |
---|---|---|
소프트웨어 아키텍처 | 마이크로서비스 아키텍처 | 서비스 간 Policy-Detail 분리 적용 |
서버리스 아키텍처 | 함수 단위의 Policy 구현 | |
이벤트 기반 아키텍처 | 비동기 이벤트를 통한 결합도 해제 | |
클라우드 컴퓨팅 | 컨테이너 기술 (Docker/K8s) | Policy 와 Detail 의 독립적 배포 |
서비스 메시 (Service Mesh) | 마이크로서비스 간 통신 추상화 | |
API 게이트웨이 | 외부 접근의 단일 진입점 | |
데이터베이스 | CQRS (Command Query Responsibility Segregation) | 읽기/쓰기 모델 분리 |
이벤트 소싱 | 상태 변화의 이벤트 기반 관리 | |
폴리글랏 영속성 | 용도별 최적화된 저장소 선택 | |
테스팅 | 테스트 주도 개발 (TDD) | Policy 우선 설계를 위한 개발 방법론 |
행위 주도 개발 (BDD) | 비즈니스 요구사항 중심의 Policy 검증 | |
계약 테스트 | 서비스 간 인터페이스 호환성 검증 | |
DevOps | CI/CD 파이프라인 | Policy 와 Detail 의 독립적 배포 전략 |
인프라스트럭처 as Code | 환경 설정의 코드화 | |
모니터링과 옵저버빌리티 | 분산 시스템의 상태 추적 |
용어 정리
용어 | 설명 |
---|---|
Interface(인터페이스) | 정책과 세부사항을 연결하는 추상적 경계 |
DDD | 도메인 주도 설계, 정책/세부사항 분리 강조 설계 방법론 |
정책 (Policy) | 시스템의 전체적인 동작과 구조를 정의하는 고수준 결정으로, 핵심 비즈니스 규칙과 관련됨 |
상세 구현 (Detail) | 정책을 실현하기 위한 구체적인 메커니즘과 저수준 구현 방법 (데이터베이스, UI, 외부 시스템 등) |
의존성 규칙 (Dependency Rule) | 소스 코드 의존성은 항상 저수준 (상세 구현) 에서 고수준 (정책) 으로 향해야 한다는 원칙 |
의존성 역전 원칙 (DIP) | 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다는 SOLID 원칙 |
경계 (Boundary) | 시스템의 다양한 영역 간의 명확한 구분선으로, 인터페이스와 어댑터를 통해 소통 |
엔티티 (Entity) | 핵심 비즈니스 규칙과 데이터 구조를 캡슐화하는 객체 |
유스케이스 (Use Case) | 애플리케이션 특정 비즈니스 규칙을 구현하는 객체 |
어댑터 (Adapter) | 외부 시스템과 내부 시스템 간의 인터페이스 변환을 담당하는 구성 요소 |
포트 (Port) | 내부 시스템이 외부와 통신하기 위한 인터페이스 |
DTO(Data Transfer Object) | 계층 간 데이터 전달을 위한 단순한 구조로, 행위가 없는 순수한 데이터 객체 |
CQRS(Command Query Responsibility Segregation) | 명령 (데이터 변경) 과 조회 (데이터 읽기) 모델을 분리하는 아키텍처 패턴 |
이벤트 소싱 (Event Sourcing) | 상태 변경을 이벤트로 저장하고, 이벤트를 재생하여 상태를 재구성하는 패턴 |
마이크로서비스 (Microservices) | 작고 독립적인 서비스로 구성된 아키텍처 스타일 |
플러그인 아키텍처 (Plug-in Architecture) | 핵심 시스템에 플러그인 형태로 기능을 추가할 수 있는 아키텍처 |
바운더리 (Boundary) | 시스템의 서로 다른 관심사를 분리하는 아키텍처적 경계선 |
인터페이스 어댑터 (Interface Adapter) | 서로 다른 계층 간 데이터 형식을 변환하는 계층 |
플러그인 아키텍처 (Plugin Architecture) | 핵심 로직에 기능을 플러그인 형태로 추가할 수 있는 구조 |
포트와 어댑터 (Ports and Adapters) | 헥사고날 아키텍처에서 외부 세계와의 연결점을 나타내는 개념 |
애그리게이트 (Aggregate) | DDD 에서 일관성 경계를 가지는 도메인 객체들의 집합 |
바운디드 컨텍스트 (Bounded Context) | DDD 에서 특정 도메인 모델이 적용되는 명시적 경계 |
이벤트 스토밍 (Event Storming) | 도메인 이벤트를 중심으로 비즈니스 프로세스를 모델링하는 기법 |
클린 아키텍처 (Clean Architecture) | 고수준 정책을 중심에 두고 저수준 세부사항은 바깥 계층으로 배치하는 구조적 아키텍처 |
헥사고날 아키텍처 (Hexagonal Architecture) | 내부 비즈니스 로직과 외부 어댑터를 포트로 연결하여 분리하는 설계 방식 |
관심사의 분리 (Separation of Concerns) | 시스템의 각 부분이 명확히 독립된 관심사를 다루도록 분리하는 원칙 |
온리워드 종속성 원칙 (Onlyward Dependency Principle) | 의존성이 항상 안쪽 (정책) 에서 바깥쪽 (세부사항) 으로만 향하도록 구성 |
인터페이스 중심 설계 (Interface-driven Design) | 구현보다 인터페이스 중심으로 시스템을 설계하여 교체 가능성과 유연성 확보 |
참고 및 출처
- Uncle Bob - Clean Architecture 설명
- Hexagonal Architecture (Alistair Cockburn)
- Martin Fowler - Inversion of Control
- Spring - Dependency Injection 가이드
- Domain-Driven Design Reference
- Clean Architecture - The Clean Code Blog - Uncle Bob
- Policy vs Detail - Roadmap.sh
- The Clean Architecture Dependency Rule | InformIT
- Dependency inversion principle - Wikipedia
- Clean Architecture by Uncle Bob: Summary and review - CleverCoder.net
- Architectural principles - .NET | Microsoft Learn
- Complete Guide to Clean Architecture | GeeksforGeeks
- Clean Architecture Reference Guide | Bitloops Docs
- Organizing App Logic with the Clean Architecture | Khalil Stemmler
- Software architecture and boundaries | Convinced Coder
- Policy vs Detail - roadmap.sh
- Architectural principles - Microsoft Learn
- The Clean Architecture - Uncle Bob’s Blog
- Clean Architecture Summary and Review
- TOGAF Architecture Principles
- Architecture Principles: An approach to effective decision making
- InfoQ Software Architecture and Design Trends Report - 2025
- Top Software Architecture Patterns for 2025
- Bitloops: Clean Architecture - The Fundamentals
- SweetProcess: Policy vs. Procedure vs. Process
- Hidayat Rizvi: Policy vs Procedure vs Standard
- Comprose: Policy, Procedure, Work Instructions, Process
- StandardFusion: Policy Management Best Practices