Files
sundol/docs/DESIGN_PATTERNS_GUIDE.md
joungmin 5d8b0fcdb8 Initial project setup with env template and gitignore
- .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>
2026-03-30 06:37:07 +00:00

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를 단순화할 때

주의사항

  • 과도한 패턴 사용 금지: 단순한 문제에 복잡한 패턴 적용 지양
  • 성능 고려: 일부 패턴은 성능 오버헤드 발생 가능
  • 팀 이해도: 팀원들이 이해할 수 있는 수준의 패턴 선택