GRASP vs. SOLID

GRASP 와 SOLID 는 상호 보완적인 객체지향 설계 원칙으로, GRASP 는 " 누가 무엇을 해야 하는가 " 에 대한 구체적인 책임 할당 패턴을 제공하고, SOLID 는 " 어떻게 설계해야 하는가 " 에 대한 포괄적인 설계 원칙을 제시한다. 두 원칙 모두 낮은 결합도, 높은 응집도, 확장성, 유지보수성을 목표로 하며, 현대 소프트웨어 개발에서 필수적인 설계 가이드라인이다.

핵심 개념

구분항목정의/설명설계 목적 및 효과
GRASP정의객체지향 설계에서 책임 할당과 객체 간 협력을 효과적으로 하기 위한 9 가지 설계 패턴 세트책임 분산, 구조적 안정성 확보, 결합도 최소화
핵심 패턴- Information Expert
- Creator
- Controller
- Low Coupling
- High Cohesion
- Polymorphism
- Pure Fabrication
- Indirection
- Protected Variations
객체 간 책임 할당 원칙, 협력 방식 정의
주요 설계 방향객체에 적절한 책임 부여, 변화에 강한 유연한 구조 설계응집도 ↑, 결합도 ↓, 변경 영향 최소화
SOLID정의객체지향 설계에서 유지보수성과 확장성을 높이기 위한 5 가지 원칙을 나타내는 약어확장 가능하고 견고한 소프트웨어 구조 확립
핵심 원칙- SRP (단일 책임 원칙)
- OCP (개방 - 폐쇄 원칙)
- LSP (리스코프 치환 원칙)
- ISP (인터페이스 분리 원칙)
- DIP (의존 역전 원칙)
클래스와 모듈 단위의 구조 품질 향상
주요 설계 방향변화에 유연한 클래스 설계, 테스트 용이성 강화, 인터페이스 기반 추상화유지보수성 ↑, 재사용성 ↑, 확장성 ↑

GRASP vs. SOLID 비교

GRASP 와 SOLID 는 객체지향 설계에서 서로 다른 측면을 강조한다. GRASP 는 객체에 책임을 어떻게 할당할지를 중심으로 하며, SOLID 는 클래스 설계의 원칙을 통해 코드의 유연성과 유지보수성을 강조한다.

항목GRASPSOLID
정의객체 책임 할당과 협력 중심 설계 패턴 집합객체지향 설계의 5 대 구체적 원칙
목적책임 분배, 결합도 감소, 응집도 증가, 구조적 안정성 확보유지보수성, 확장성, 테스트 용이성, 재사용성 강화
구성9 가지 패턴 (Information Expert 등)5 가지 원칙 (SRP, OCP, LSP, ISP, DIP)
적용 시점설계 초기 (아키텍처, 책임 분배)코드 작성 및 리팩토링, 유지보수 단계
적용 범위객체, 클래스, 시스템 전체클래스, 모듈, 함수 등 코드 레벨

배경 및 목적

구분GRASPSOLID
제안자Craig Larman (1997)Robert C. Martin (2000)
출처“Applying UML and Patterns”“Design Principles and Design Patterns”
주요 목적객체지향 설계에서 구체적인 책임 할당 가이드라인 제공유지보수 가능하고 확장 가능한 소프트웨어 구조 설계 원칙
접근 방식패턴 기반의 구체적 문제 해결원칙 기반의 포괄적 설계 지침

특징 비교

구분GRASPSOLID
추상화 수준중간 수준 (구체적 패턴)높은 수준 (추상적 원칙)
적용 범위클래스 수준의 책임 할당모듈/컴포넌트 수준의 설계
학습 난이도상대적으로 구체적이어서 이해하기 쉬움추상적이어서 적용에 경험 필요

핵심 원칙

