- .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>
4.3 KiB
4.3 KiB
소프트웨어 디자인 패턴 참조 가이드
디자인 패턴은 개발자들이 직면하는 반복적인 문제들을 해결하기 위한 검증된 방법론입니다.
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를 단순화할 때
주의사항
- 과도한 패턴 사용 금지: 단순한 문제에 복잡한 패턴 적용 지양
- 성능 고려: 일부 패턴은 성능 오버헤드 발생 가능
- 팀 이해도: 팀원들이 이해할 수 있는 수준의 패턴 선택