노트

구조 패턴

Structural Design Patterns

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

쉽게 말하면

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

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

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

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

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

출처: Structural Design Patterns — Refactoring.Guru

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 전략 패턴

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

  • 생성 패턴

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

  • 행동 패턴

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

  • 구조적 공유

    구조적 공유(Structural Sharing)는 새 버전의 데이터를 만들 때 바뀌지 않은 부분은 이전 버전의 객체를 그대로 가리키게 하는 기법이다. 바뀐 노드와 그 노드까지 올라가는 경로만 새로 만들고, 나머지 가지는 두 버전이 함께 쓴다. 불변 데이터를 다루면서도 매번 전체를 복사하지 않게 해 준다.

  • 심플 디자인

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

보기 옵션