--- id: "wiki-2026-0507-102" title: "소프트웨어_설계_원칙_및_디자인_패턴" category: "[[10_Wiki/Topics]]" status: "verified" canonical_id: "self" aliases: ["Software Design Principles", "Design Patterns", "SOLID", "DRY", "KISS", "YAGNI", "GoF Patterns", "디자인 패턴", "설계 원칙", "클린 코드"] duplicate_of: "none" source_trust_level: "A" confidence_score: 1.0 tags: ["Programming", "Software Engineering", "Design Patterns", "SOLID", "Clean Code"] raw_sources: ["SOLID_Principles.md", "Design_Patterns.md", "DRY_Principle.md", "Clean Code.md"] last_reinforced: "2026-05-07" github_commit: "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를 개발할 때. **언제 이 지식을 쓰면 안 되는가:** - 극도의 성능 최적화가 필요한 하위 레벨 시스템 (추상화 오버헤드가 문제가 될 수 있음). - 수명이 매우 짧은 일회성 스크립트나 실험적 코드. **이 지식을 적용할 때의 권장 절차:** 1. **문제 식별:** 중복 코드(DRY 위반)나 거대 클래스(SRP 위반) 등 악취(Code Smell) 탐지. 2. **패턴 매칭:** 현재 상황에 적합한 디자인 패턴(예: 조건문이 너무 많으면 Strategy 패턴) 선정. 3. **추상화:** 인터페이스를 먼저 정의하고 클라이언트 코드를 작성. 4. **구현:** SOLID 원칙을 준수하며 구체 클래스 구현. 5. **검증:** 단위 테스트를 통해 각 컴포넌트가 독립적으로 작동하는지 확인. **주의사항 또는 알려진 한계:** - **디자인 패턴 남용:** 모든 문제에 패턴을 적용하려다 오히려 구조가 더 복잡해지는 '패턴 중독' 주의. 단순함(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 |