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 등

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):

  1. 소스 코드 의존성은 항상 안쪽 (고수준) 을 향해야 함
  2. 내부 계층은 외부 계층에 대해 아무것도 알지 말아야 함
  3. 외부 계층의 변경이 내부 계층에 영향을 주지 않아야 함

분류에 따른 종류 및 유형

정책 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 등
- 기술적 구현 및 외부 도구 위치
- 상세 구현 담당
인터페이스 계층에서 정의한 추상화에 의존 (역방향)- 변경 가능성 높음
- 내부 정책에 영향 주지 않아야 함

헥사고날 아키텍처 (Hexagonal Architecture) 구조

또 다른 구현 방식인 헥사고날 아키텍처는 다음과 같은 구조를 가진다:

구성 요소설명
내부 영역 (Inside)- 핵심 비즈니스 로직 및 도메인 모델
- 외부 기술에 대한 의존 없음
- 포트를 통해 외부와 통신
외부 영역 (Outside)- 데이터베이스, 사용자 인터페이스, 외부 API 등
- 내부 로직과 직접 연결되지 않음
- 어댑터를 통해 통신
포트 (Ports)- 내부 영역에서 정의한 인터페이스
- 내부가 외부에 필요로 하는 동작의 명세
- 예: OrderRepository, PaymentGatewayPort
어댑터 (Adapters)- 포트를 구현한 실제 클래스 또는 모듈
- 외부 시스템과 포트 간 데이터 변환 수행
- 예: OrderRepositoryImpl, HttpPaymentGatewayAdapter

클린 아키텍처 계층 구조 및 의존성 흐름

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
(세부사항 구성요소)
FrameworksExpress, NestJS, Spring 등 웹 프레임워크 및 기술적 도구
DatabasesPostgreSQL, MongoDB 등 데이터 저장소
External Interfaces외부 API, 파일 시스템, 클라우드 서비스 등 시스템 외부와 통신하는 인터페이스
Boundary Components
(경계 구성요소)
Interface Adapters도메인 모델 ↔ 외부 세계 간 데이터 포맷 변환 역할
Controllers사용자 요청을 수신하여 유스케이스를 호출하는 입구 역할
Presenters응답 데이터를 ViewModel 또는 DTO 로 변환하는 역할
Optional Components
(선택 구성요소)
Gateways외부 API 또는 시스템과의 연결을 위한 어댑터 역할
Event Buses도메인 이벤트 기반의 비동기 메시지 전달 메커니즘
Caching LayerRedis 등 캐시를 이용한 성능 최적화 계층

의존성 방향:

장점과 단점

항목장점단점
유지보수성- 코드 구조가 명확하여 수정이 쉬움
- 변경 범위가 국한되어 안정성 향상
- 인터페이스와 경계 설계에 초기 복잡성 존재
테스트 용이성- 비즈니스 로직을 외부 의존성 없이 테스트 가능
- mock/stub 기반 테스트 용이
- 계층 구조로 인한 테스트 구성 비용 증가 가능
기술 독립성- 프레임워크나 DB 교체가 자유로움
- 핵심 로직은 기술 변화에 영향 없음
- 모든 기술에 대한 추상화 구현 필요
- 과한 일반화는 오버엔지니어링 초래 가능
개발 생산성- 병렬 개발 가능
- 명확한 계약 (인터페이스) 기반 협업 용이
- 초기 개발 속도 저하
- 설계 및 추상화 설계에 많은 노력 필요
시스템 수명/확장성- 오래된 구성 요소의 현대화 가능
- 새로운 기능 추가가 기존 코드 영향 없이 가능
- 과도한 추상화는 복잡성 증가 및 성능 저하 유발 가능
관심사 분리- 각 계층이 명확한 책임을 가짐
- 복잡성 분산으로 이해 용이
- 전 팀원의 설계 이해도 필요
- 원칙 미숙지 시 잘못된 분리 구조 발생 위험
문서 및 구조 명확성- 시스템의 구조와 흐름이 분명해짐
- 모듈 간 역할 구분이 명확
- 인터페이스, 포트, 어댑터에 대한 문서화/관리 부담 증가
성능 및 효율성(간접 이점) → 변경 격리로 인해 운영 안정성 확보 가능- 계층 간 데이터 변환 및 호출로 인한 런타임 오버헤드 발생 가능
적용 범위- 대규모, 장기 시스템에 매우 적합- 소규모 프로젝트에서는 과도한 설계일 수 있음 (YAGNI 위반 가능성)

실무 적용 예시

다양한 환경과 상황에서 정책 vs 상세 구현 원칙을 적용하는 방법에 대한 실무 예시는 다음과 같다:

시스템 유형별 계층화 아키텍처 구현