구분GRASPSOLID
결합도Low Coupling 패턴으로 직접 다룸DIP 를 통해 간접적으로 관리
응집도High Cohesion 패턴으로 직접 다룸SRP 를 통해 간접적으로 관리
확장성Polymorphism, Protected VariationsOCP, LSP 를 통해 보장
책임 분리Information Expert, Creator 로 명확한 가이드라인SRP, ISP 로 추상적 원칙 제시

구현 기법 비교

구분GRASPSOLID
객체 생성Creator 패턴: 집합, 포함, 초기화 정보 보유 클래스DIP: 팩토리 패턴, 의존성 주입
이벤트 처리Controller 패턴: 시스템 이벤트 중앙 집중화SRP: 각 클래스의 명확한 책임 분리
변화 대응Protected Variations: 인터페이스로 변화 지점 보호OCP: 추상화를 통한 확장 가능 설계
간접 참조Indirection: 중간 객체를 통한 결합도 감소DIP: 추상화 계층을 통한 의존성 역전

서로에 대한 강점과 약점

구분GRASPSOLID
강점설계 초기 구조 안정성, 책임 분배, 협력 구조코드 품질, 유지보수성, 확장성, 테스트 용이성
약점구체적 코드 품질 지침 부족, 패턴 남발 위험설계 초기 구조 설계 미흡, 원칙 남용 위험

구조 및 아키텍처

GRASP 구조

graph TD
    A[GRASP Patterns] --> B[Information Expert]
    A --> C[Creator]
    A --> D[Controller]
    A --> E[Low Coupling]
    A --> F[High Cohesion]
    A --> G[Polymorphism]
    A --> H[Pure Fabrication]
    A --> I[Indirection]
    A --> J[Protected Variations]
    
    B --> K[클래스 책임 할당]
    C --> K
    D --> L[시스템 이벤트 처리]
    E --> M[의존성 관리]
    F --> M
    G --> N[행위 변화 관리]
    H --> O[도메인 외부 클래스]
    I --> P[간접 참조]
    J --> Q[변화 보호]

SOLID 구조

graph TD
    A[SOLID Principles] --> B[SRP - Single Responsibility]
    A --> C[OCP - Open/Closed]
    A --> D[LSP - Liskov Substitution]
    A --> E[ISP - Interface Segregation]
    A --> F[DIP - Dependency Inversion]
    
    B --> G[단일 변경 이유]
    C --> H[확장 가능, 수정 제한]
    D --> I[서브타입 대체 가능성]
    E --> J[인터페이스 분리]
    F --> K[추상화 의존]
    
    G --> L[유지보수성]
    H --> L
    I --> L
    J --> L
    K --> L

주요 원리 및 작동 원리

GRASP 작동 원리

sequenceDiagram
    participant Client
    participant Controller
    participant Expert
    participant Creator
    
    Client->>Controller: 시스템 이벤트
    Controller->>Expert: 책임 위임
    Expert->>Creator: 객체 생성 요청
    Creator->>Expert: 새 객체 반환
    Expert->>Controller: 처리 결과
    Controller->>Client: 응답

SOLID 작동 원리

graph LR
    A[요구사항 변경] --> B{SRP 검증}
    B -->|OK| C{OCP 적용}
    B -->|위반| D[클래스 분리]
    C -->|확장 가능| E{LSP 검증}
    C -->|수정 필요| F[추상화 도입]
    E -->|대체 가능| G{ISP 적용}
    E -->|위반| H[상속 구조 수정]
    G -->|인터페이스 적절| I{DIP 적용}
    G -->|비대함| J[인터페이스 분리]
    I -->|추상화 의존| K[설계 완료]
    I -->|구체화 의존| L[의존성 역전]

실무 적용 예시

