7.4 KiB
7.4 KiB
id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, tags, raw_sources, last_reinforced, github_commit, tech_stack
| id | title | category | status | canonical_id | aliases | duplicate_of | source_trust_level | confidence_score | tags | raw_sources | last_reinforced | github_commit | tech_stack | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| wiki-2026-0507-102 | 소프트웨어 설계 원칙 및 디자인 패턴 | 10_Wiki/Topics | verified | self |
|
none | A | 1.0 |
|
|
2026-05-07 | pending |
|
소프트웨어_설계_원칙_및_디자인_패턴
📌 한 줄 통찰 (The Karpathy Summary)
"코드는 한 번 작성되지만 수만 번 읽힌다." 인간의 인지 한계를 극복하고 변화의 파동을 국소화하기 위해, 검증된 구조(Design Patterns)와 엄격한 규율(SOLID/Clean Code)을 적용하여 '읽기 쉽고 고치기 쉬운' 생태계를 구축하는 지침서.
📖 구조화된 지식 (Synthesized Content)
추출된 패턴:
설계의 본질은 **'추상화'**와 **'결합도 관리'**에 있다. SOLID 원칙이 클래스 레벨의 올바른 의존성 방향을 제시한다면, 디자인 패턴은 반복되는 문제 상황에 대한 검증된 구조적 해답을 제공한다. 이 둘의 조화는 시스템의 부패를 막는 가장 강력한 방어선이다.
세부 내용:
1. 5대 핵심 설계 원칙: SOLID
- SRP (단일 책임 원칙): 클래스는 단 하나의 변경 이유만 가져야 함. 책임이 명확하면 테스트와 재사용이 용이함.
- OCP (개방-폐쇄 원칙): 확장에는 열려 있고 수정에는 닫혀 있어야 함. 인터페이스와 다형성을 활용하여 기존 코드를 건드리지 않고 기능을 추가.
- LSP (리스코프 치환 원칙): 서브타입은 언제나 기반 타입으로 교체 가능해야 함. 상속 관계에서 부모의 계약을 어기지 않는 일관성 보장.
- ISP (인터페이스 분리 원칙): 클라이언트가 사용하지 않는 메서드에 의존하지 않도록 거대 인터페이스를 구체적인 여러 개로 분리.
- DIP (의존성 역전 원칙): 고수준 모듈은 저수준 모듈의 구현이 아닌 추상화(Interface)에 의존해야 함.
2. 주요 디자인 패턴 (GoF 기반)
- 생성 패턴 (Creational): 객체 생성 과정을 추상화.
- Singleton: 인스턴스를 하나만 생성하고 전역 접근 제공.
- Factory Method: 객체 생성을 서브클래스에 위임.
- Builder: 복잡한 객체 생성을 단계별로 분리.
- 구조 패턴 (Structural): 클래스/객체 조합을 통한 더 큰 구조 형성.
- Adapter: 서로 다른 인터페이스를 연결하는 중개자.
- Decorator: 객체에 동적으로 새로운 책임을 추가.
- Facade: 복잡한 서브시스템에 대한 단순화된 인터페이스 제공.
- 행위 패턴 (Behavioral): 객체 간의 책임 할당과 알고리즘 교류.
- Observer: 상태 변화를 관찰자들에게 통지.
- Strategy: 런타임에 알고리즘을 교체 가능하게 함.
- Command: 요청을 객체로 캡슐화하여 매개변수화 및 취소 지원.
3. 실용적 설계 원칙 (KISS, DRY, YAGNI)
- DRY (Don't Repeat Yourself): 지식의 중복을 배제. 모든 정보는 시스템 내에서 단일하고 권위 있는 표현을 가져야 함.
- KISS (Keep It Simple, Stupid): 항상 단순함을 지향. 오버엔지니어링은 유지보수의 적임.
- YAGNI (You Aren't Gonna Need It): 실제로 필요하기 전까지는 미래를 대비한 기능을 미리 구현하지 않음.
🤖 LLM 활용 힌트 (How to Use This Knowledge)
언제 이 지식을 쓰는가:
- 신규 모듈을 설계하거나 기존 스파게티 코드를 리팩토링할 포인트가 필요할 때.
- 코드 리뷰 시 "왜 이 코드가 나쁜지"에 대한 논리적 근거를 제시해야 할 때.
- 인터페이스 기반의 확장성 있는 라이브러리나 SDK를 개발할 때.
언제 이 지식을 쓰면 안 되는가:
- 극도의 성능 최적화가 필요한 하위 레벨 시스템 (추상화 오버헤드가 문제가 될 수 있음).
- 수명이 매우 짧은 일회성 스크립트나 실험적 코드.
이 지식을 적용할 때의 권장 절차:
- 문제 식별: 중복 코드(DRY 위반)나 거대 클래스(SRP 위반) 등 악취(Code Smell) 탐지.
- 패턴 매칭: 현재 상황에 적합한 디자인 패턴(예: 조건문이 너무 많으면 Strategy 패턴) 선정.
- 추상화: 인터페이스를 먼저 정의하고 클라이언트 코드를 작성.
- 구현: SOLID 원칙을 준수하며 구체 클래스 구현.
- 검증: 단위 테스트를 통해 각 컴포넌트가 독립적으로 작동하는지 확인.
주의사항 또는 알려진 한계:
- 디자인 패턴 남용: 모든 문제에 패턴을 적용하려다 오히려 구조가 더 복잡해지는 '패턴 중독' 주의. 단순함(KISS)이 최우선임.
- 추상화 비용: 인터페이스 증가로 인해 코드 탐색이 어려워질 수 있으므로 적절한 수준에서 타협 필요.
🧪 검증 상태 (Validation)
- 정보 상태: verified
- 출처 신뢰도: A
- 검토 이유: GoF, SOLID 등 검증된 소프트웨어 공학 표준을 기반으로 통합됨.
🧬 중복 검사 (Duplicate Check)
- 기존 유사 문서: SOLID_Principles, Design_Patterns, DRY_Principle, Clean Code, Singleton Pattern, Observer Pattern 등 150여 개
- 처리 방식: MERGE & ARCHIVE
- 처리 이유: 개별 원칙과 패턴들이 낱개 문서로 흩어져 있어 전체적인 맥락 파악이 어려움. 이를 '설계 체계'라는 하나의 마스터 문서로 통합하여 활용성을 극대화함.
⚠️ 모순 및 업데이트 (Contradictions & Updates)
- 상속보다는 합성 (Composition over Inheritance): 과거에는 상속(LSP)을 강조했으나, 현대 설계는 유연성을 위해 합성을 우선시함.
- 함수형 프로그래밍의 영향: 상태를 가진 객체 패턴보다 순수 함수와 불변성을 활용한 패턴 비중 확대 중.
🔗 지식 연결 (Graph)
- Parent: 10_Wiki/Topics
- Related: 도메인_주도_설계(DDD)_및_소프트웨어_아키텍처, 테스트_전략_및_방법론, 프론트엔드_및_Nodejs_개발_워크플로우
- Raw Source: Architecture 및 Programming 폴더 내 다수 파일
🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|---|---|---|---|
| 2026-05-07 | 150개 이상의 설계 원칙/디자인 패턴 관련 문서 통합 및 v3.0 규격 적용 | MERGE | A |
💻 코드 패턴 (Code Patterns)
패턴 1: (TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)
# TODO
🤔 의사결정 기준 (Decision Criteria)
선택 A를 써야 할 때:
- (TODO)
선택 B를 써야 할 때:
- (TODO)
기본값:
(TODO)
❌ 안티패턴 (Anti-Patterns)
- [안티패턴]: (TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)