노트

구조 패턴

Structural Design Patterns

설계#pattern · 연결된 개념 8개

쉽게 말하면

구조 패턴은 이미 있는 부품을 감싸고 이어서 더 큰 구조를 만드는 방법들이에요. 여행용 변환 플러그, 기능을 더해 주는 폰 케이스, 매장 안내 데스크처럼 무엇을 위해 감싸느냐에 따라 이름이 달라져요.

비유가 깨지는 곳 겉모양이 비슷해서 헷갈리기 쉬워요. 인터페이스를 바꾸면 어댑터, 그대로 두고 기능을 더하면 데코레이터, 접근을 통제하면 프록시, 여럿을 하나로 단순화하면 퍼사드예요.

클래스와 객체를 조합해 더 큰 구조를 만드는 패턴들. 맞지 않는 인터페이스, 부분과 전체, 기능 덧붙이기, 접근 제어 같은 문제를 다룬다. 상당수가 "같은 인터페이스를 가진 객체로 감싼다"는 같은 모양을 하고 있고, 감싸는 목적이 다르다.

  • 어댑터 패턴: 맞지 않는 인터페이스를 기대하는 모양으로 바꾼다
  • 데코레이터 패턴: 감싸서 기능을 겹겹이 덧붙인다
  • 퍼사드 패턴: 복잡한 하위 시스템 앞에 단순한 창구를 세운다
  • 컴포지트 패턴: 개별 객체와 묶음을 같은 방식으로 다룬다
  • 프록시(Proxy): 같은 인터페이스로 실제 객체 앞에서 접근을 가로채 권한 확인·지연 로딩·캐싱을 한다. 스프링이 대표적인 사용처다(스프링 프록시)
  • 브리지(Bridge): 기능 축과 구현 축이 함께 상속 계층을 폭발시킬 때(리모컨 종류 × 기기 종류), 추상 쪽이 구현 객체를 참조해 위임하게 해서 두 축을 따로 확장한다. 축이 실제로 독립적이지 않으면 추상화만 복잡해진다
  • 플라이웨이트(Flyweight): 비슷한 객체가 대량으로 생길 때 공통 내부 상태를 공유하고, 바뀌는 외부 상태만 따로 넘겨 메모리를 줄인다(텍스트 렌더링의 글자 모양 데이터). 메모리가 실제 병목인지 측정한 뒤 쓴다

감싸는 패턴들을 구분하는 법: 인터페이스를 바꾸면 어댑터, 그대로 두고 기능을 더하면 데코레이터, 그대로 두고 접근을 통제하면 프록시, 여럿을 하나로 단순화하면 퍼사드다.

출처: Structural Design Patterns — Refactoring.Guru

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 전략 패턴

    같은 목적을 가진 여러 알고리즘을 각각 별도 객체(또는 함수)로 빼고, 실행할 때 그중 하나를 골라 끼우는 패턴. 호출하는 쪽은 공통 인터페이스만 안다.

  • 생성 패턴

    객체를 만드는 과정을 감추는 패턴들. 어떤 구체 클래스를 고를지, 생성 단계를 어떻게 보장할지, 생성 비용을 어떻게 줄일지를 다룬다. 호출하는 쪽이 new 구체클래스()를 직접 쓰지 않게 해서 결합도(Coupling)를 낮추는 것이 공통점이다.

  • 행동 패턴

    객체 사이의 책임 분배와 대화 방식을 정리하는 패턴들. 요청 전달, 알고리즘 교체, 상태 변화, 알림, 작업 캡슐화 같은 문제를 다룬다.

  • 심플 디자인

    켄트 벡이 XP(Extreme Programming)에서 제시한 단순한 설계의 네 가지 규칙. 우선순위 순으로 ① 모든 테스트를 통과하고 ② 의도를 드러내고 ③ 중복이 없고 ④ 요소가 가장 적다. 마틴 파울러가 이렇게 정리한 형태가 널리 쓰인다.

  • NestJS

    NestJS는 TypeScript를 전제로 모듈·의존성 주입(Dependency Injection, DI)·데코레이터(decorator) 구조를 제공하는 Node.js 서버 프레임워크다. 2017년 Kamil Myśliwiec가 만들었고, 구조를 강제하는 방식 때문에 흔히 "Node.js의 Spring"이라 불린다.

보기 옵션