시나리오GRASP 적용SOLID 적용
전자상거래 주문 시스템Controller 로 주문 처리 중앙화, Information Expert 로 가격 계산SRP 로 주문/결제/배송 분리, DIP 로 결제 모듈 추상화
사용자 등록 시스템Controller 패턴을 통해 사용자 등록 요청을 처리하는 객체를 정의SRP 를 적용하여 사용자 등록 로직과 알림 로직을 분리
결제 시스템Creator 패턴을 통해 결제 객체를 생성하는 책임을 정의DIP 를 적용하여 결제 처리 로직과 결제 수단 구현을 분리
게임 캐릭터 시스템Polymorphism 으로 스킬 시스템, Creator 로 아이템 생성OCP 로 새 캐릭터 타입 추가, LSP 로 캐릭터 대체
은행 계좌 관리Protected Variations 로 이율 변동 보호ISP 로 계좌 타입별 인터페이스 분리
소셜 미디어 피드High Cohesion 으로 피드 알고리즘 집중화SRP 로 포스트/댓글/좋아요 분리

활용 사례

사례 1: 온라인 쇼핑몰 시스템

시나리오: 대규모 온라인 쇼핑몰의 주문 처리 시스템을 설계하는 상황

주요 요구사항:

  • 다양한 결제 방식 지원 (신용카드, 계좌이체, 포인트)
  • 실시간 재고 관리
  • 주문 상태 추적
  • 배송 업체별 연동
  • 할인 정책 적용

시스템 구성

  • GRASP 적용 시스템: Controller 패턴을 통해 주문 처리 로직을 담당하는 객체를 정의하고, Creator 패턴을 통해 주문 객체를 생성하는 책임을 정의한다.
classDiagram
    class OrderController {
        +processOrder(orderData)
        +cancelOrder(orderId)
    }
    
    class Order {
        -orderId: String
        -items: List<OrderItem>
        +calculateTotal(): Money
        +applyDiscount(policy): void
    }
    
    class PaymentProcessor {
        +processPayment(amount, method): boolean
    }
    
    class InventoryManager {
        +checkStock(productId): int
        +reserveStock(productId, quantity): boolean
    }
    
    OrderController --> Order : creates
    Order --> PaymentProcessor : uses
    Order --> InventoryManager : checks
  • SOLID 적용 시스템: SRP 를 적용하여 주문 처리 로직과 재고 관리 로직을 분리하고, DIP 를 적용하여 결제 처리 로직과 결제 수단 구현을 분리한다.
classDiagram
    class IPaymentMethod {
        <<interface>>
        +process(amount): boolean
    }
    
    class CreditCardPayment {
        +process(amount): boolean
    }
    
    class BankTransferPayment {
        +process(amount): boolean
    }
    
    class OrderService {
        -paymentMethod: IPaymentMethod
        +processOrder(order): void
    }
    
    class IDiscountPolicy {
        <<interface>>
        +calculate(order): Money
    }
    
    IPaymentMethod <|-- CreditCardPayment
    IPaymentMethod <|-- BankTransferPayment
    OrderService --> IPaymentMethod
    OrderService --> IDiscountPolicy

워크플로우

  • GRASP 워크플로우
sequenceDiagram
    participant Client
    participant OrderController
    participant Order
    participant PaymentProcessor
    participant InventoryManager
    
    Client->>OrderController: 주문 요청
    OrderController->>Order: 주문 객체 생성 (Creator)
    Order->>InventoryManager: 재고 확인 (Information Expert)
    InventoryManager-->>Order: 재고 상태
    Order->>Order: 총액 계산 (Information Expert)
    Order->>PaymentProcessor: 결제 처리
    PaymentProcessor-->>Order: 결제 결과
    Order-->>OrderController: 주문 완료
    OrderController-->>Client: 응답

SOLID 워크플로우:

sequenceDiagram
    participant Client
    participant OrderService
    participant IPaymentMethod
    participant IDiscountPolicy
    participant Order
    
    Client->>OrderService: 주문 처리 요청
    OrderService->>IDiscountPolicy: 할인 계산 (DIP)
    IDiscountPolicy-->>OrderService: 할인 금액
    OrderService->>Order: 주문 객체 생성 (SRP)
    OrderService->>IPaymentMethod: 결제 처리 (DIP)
    IPaymentMethod-->>OrderService: 결제 결과
    OrderService-->>Client: 처리 완료

