https://en.wikipedia.org/wiki/Software_design_pattern

https://en.wikipedia.org/wiki/Design_Patterns

https://www.devkuma.com/docs/design-pattern/flyweight/

디자인 패턴의 확장된 범주

디자인 패턴은 크게 세 가지로 구분할 수 있습니다:

  1. 객체지향 디자인 패턴 - 전통적인 GoF 패턴 (싱글톤, 팩토리, 옵저버 등)
    • 주로 객체 간의 관계와 상호작용에 초점
  2. 아키텍처 패턴 - 소프트웨어 시스템 전체 구조에 관한 패턴
    • MVC, MVVM, 마이크로서비스 아키텍처 등
  3. 엔터프라이즈 통합 패턴 - 분산 시스템 간 통신과 안정성에 관한 패턴
    • Saga서킷브레이커는 이 범주에 속함

프로그래밍에서 디자인 패턴이란?

디자인 패턴은 소프트웨어 개발 중에 자주 발생하는 문제들에 대한 일반적이고 재사용 가능한 해결책입니다. 개발자들이 반복적으로 마주치는 문제들을 효과적으로 해결할 수 있는 검증된 방법을 제공합니다.

디자인 패턴의 핵심 개념

디자인 패턴은 코드 그 자체가 아니라 문제를 해결하기 위한 템플릿이나 아이디어입니다. 패턴은 특정 상황에서 코드를 어떻게 구조화하면 좋을지에 대한 지침을 제공합니다.

디자인 패턴의 분류

일반적으로 디자인 패턴은 세 가지 주요 카테고리로 분류됩니다:

1. 생성 패턴 (Creational Patterns)

객체 생성 메커니즘을 다루는 패턴으로, 상황에 적합한 객체를 유연하게 생성합니다.

예시:

  • 싱글톤(Singleton): 클래스의 인스턴스가 하나만 생성되도록 보장
  • 팩토리 메서드(Factory Method): 객체 생성을 서브클래스에 위임
  • 빌더(Builder): 복잡한 객체를 단계별로 생성
  • 프로토타입(Prototype): 기존 객체를 복제하여 새로운 객체 생성

2. 구조 패턴 (Structural Patterns)

클래스와 객체의 구성을 다루는 패턴으로, 더 큰 구조를 형성하기 위해 객체들을 조합합니다.

예시:

  • 어댑터(Adapter): 호환되지 않는 인터페이스를 함께 작동하도록 변환
  • 데코레이터(Decorator): 객체에 동적으로 책임 추가
  • 컴포지트(Composite): 객체 트리 구조로 부분-전체 계층 표현
  • 프록시(Proxy): 다른 객체에 대한 접근을 제어하는 대리자 제공

3. 행동 패턴 (Behavioral Patterns)

객체 간의 상호작용과 책임 분배를 다루는 패턴입니다.

예시:

  • 옵저버(Observer): 객체 상태 변화를 다른 객체에 알리는 메커니즘
  • 전략(Strategy): 알고리즘군을 정의하고 각각 캡슐화하여 교체 가능하게 함
  • 커맨드(Command): 요청을 객체로 캡슐화하여 매개변수화, 큐에 저장, 실행 취소 등이 가능하게 함
  • 상태(State): 객체의 내부 상태에 따라 행동을 변경

디자인 패턴의 장점

  1. 검증된 솔루션: 많은 개발자들이 시간을 들여 검증한 해결책을 제공
  2. 코드 재사용성: 재사용 가능한 솔루션을 통해 개발 시간 단축
  3. 확장성: 시스템을 쉽게 확장하고 유지보수할 수 있는 구조 제공
  4. 통일된 용어: 개발자 간 의사소통을 위한 공통 어휘 제공
  5. 품질 향상: 더 유연하고 유지보수하기 쉬운 코드 작성 가능

디자인 패턴의 한계

  1. 과도한 사용: 간단한 문제에 복잡한 패턴을 적용하면 오버엔지니어링 발생
  2. 성능 저하: 일부 패턴은 추가적인 레이어나 간접 참조로 성능에 영향을 줄 수 있음
  3. 학습 곡선: 패턴을 이해하고 적절히 적용하는 데 시간이 필요

디자인 패턴 활용 시 고려사항

  • 패턴은 목적이 아닌 수단임을 기억해야 합니다
  • 문제를 먼저 이해한 후 적절한 패턴을 선택해야 합니다
  • 패턴을 맹목적으로 사용하지 말고 상황에 맞게 조정해야 합니다
  • 때로는 간단한 해결책이 복잡한 패턴보다 나을 수 있습니다

디자인 패턴은 소프트웨어 설계의 지혜를 담은 공식 언어와 같으며, 효과적으로 활용하면 더 유지보수하기 쉽고 유연한 코드를 작성할 수 있습니다.