- .gitignore: Java/Maven, Node.js, IDE, OS, credentials - .env.sample: backend + frontend environment variable template - README.md: project overview and getting started guide - CLAUDE.md: development rules and guidelines - docs/: SUNDOL spec and design patterns guide Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
105 lines
4.3 KiB
Markdown
105 lines
4.3 KiB
Markdown
# 소프트웨어 디자인 패턴 참조 가이드
|
|
|
|
디자인 패턴은 개발자들이 직면하는 반복적인 문제들을 해결하기 위한 검증된 방법론입니다.
|
|
|
|
## 1. 생성 패턴 (Creational Patterns)
|
|
|
|
객체 생성 방식과 관련된 패턴들
|
|
|
|
### 싱글톤 (Singleton)
|
|
|
|
- **목적**: 특정 클래스의 인스턴스가 오직 하나만 생성되도록 보장
|
|
- **사용 예**: 앱 전체의 설정 데이터, 전역 상태 관리, 공유 자원 접근
|
|
- **특징**: 애플리케이션 전체에서 단일 인스턴스 보장
|
|
|
|
### 팩토리 (Factory)
|
|
|
|
- **목적**: 객체 생성 로직을 캡슐화하여 클라이언트에서 직접 생성하지 않도록 함
|
|
- **사용 예**: 플랫폼에 따라 다른 버튼 객체 생성, 버거 주문 시스템
|
|
- **특징**: new 키워드 대신 함수나 메서드를 통한 객체 생성
|
|
|
|
### 빌더 (Builder)
|
|
|
|
- **목적**: 복잡한 객체를 단계별로 구성하여 생성
|
|
- **사용 예**: 많은 파라미터가 필한 객체 생성
|
|
- **특징**: 메서드 체이닝을 통한 단계별 구성 후 build() 메서드로 완성
|
|
|
|
### 프로토타입 (Prototype)
|
|
|
|
- **목적**: 클래스 상속 대신 기존 객체를 복제하여 기능 확장
|
|
- **사용 예**: 자바스크립트의 프로토타입 상속
|
|
- **특징**: 객체 복제(Clone)를 통한 기능 확장
|
|
|
|
## 2. 구조 패턴 (Structural Patterns)
|
|
|
|
객체 간의 관계와 조합에 관련된 패턴들
|
|
|
|
### 퍼사드 (Facade)
|
|
|
|
- **목적**: 복잡한 내부 시스템을 단순한 인터페이스로 감싸기
|
|
- **사용 예**: API 래퍼 클래스, 복잡한 라이브러리의 간단한 인터페이스
|
|
- **특징**: 복잡한 세부사항을 숨기고 상위 수준의 인터페이스 제공
|
|
|
|
### 어댑터 (Adapter)
|
|
|
|
- **목적**: 서로 호환되지 않는 인터페이스를 연결
|
|
- **사용 예**: 마이크로 USB를 USB 포트에 연결하는 어댑터
|
|
- **특징**: 기존 클래스를 수정하지 않고 다른 인터페이스와 호환
|
|
|
|
### 프록시 (Proxy)
|
|
|
|
- **목적**: 실제 객체 대신 대리인 객체를 사용하여 접근 제어나 부가 기능 수행
|
|
- **사용 예**: Vue.js의 반응형 시스템, 지연 로딩, 캐싱
|
|
- **특징**: 실제 객체에 대한 접근을 제어하거나 추가 기능 제공
|
|
|
|
## 3. 행위 패턴 (Behavioral Patterns)
|
|
|
|
객체 간의 통신과 상호작용에 관련된 패턴들
|
|
|
|
### 옵저버 (Observer/Pub-Sub)
|
|
|
|
- **목적**: 한 객체의 상태 변화를 여러 구독자들에게 알림
|
|
- **사용 예**: Firebase의 실시간 데이터 업데이트, 유튜브 구독 알림 시스템
|
|
- **특징**: 1:N 관계의 실시간 알림 시스템
|
|
|
|
### 이터레이터 (Iterator)
|
|
|
|
- **목적**: 컬렉션의 내부 구조를 노출하지 않고 요소들을 순회
|
|
- **사용 예**: 배열, 연결 리스트, 트리 등의 순회
|
|
- **특징**: 복잡한 자료구조 내부를 몰라도 표준화된 방법으로 순회 가능
|
|
|
|
### 전략 (Strategy)
|
|
|
|
- **목적**: 알고리즘을 외부에서 주입받아 사용하여 동작을 확장
|
|
- **사용 예**: 정렬 알고리즘 선택, 결제 방식 선택
|
|
- **특징**: Open-Closed 원칙 준수, 기존 코드 수정 없이 동작 확장
|
|
|
|
### 메디에이터 (Mediator)
|
|
|
|
- **목적**: 객체들이 직접 통신하지 않고 중재자를 거쳐 복잡한 관계 단순화
|
|
- **사용 예**: Express.js의 미들웨어, 채팅방 시스템
|
|
- **특징**: 객체 간 결합도 감소, 중앙 집중식 통신 관리
|
|
|
|
### 스테이트 (State)
|
|
|
|
- **목적**: 객체의 내부 상태에 따라 행동이 완전히 달라지게 함
|
|
- **사용 예**: 게임 캐릭터 상태, UI 컴포넌트 상태
|
|
- **특징**: 복잡한 조건문(if/switch)을 클래스로 대체하여 관리
|
|
|
|
## 패턴 적용 가이드
|
|
|
|
### 언제 사용할까?
|
|
|
|
- **싱글톤**: 전역 설정, 로깅, 캐시 관리
|
|
- **팩토리**: 객체 생성이 복잡하거나 조건부일 때
|
|
- **빌더**: 생성자 매개변수가 많거나 선택적일 때
|
|
- **옵저버**: 이벤트 기반 시스템, 상태 변화 알림
|
|
- **전략**: 알고리즘 교체가 필요한 경우
|
|
- **퍼사드**: 복잡한 API를 단순화할 때
|
|
|
|
### 주의사항
|
|
|
|
- **과도한 패턴 사용 금지**: 단순한 문제에 복잡한 패턴 적용 지양
|
|
- **성능 고려**: 일부 패턴은 성능 오버헤드 발생 가능
|
|
- **팀 이해도**: 팀원들이 이해할 수 있는 수준의 패턴 선택
|