각각의 역할:

  • GRASP 에서의 역할
    • Controller: OrderController 가 모든 주문 관련 시스템 이벤트 처리
    • Information Expert: Order 클래스가 주문 정보를 바탕으로 총액 계산
    • Creator: OrderController 가 Order 객체 생성 (주문 데이터를 가지고 있음)
    • Low Coupling: 각 클래스가 최소한의 의존성만 유지
  • SOLID 에서의 역할
    • SRP: 각 클래스가 단일 책임 (주문 처리, 결제, 할인)
    • OCP: 새로운 결제 방식 추가 시 기존 코드 수정 없이 확장
    • DIP: OrderService 가 구체 클래스가 아닌 인터페이스에 의존

차이점 분석

구분GRASP 접근법SOLID 접근법차이점
책임 할당정보를 가진 클래스에 책임 부여단일 책임 원칙으로 명확한 분리GRASP 는 정보 중심, SOLID 는 책임 중심
확장성Controller 패턴으로 중앙집중화인터페이스를 통한 확장GRASP 는 제어 중심, SOLID 는 추상화 중심
결합도 관리Low Coupling 패턴으로 직접 관리DIP 를 통한 의존성 역전GRASP 는 직접적, SOLID 는 간접적
변화 대응Protected Variations 로 변화 지점 보호OCP 로 확장 가능한 구조GRASP 는 보호 중심, SOLID 는 확장 중심

실무에서 효과적으로 적용하기 위한 고려사항 및 권장사항

구분고려사항주의할 점권장사항
역할 및 책임 정의객체 또는 클래스의 책임 분배 기준 명확화하나의 객체에 과도한 책임 집중 방지도메인 분석 기반으로 역할/책임을 명확히 정의하고 문서화
설계/구현 일관성GRASP/SOLID 적용 시 설계 일관성 유지원칙 및 패턴의 남용 주의코드 리뷰 및 설계 문서화를 통해 설계 표준을 정립하고 팀 전체에 공유
모듈화객체는 단일 책임을 갖도록 구성여러 책임을 가진 복합 클래스 방지SOLID 의 SRP (단일 책임 원칙) 및 GRASP 의 High Cohesion 원칙 적용
복잡도 관리설계 및 코드의 복잡도 최소화모든 패턴을 한 번에 적용하거나 남용하는 행위 피하기필요한 곳에만 점진적으로 적용, 코드 리뷰 및 리팩토링 문화 정착
적용 우선순위패턴/원칙별 적용 순서 고려전면적 일괄 적용 시 혼란 초래GRASP 의 Information Expert → Controller 순, SOLID 의 SRP → DIP 순으로 단계적 적용
레거시 코드 관리기존 코드 개선 시 패턴/원칙 점진적 적용전면 리팩토링 시 안정성 저하 위험변경 가능 범위 내에서 작은 단위부터 리팩토링, 테스트 병행
팀 교육이론뿐 아니라 실습 중심의 패턴/원칙 교육문서만 제공하거나 일방적인 강의 방식은 효과 저하페어 프로그래밍, 코드 리뷰, 실습 중심 워크숍 등 협업 기반 학습 방식을 병행

최적화하기 위한 고려사항

