노트

디자인 패턴

Design Patterns

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

쉽게 말하면

디자인 패턴은 요리사들이 '볶음', '조림'처럼 자주 쓰는 조리법에 붙인 이름 같은 거예요. 완성된 레시피를 베끼는 게 아니라, 비슷한 문제를 만났을 때 '이건 그 방식으로 풀자'고 짧게 말할 수 있게 해 줘요.

비유가 깨지는 곳 조리법 이름을 안다고 모든 요리에 써야 하는 건 아니에요. 패턴은 목표가 아니라 수단이라 작은 문제엔 복잡도만 늘고, 일급 함수가 있는 언어에선 함수 하나로 충분한 경우도 많아요.

반복해서 나타나는 설계 문제에 대한 검증된 해결 구조와 그 이름. 복사해 쓰는 완성 코드가 아니라 객체들이 협력하는 방식을 설명하는 어휘다. 1994년 이른바 GoF(Gang of Four, 네 명의 저자)의 책 『Design Patterns: Elements of Reusable Object-Oriented Software』가 23개 패턴을 정리하며 널리 퍼졌다.

세 갈래

  • 생성 패턴: 어떤 객체를 어떻게 만들지를 감춘다
  • 구조 패턴: 클래스와 객체를 조합해 더 큰 구조를 만든다
  • 행동 패턴: 객체 사이의 책임 분배와 대화 방식을 정리한다

패턴을 읽는 네 가지 질문

  1. 어떤 변경을 쉽게 만들려는가?
  2. 그 대가로 어떤 복잡성을 더하는가?
  3. 패턴 없이 더 단순하게 풀 수 있는가?
  4. 적용한 뒤 테스트로 지켜야 할 협력은 무엇인가?

주의

  • 패턴은 목표가 아니라 수단이다. 작은 문제에 큰 패턴을 쓰면 복잡도만 늘어난다(YAGNI, 구성요소 줄이기)
  • 패턴 이름을 꺼내기 전에 지금 코드의 변경 압력을 설명할 수 있어야 한다. 보통은 이름 바꾸기, 함수 추출, 조건문 정리로 충분한지 먼저 본다(리팩터링)
  • 언어가 발전하면서 일부 패턴은 문법이나 표준 기능으로 대체됐다. 일급 함수가 있으면 전략 패턴·커맨드 패턴은 함수 하나로, 이터레이터는 언어의 반복 프로토콜로 충분한 경우가 많다
  • Python은 덕 타이핑 덕에 구조가 느슨하고, TypeScript는 인터페이스로 협력 계약을 명시적으로 드러낸다(구조적 타이핑)

리팩터링은 지금 코드를 이런 구조로 옮겨 가는 방법이고, 패턴은 그 도착지의 이름이다. JavaScript·React 쪽 패턴은 『자바스크립트 + 리액트 디자인 패턴』, UI 구조 패턴은 MVC·MVP·MVVM에 따로 있다.

출처: Design Patterns — Refactoring.Guru

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 심플 디자인

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

  • 코드 냄새

    당장 버그는 아니지만 이해나 변경 비용을 높이는 구조적 신호. 리팩터링을 언제 시작하고 멈출지에 정확한 공식은 없어서, 냄새라는 어휘로 직관을 공유한다.

  • 어댑터 패턴

    쓸 수 있는 객체가 있는데 인터페이스가 맞지 않을 때, 중간에서 호출을 받아 실제 객체가 알아듣는 형태로 바꿔 주는 패턴. 전원 플러그 변환기와 같다.

  • 언어적 안티패턴

    이름, 타입, 주석이 말하는 것과 코드가 실제로 하는 일이 어긋나는 것. 읽는 사람을 잘못된 추측으로 이끈다.

  • 데코레이터 패턴

    같은 인터페이스를 구현한 래퍼로 객체를 감싸, 원래 객체를 고치지 않고 앞뒤에 기능을 덧붙이는 패턴. 래퍼를 여러 겹 쌓아 기능을 조합할 수 있다.

보기 옵션