본문 바로가기
백엔드

(Design Pattern) 디자인 패턴 들어가기 (핵심 14가지 패턴)

by 더하리 2025. 3. 9.

 

GoF의 디자인 패턴에는 23가지가 있으나..!

핵심으로 여겨지는 14가지 패턴에 대한 정의, 그리고 특징을 가져와봤다.

어떤 것들이 있는지 알기 위함 정도로 봐주면 좋을 듯 하다! 
깊이 있는 이해를 위해서라면 무조건 예제를 보는 것을 추천!!


  • 생성 패턴
    : 객체 인스턴스를 생성하는 패턴, 클라이언트와 해당 클라이언트가 생성해야 하는 객체 인스턴스 사이 연결을 끊어주는 패턴
    • 싱글턴 패턴(Singleton Pattern)
      • 특정 클래스에 객체 인스턴스가 하나만 만들어지도록 해주는 패턴(유일한 인스턴스 제공)
        • 생성자를 명시적으로 private으로 선언해서 외부에서 여러 개의 인스턴스를 만들지 못하게 막음
        • static변수를 사용해 하나의 인스턴스만 유지
      • 전역적으로 접근 가능
        • get 메서드 제공
      • 메모리 절약 & 성능 최적화 (불필요한 객체 생성 방지)
    • 추상 팩토리 패턴
      • 구상 클래스에 의존하지 않고도 서로 연관, 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스를 제공
      • 관련된 객체들의 그룹을 생성하는 인터페이스를 제공하는 패턴
        • 객체 생성 로직을 캡슐화→ 서브 클래스에서 구체적 구현을 결정하도록 유도
      • 장점
        • 관련된 객체들을 일관성 있게 생산 가능
        • 클라이언트에서 구체적 클래스에 의존하지 x (느슨한 결합, 유연성 증가)
        • 새로운 제품군 추가는 쉬움
      • 단점
        • 새로운 객체 추가는 어려움(인터페이스 수정)
    • 팩토리 메소드 패턴
      • 단일 객체 생성에 집중
      • 객체 생성을 서브 클래스에서 결정하도록 하는 패턴
      • new 키워드를 직접 사용하지 X, 팩토리 메서드 통해 객체 생성
      • 클라이언트 코드가 구체적 클래스에 의존 X (유연성 증가)

 

  • 행동 패턴
    : 클래스와 객체들이 상호작용하는 방법, 역할을 분담하는 방법 다루는 패턴
    • 템플릿 메소드 패턴
      • 알고리즘의 골격(템플릿)을 정의
        • 실행순서 정해놓고, 일부 메서드는 서브클래스에서 오버라이드하도록 설계
      • 알고리즘 일부 단계(구체적인 로직)를 서브클래스에서 구현O
    • 싱글턴 패턴 (위와 동일)
    • 상태 패턴 
      • 객체 내부 상태가 바뀜에 따라 객체 행동 바꿀 수 있음
      • 객체 내부 상태를 클래스로 캡슐화 → 상태 변경 시 객체 동작도 변경되도록
        • if-else, switch-case 대신 상태별 클래스를 만들어 다형성으로 해결
      • 조건문 없이 유연하게 상태를 추가할 수 있음
      • 자판기, 문(잠김/열림), tcp연결 등 상태가 중요한 곳에서 유용하게 사용됨
    • 반복자 패턴
      • 컬렉션 구현방법을 노출하지 않으면서 집합체 내 모든 항목에 접근하는 방법 제공
        • for문 없이도 객체 순회 가능
      • 컬랙션과 반복 로직을 분리해 유지보수가 용이
      • hasNext(), next() 등의 인터페이스를 제공해 일관된 접근방식 제공
        • 자바 Iterator인터페이스와 유사
    • 전략 패턴
      • 특정 콘텍스트에서 알고리즘을 별도로 분리하는 설계 방법
      • 알고리즘을 직접 수정하지 않고도 쉽게 교체 가능하며 OCP(개방-폐쇄 원칙, Open-Closed Priciple)와 SRP(단일 책임 원칙, Single Responsibility Principle)을 지킬 수 있음
      • 일반적으로 if - else 로 구성된 코드 블록이 비슷한 기능을 수행하는 경우 전략 패턴을 사용함으로써 코드를 확장 가능하도록 변경할 수 있음
    • 옵저버 패턴 
      • 객체 상태 변화 발생 시, 해당 변화를 의존하는 다른 객체에 자동으로 통보하는 디자인 패턴 ,일대다 의존성을 정의함
      • 이벤트 처리, 구독-발행 모델에 사용됨
      • 옵저버 패턴 핵심 개념
        • 주체(관찰자에 알림을 전달하는 객체)/ 옵저버/ 알림 매커니즘/ 1:N 관계

 

  • 구조 패턴
    : 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
    (객체간 상호작용을 단순화하고 유연하게 만들어주는 디자인 패턴)
    • 데코레이터 패턴
      • 객체에 추가요소를 동적으로 더할 수 있음
      • 기존 클래스를 상속하지 않고도, 기능을 확장할 수 있도록 도와주는 패턴
        • 기존 객체 수정X, 추가적 기능 덧붙일 수 있음
    • 프록시 패턴
      • 특정 객체로의 접근을 제어하거나 추가적인 작업을 할 수 있도록 함
      • 성능 최적화, 접근 제어, 로깅, 지연 초기화 등을 위한 용도
      • 주요 특징
        • 대리 객체: 실제 객체를 대신해 그 객체에 대한 접근을 제어하는 객체
        • 실제 객체: 실제 작업을 수행하는 객체
        • 접근 제어
        • 지연 초기화 (객체가 실제로 필요할 때까지 초기화하기 않도록 함)
      • 객체 생성 비용이 클 경우 프록시를 통해 객체를 지연 로딩, 캐싱해 성능 최적화 가능
    • 어댑터 패턴
      • 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환함
      • 호환되지 않는 인터페이스를 가진 두 객체를 연결
        • 두 클래스의 인터페이스가 다를 때 변환해주는 중재자 역할
      • 종류
        • 클래스 어댑터 패턴
          • 상속을 이용해 두 클래스 간 호환을 맞춤
        • 객체 어댑터 패턴
          • 객체를 사용해 어댑터 구현
      • 상호 운용성 증가, 복잡도 증가
    • 컴포지트 패턴
      • 객체를 트리구조로 구성해서 부분-전체 계층구조를 구현
      • 일관된 방식으로 개별 객체와 복합 객체 다루기 가능
      • 장점: 새로운 Leaf, Composite 추가가 쉽고, 클라이언트 코드 변경이 필요 없음
      • 단점: 구조가 복잡해질 수 있으며 메모리 사용량 증가 가능
    • 퍼사드 패턴
      • 서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어줌
      • 복잡한 서브시스템의 인터페이스를 단순화 → 클라이언트가 더 쉽게 사용할 수 있도록 하는 구조적 디자인 패턴
      • 패턴 구조
        • 서브시스템: 개별 클래스로 이뤄진 복잡 시스템
        • 퍼사드: 서브 시스템을 감싸는 간단한 인터페이스 제공하는 클래스
        • 클라이언트: 퍼사드를 통해 접근