구분고려사항주의할 점권장사항
성능 최적화추상화 계층 및 디자인 패턴의 오버헤드 관리과도한 추상화 또는 불필요한 패턴 적용은 성능 저하 유발성능 중요 구간 (핫스팟) 에서는 실용적/직접적인 설계 적용, 성능 분석 도구 활용
메모리 최적화객체 생성 최적화 및 불필요한 객체 최소화불필요한 객체 반복 생성, GC (Garbage Collection) 과다 유발Creator 패턴 활용 시 싱글톤 (Singleton), 객체 풀링 (Object Pooling) 등 고려
설계 복잡성 관리설계 패턴/원칙 조합 시 구조 복잡성 증가 가능성모든 설계 원칙을 무분별하게 적용하면 이해도 및 유지보수성 저하프로젝트 규모와 특성에 맞춰 선택적 적용, 설계 문서화 및 코드 리뷰로 일관성 유지
유지보수성 향상변경에 강한 구조 설계 (OCP, DIP 등)변경이 잦은 영역에 고정된 구조 설계 적용 시 위험SOLID 의 OCP (개방/폐쇄 원칙), DIP (의존성 역전 원칙) 등을 통해 유연한 구조 확보
의존성 관리모듈 간 결합 최소화, 추상화에 의존하는 구조구체 클래스 간 직접 참조는 테스트와 재사용성 저하 유발DIP 를 통해 인터페이스 기반 설계, 의존성 주입 (Dependency Injection) 도입
코드 품질 및 생산성자동화 및 정적 분석 도구 활용수동 테스트 및 리뷰만으로는 일관성 확보 어려움정적 분석 도구 (SonarQube 등), 코드 메트릭, 린트 도구, 테스트 자동화 도입

주요 문제점과 해결방안

분류문제 유형원인영향탐지 및 진단 방법예방 방법해결 방법 요약
GRASP패턴 선택의 주관성적용 우선순위에 대한 기준 부재일관성 없는 코드 및 팀 간 이해 불일치코드 리뷰 중 적용 기준 불일치 발견프로젝트 초기 패턴 우선순위 가이드라인 수립정보 전문가 → 생성자 → 제어자 순서 적용, 체크리스트, 자동화 도구
복잡한 시스템 내 패턴 조합다수의 패턴 동시 적용 시 상호작용 충돌코드 복잡성 증가, 유지보수 어려움정적 분석 도구로 결합도/복잡도 측정단계적 도입 및 리팩토링, 핵심 패턴 우선 적용복잡성 지표 관리, 설계 리뷰, 단순화 중심의 조정
SOLID과도한 추상화로 인한 복잡성 증가모든 원칙을 엄격히 적용하려는 과도한 열정불필요한 추상화로 단순 기능도 복잡해짐클래스 수 대비 기능 수로 복잡도 측정프로젝트 규모에 맞는 적용 범위 설정YAGNI 원칙, 단순한 설계 채택, 균형 유지
추상화 계층으로 인한 성능 오버헤드인터페이스 남용 및 과도한 추상화 계층 도입대용량 처리/실시간 시스템에서 성능 저하프로파일링 도구로 메서드 호출 비용 측정실시간 처리 영역에서 실용적 설계 적용JIT 최적화, 인라이닝, 선택적 원칙 적용
공통레거시 코드 적용의 어려움원칙 미적용된 기존 코드베이스 존재리팩토링 비용 증가, 새로운 버그 발생 위험정적 분석 도구를 통해 규칙 위반 코드 식별신규 기능부터 원칙 적용, 점진적 도입Strangler Fig 패턴, 테스트 기반 리팩토링, 신규 서비스에 우선 적용

주제와 관련하여 주목할 내용

