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 는 클래스 설계의 원칙을 통해 코드의 유연성과 유지보수성을 강조한다.
항목 | GRASP | SOLID |
---|---|---|
정의 | 객체 책임 할당과 협력 중심 설계 패턴 집합 | 객체지향 설계의 5 대 구체적 원칙 |
목적 | 책임 분배, 결합도 감소, 응집도 증가, 구조적 안정성 확보 | 유지보수성, 확장성, 테스트 용이성, 재사용성 강화 |
구성 | 9 가지 패턴 (Information Expert 등) | 5 가지 원칙 (SRP, OCP, LSP, ISP, DIP) |
적용 시점 | 설계 초기 (아키텍처, 책임 분배) | 코드 작성 및 리팩토링, 유지보수 단계 |
적용 범위 | 객체, 클래스, 시스템 전체 | 클래스, 모듈, 함수 등 코드 레벨 |
배경 및 목적
구분 | GRASP | SOLID |
---|---|---|
제안자 | Craig Larman (1997) | Robert C. Martin (2000) |
출처 | “Applying UML and Patterns” | “Design Principles and Design Patterns” |
주요 목적 | 객체지향 설계에서 구체적인 책임 할당 가이드라인 제공 | 유지보수 가능하고 확장 가능한 소프트웨어 구조 설계 원칙 |
접근 방식 | 패턴 기반의 구체적 문제 해결 | 원칙 기반의 포괄적 설계 지침 |
특징 비교
구분 | GRASP | SOLID |
---|---|---|
추상화 수준 | 중간 수준 (구체적 패턴) | 높은 수준 (추상적 원칙) |
적용 범위 | 클래스 수준의 책임 할당 | 모듈/컴포넌트 수준의 설계 |
학습 난이도 | 상대적으로 구체적이어서 이해하기 쉬움 | 추상적이어서 적용에 경험 필요 |
핵심 원칙
구분 | GRASP | SOLID |
---|---|---|
결합도 | Low Coupling 패턴으로 직접 다룸 | DIP 를 통해 간접적으로 관리 |
응집도 | High Cohesion 패턴으로 직접 다룸 | SRP 를 통해 간접적으로 관리 |
확장성 | Polymorphism, Protected Variations | OCP, LSP 를 통해 보장 |
책임 분리 | Information Expert, Creator 로 명확한 가이드라인 | SRP, ISP 로 추상적 원칙 제시 |
구현 기법 비교
구분 | GRASP | SOLID |
---|---|---|
객체 생성 | Creator 패턴: 집합, 포함, 초기화 정보 보유 클래스 | DIP: 팩토리 패턴, 의존성 주입 |
이벤트 처리 | Controller 패턴: 시스템 이벤트 중앙 집중화 | SRP: 각 클래스의 명확한 책임 분리 |
변화 대응 | Protected Variations: 인터페이스로 변화 지점 보호 | OCP: 추상화를 통한 확장 가능 설계 |
간접 참조 | Indirection: 중간 객체를 통한 결합도 감소 | DIP: 추상화 계층을 통한 의존성 역전 |
서로에 대한 강점과 약점
구분 | GRASP | SOLID |
---|---|---|
강점 | 설계 초기 구조 안정성, 책임 분배, 협력 구조 | 코드 품질, 유지보수성, 확장성, 테스트 용이성 |
약점 | 구체적 코드 품질 지침 부족, 패턴 남발 위험 | 설계 초기 구조 설계 미흡, 원칙 남용 위험 |
구조 및 아키텍처
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 Architecture | SOLID 원칙을 아키텍처 수준으로 확장한 로버트 C. 마틴의 계층 구조 기반 설계 접근법 |
아키텍처 패턴 | Hexagonal Architecture | DIP (의존성 역전 원칙) 을 포트와 어댑터 개념으로 실현한 아키텍처 패턴. 외부 의존성과 내부 도메인 분리를 강조 |
설계 원칙 | 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 위반 지표로 활용됨 |
자동화 도구 | SonarQube | SOLID 및 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) |
설계 자동화와 AI | AI 기반 설계 추천 및 품질 보증 도구 동향 분석 | 신기술 / 자동화 | 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)
- GRASP (object-oriented design) - Wikipedia
- GRASP Patterns Explained – Kamil Grzybek
- Object-Oriented Design with GRASP – Craig Larman
- GRASP 패턴 상세 설명 – Refactoring Guru
- GRASP Design Principles in OOAD – GeeksforGeeks
- GRASP vs SOLID 비교 – Medium
- GRASP vs SOLID 차이 – DEV.to
SOLID (Object-Oriented Design Principles)
- SOLID Principles - Wikipedia
- SOLID Principles Explained – Baeldung
- SOLID: The First 5 Principles – DigitalOcean
- The SOLID Principles Explained in Plain English – freeCodeCamp
- SOLID 원칙 상세 설명 – Refactoring Guru
- Martin Fowler – SOLID
- Design Patterns over SOLID and GRASP Principles in Real Projects – ResearchGate
공통/일반 객체지향 설계 원칙
- Design Principles in Software Engineering – GeeksforGeeks
- 객체지향 설계 원칙 - Dream Coding
- 객체지향 설계 패턴과 원칙 - DigitalOcean
- SOLID, GRASP, and Other Principles – DZone