적용 분야구현 방법이점주요 고려사항
웹 애플리케이션- 컨트롤러: 요청 처리 및 라우팅
- 서비스 계층: 비즈니스 로직
- 리포지토리: 데이터 액세스 추상화
ORM: 데이터베이스 액세스 구현
- UI 변경에 영향 받지 않는 비즈니스 로직
- 데이터베이스 교체 용이성
- 테스트 용이성 증가
- 계층 간 데이터 변환 오버헤드
- 적절한 경계 설정
DTO 설계
마이크로서비스- API 게이트웨이: 외부 인터페이스
- 서비스 코어: 비즈니스 로직
- 인프라 어댑터: 외부 시스템 연동
- 메시지 브로커: 서비스 간 통신
- 서비스 독립성 보장
- 기술 다양성 지원
- 독립적 배포 및 확장
- 서비스 경계 설정
- 분산 시스템 복잡성
- 일관성 유지
모바일 앱- UI 계층: 화면 및 사용자 상호작용
- 프레젠터: 화면 로직
- 도메인 계층: 비즈니스 로직
- 데이터 계층: 로컬/원격 데이터 액세스
- 다양한 플랫폼 지원 용이성
UI 변경 독립성
- 오프라인 동작 지원
- 모바일 환경 제약
- 성능 최적화
- 디바이스 특화 기능 처리
임베디드 시스템- 하드웨어 추상화 계층 (HAL)
- 드라이버 계층
- 미들웨어
- 애플리케이션 계층
- 하드웨어 독립성
- 코드 재사용성
- 테스트 용이성
- 자원 제약 환경
- 실시간 요구사항
- 최적화 필요성
기업 애플리케이션- 프레젠테이션 계층
- 애플리케이션 서비스
- 도메인 모델
- 인프라스트럭처 계층
- 복잡한 비즈니스 규칙 관리
- 장기적 유지보수성
- 팀 간 병렬 개발
- 복잡한 레거시 시스템 통합
- 대규모 팀 조정
- 성능 요구사항
클라우드 네이티브- API 게이트웨이
- 서버리스 함수
- 이벤트 기반 통합
- 관리형 서비스 어댑터
- 클라우드 서비스 교체 용이성
- 서버리스 아키텍처 지원
- 멀티 클라우드 전략
- 클라우드 의존성 관리
- 분산 시스템 복잡성
- 비용 최적화
게임 개발- 렌더링 엔진
- 게임 로직
- 물리 엔진
- 입력 처리 시스템
- 엔진 교체 용이성
- 플랫폼 독립성
- 재사용 가능한 게임 로직
- 성능 중심 설계
- 실시간 처리 요구사항
- 리소스 제약

업무 영역에 따른 Policy Vs Detail 구조 적용 사례

분야Policy 예시Detail 예시분리 방법
전자상거래주문 처리 규칙, 할인 정책결제 게이트웨이, 쇼핑몰 UIRepository 패턴, Service 인터페이스
금융 시스템대출 심사 규칙, 이자 계산외부 신용평가 API, 웹 인터페이스Gateway 패턴, Adapter 패턴
콘텐츠 관리콘텐츠 검열 규칙, 분류 로직파일 저장소, CMS UIStrategy 패턴, Factory 패턴
헬스케어진단 알고리즘, 처방 규칙의료기기 연동, EMR 시스템Observer 패턴, Command 패턴
교육 플랫폼학습 진도 관리, 평가 기준LMS UI, 동영상 스트리밍Template Method, State 패턴

활용 사례

사례 1: 결제 시스템의 정책/세부사항 분리

시나리오: 결제 정책 (할인 규칙, 승인 조건 등) 이 자주 변경됨. 외부 결제 게이트웨이, DB, UI 등은 빈번히 교체/변경됨.
시스템 구성: 정책 (비즈니스 규칙) 은 도메인 계층에 집중, 외부 연동 및 데이터 저장은 인프라 계층에서 처리.
워크플로우:

  1. 사용자가 결제 요청 → 결제 정책 (Policy) 검증
  2. 정책 통과 시 외부 결제 게이트웨이 (Detail) 호출
  3. 결제 결과 저장 및 알림 처리 (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

워크플로우:

  1. 이체 요청 처리:
    • 사용자가 모바일 앱에서 이체 요청
    • Mobile Facade 가 요청을 받아 Transfer Use Case 로 전달
    • Transfer Use Case 가 비즈니스 규칙 검증 (잔액, 한도, 부정거래)
    • Account Repository 를 통해 계좌 정보 조회/업데이트
    • External Gateway 를 통해 타행 이체 처리
  2. 부정거래 탐지:
    • Fraud Detection 서비스가 이체 패턴 분석
    • 의심 거래 발견 시 이체 중단 및 알림

각 계층의 역할:

사례 3: 전자상거래 플랫폼의 할인 정책 적용

시나리오: 전자상거래 플랫폼의 할인 정책 적용
정책 (Policy): 특정 기간 동안 특정 상품에 대해 10% 할인 적용
세부사항 (Detail): 할인 계산 로직, UI 표시, 데이터베이스 저장 방식 등
시스템 구성 다이어그램:

graph TD
  A[Discount Policy Module] --> B[Discount Calculation Service]
  B --> C[UI Component]
  B --> D[Database]

Workflow:

  1. 사용자가 상품을 조회하면, 할인 정책 모듈에서 해당 상품에 대한 할인 여부를 확인
  2. 할인 계산 서비스에서 할인 금액을 계산
  3. UI 컴포넌트에서 할인 금액을 표시
  4. 주문 시 데이터베이스에 할인 금액 저장

차이점: 할인 정책 변경 시 정책 모듈만 수정하면 되며, 계산 로직이나 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 검증
계약 테스트서비스 간 인터페이스 호환성 검증
DevOpsCI/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)구현보다 인터페이스 중심으로 시스템을 설계하여 교체 가능성과 유연성 확보

참고 및 출처