주제항목설명
아키텍처 패턴Clean ArchitectureSOLID 원칙을 아키텍처 수준으로 확장한 로버트 C. 마틴의 계층 구조 기반 설계 접근법
아키텍처 패턴Hexagonal ArchitectureDIP (의존성 역전 원칙) 을 포트와 어댑터 개념으로 실현한 아키텍처 패턴. 외부 의존성과 내부 도메인 분리를 강조
설계 원칙CUPID 원칙Dan North 가 제안한 현대적 설계 원칙: Composable, Unix-philosophy, Predictable, Idiomatic, Domain-based
개발 방법론Domain-Driven Design (DDD)도메인 지식 기반 설계를 강조. GRASP 의 Information Expert 개념을 도메인 전문가 개념으로 확장
개발 방법론Event Sourcing상태 변화의 이벤트 중심 저장 방식. GRASP 의 Controller 패턴을 진화시킨 형태로 이벤트 흐름 중심의 설계
품질 지표코드 스멜 (Code Smell)설계 원칙 위반을 탐지할 수 있는 지표. Martin Fowler 의 리팩토링 기법과 관련, SOLID/GRASP 위반 지표로 활용됨
자동화 도구SonarQubeSOLID 및 GRASP 원칙 위반 탐지 가능. 코드 스멜, 결합도, 복잡도 등의 정적 분석 제공
자동화 도구ArchUnit아키텍처 규칙을 코드 수준에서 테스트 가능한 도구. 계층, 의존성, 순환 등 검증 가능
프로그래밍 언어Rust 소유권 시스템메모리 안전성과 의존성 관리를 언어 차원에서 강제. DIP 원칙을 구조적으로 보장
프로그래밍 언어TypeScript 타입 시스템정적 타입을 통해 ISP, LSP 위반을 방지. 컴파일 타임에 설계 원칙 준수 보장
GRASP 원칙Information Expert, Controller책임 분배 및 객체 간 협력의 핵심 설계 패턴
SOLID 원칙SRP, OCP, DIP 등유지보수성과 확장성을 위한 객체지향 설계의 핵심 원칙

추가 학습/조사 필요 내용

내용설명카테고리주제
GRASP 패턴 심화GRASP 9 가지 패턴의 조합 전략, 도메인별 적용 사례 학습설계 원칙Advanced GRASP Patterns
SOLID 원칙 심화다양한 환경 (함수형, 마이크로서비스) 에서 SOLID 원칙 적용 방식설계 원칙 / 분산 시스템Functional / Microservices SOLID
GRASP + SOLID 통합 활용Clean Code, GRASP, SOLID 을 통합한 설계 품질 향상 전략코드 품질 / 설계 전략Integrated Design Principles
디자인 패턴과의 연계GoF 패턴과 SOLID/GRASP 원칙 간의 연계성 학습설계 패턴Design Patterns
설계 자동화 도구 활용AI, 정적 분석 기반 도구 (SonarQube, ArchUnit) 사용법 및 통합 전략개발 도구Static Analysis & Automation
코드 품질 메트릭코드 복잡도, 응집도, 결합도 등의 정량적 메트릭 측정 방법 학습소프트웨어 메트릭Quality Metrics
레거시 리팩토링 전략GRASP/SOLID 원칙 기반의 안전한 레거시 시스템 개선 방법유지보수 / 리팩토링Legacy Refactoring
테스트 주도 개발 (TDD)SOLID 원칙과 테스트 가능 코드 설계의 연계성 분석개발 방법론Test-Driven Development
계층/이벤트/마이크로서비스 아키텍처아키텍처 패턴 내에서 설계 원칙을 효과적으로 적용하는 방법소프트웨어 아키텍처Architecture Patterns
데이터베이스 설계정규화와 SOLID 의 SRP/OCP 원칙의 연관성 분석데이터 모델링Database Design
함수형 프로그래밍불변성과 순수 함수 기반으로 SOLID 원칙을 함수형에 맞춰 재해석프로그래밍 패러다임Functional Programming
클라우드 네이티브 설계컨테이너/마이크로서비스 환경에서 SOLID 및 DIP 적용 전략클라우드 컴퓨팅Cloud-Native Design
DevOps 품질 자동화CI/CD 파이프라인에서 코드 품질 및 설계 원칙 검증 자동화DevOps 엔지니어링DevOps Engineering
API 및 인터페이스 설계ISP (인터페이스 분리 원칙) 을 고려한 API 설계 및 시스템 통합 전략시스템 통합API Design
성능 최적화 전략과도한 추상화와 설계 원칙 적용 시 성능 병목 방지 방법 분석성능 엔지니어링Performance Engineering
보안 요구와 설계 원칙보안 아키텍처와 SOLID/GRASP 원칙의 조화보안 엔지니어링Security Engineering
객체지향 + DDD 설계도메인 모델 기반 책임 할당과 객체 간 협력을 통한 GRASP 적용시스템 아키텍처Domain-Driven Design (DDD)
설계 자동화와 AIAI 기반 설계 추천 및 품질 보증 도구 동향 분석신기술 / 자동화AI-based Design Support
디자인 패턴 (MVC/MVVM 등)UI 구조 설계 패턴과 SOLID/GRASP 의 역할 분리 원칙 연계 분석디자인 패턴UI Design Patterns
객체지향 설계 기본 원칙DRY, KISS 등 실용적인 설계 원칙과의 상호보완설계 원칙 / 실무Design Pragmatics (DRY/KISS)

용어 정리

객체지향 설계 원칙 및 패턴

용어설명
GRASP (General Responsibility Assignment Software Patterns)객체지향 설계에서 책임 할당을 위한 9 가지 설계 패턴 집합
SOLID객체지향 설계의 5 가지 핵심 원칙의 약어: SRP, OCP, LSP, ISP, DIP
SRP (Single Responsibility Principle)클래스는 변경되어야 할 이유가 하나뿐이어야 한다는 원칙
OCP (Open-Closed Principle)확장에는 열려 있고, 수정에는 닫혀 있어야 한다는 원칙
LSP (Liskov Substitution Principle)자식 클래스는 부모 클래스를 대체할 수 있어야 한다는 원칙
ISP (Interface Segregation Principle)클라이언트는 사용하지 않는 메서드에 의존하지 않아야 한다는 원칙
DIP (Dependency Inversion Principle)고수준 모듈과 저수준 모듈은 추상화에 의존해야 한다는 원칙

GRASP 패턴 세부 용어

용어설명
Information Expert책임 수행에 필요한 정보를 가장 많이 보유한 객체에 책임을 할당
Creator객체 생성을 맡을 책임을 결정하는 기준 패턴
Controller시스템 이벤트를 최초로 처리하는 객체, UI 와 도메인 로직 간 중재자 역할
Low Coupling객체 간 의존도를 최소화하여 변경에 강한 설계를 유도
High Cohesion하나의 모듈이나 클래스 내에서 관련 기능들이 밀접하게 모여 있음
Polymorphism동일한 인터페이스에 대해 서로 다른 객체가 다양한 방식으로 반응함
Pure Fabrication재사용성과 유연성을 위해 도메인 모델 외에 인위적으로 만든 클래스
Indirection객체 간 결합을 줄이기 위한 중간 객체 또는 계층 추가 기법
Protected Variations변경이 예상되는 요소를 인터페이스나 추상 클래스로 캡슐화하여 보호

설계 관련 일반 개념

용어설명
Cohesion (응집도)클래스나 모듈 내 구성 요소들이 하나의 목적을 위해 얼마나 밀접하게 관련되어 있는지
Coupling (결합도)모듈 간 상호 의존성의 정도
Abstraction (추상화)세부 구현을 숨기고 중요한 개념만 노출하는 설계 기법
Encapsulation (캡슐화)데이터를 외부에서 직접 접근하지 못하도록 하고, 메서드로만 접근하게 함
Inheritance (상속)기존 클래스의 속성과 기능을 자식 클래스가 물려받는 구조
Interface객체가 구현해야 하는 기능을 명세한 추상적인 계약

설계 품질 및 메트릭

용어설명
Cyclomatic Complexity (순환 복잡도)코드의 복잡성을 측정하는 메트릭, 조건 분기 수로 측정
Fan-in / Fan-out (팬인 / 팬아웃)모듈로 들어오거나 나가는 데이터 흐름 수로 의존 관계를 측정
LCOM (Lack of Cohesion of Methods)클래스 내 메서드 간 응집도가 낮은 정도를 나타내는 지표
Instability (불안정성)외부로부터의 의존성에 따라 변경에 얼마나 취약한지를 나타내는 지표

참고 및 출처

GRASP (General Responsibility Assignment Software Patterns)

SOLID (Object-Oriented Design Principles)

공통/일반 객체지향 설계 원칙