이 장을 읽기 전에
결합도와 응집도, SOLID 원칙 개요를 안다고 가정한다. 디자인 패턴은 이 원칙들을 지키기 위한 “이름 붙은 해법"이라는 관점으로 접근한다 — 원칙이 목표라면, 패턴은 그 목표를 달성하는 재사용 가능한 방법이다.
왜 패턴에 이름을 붙이는가
서로 다른 프로젝트에서 반복적으로 같은 종류의 설계 문제(객체 생성 방식의 유연성, 서로 다른 객체 간 협력 구조)를 마주친다면, 그 해법에 공통된 이름을 붙여두는 것이 유용하다. “여기에 전략 패턴을 쓰자"는 한마디로 팀원 모두가 같은 구조(인터페이스로 알고리즘을 캡슐화하고 런타임에 교체 가능하게)를 떠올릴 수 있다면, 매번 설계를 처음부터 설명할 필요가 없다. 디자인 패턴은 GoF(Gang of Four, 『Design Patterns』의 네 저자)가 1994년 정리한 23개 패턴을 계기로 널리 쓰이는 용어가 됐다.
세 갈래: 생성·구조·행동
GoF 패턴은 목적에 따라 세 갈래로 나뉜다. **생성 패턴(Creational)**은 객체를 만드는 방식 자체를 유연하게 만든다(팩토리 메서드, 싱글턴, 빌더). **구조 패턴(Structural)**은 클래스·객체를 조합해 더 큰 구조를 만드는 방법을 다룬다(어댑터, 데코레이터, 퍼사드). **행동 패턴(Behavioral)**은 객체 사이의 책임 분배와 상호작용 방식을 다룬다(전략, 옵저버, 커맨드).
전략 패턴: SOLID가 코드로 구현되는 모습
결합도와 응집도에서 다룬 OrderProcessor와 notifier 인터페이스 예시가 사실 **전략 패턴(Strategy Pattern)**의 한 예다. 전략 패턴은 알고리즘(또는 동작 방식)을 인터페이스 뒤로 캡슐화해, 사용하는 쪽 코드를 건드리지 않고도 알고리즘을 교체할 수 있게 만든다.
| |
이 코드에서 ShoppingCart는 SOLID 원칙 개요의 의존성 역전 원칙(구체 클래스가 아닌 DiscountStrategy 인터페이스에 의존)과 개방-폐쇄 원칙(새 할인 정책은 새 클래스 추가로만 확장, 기존 코드 수정 없음)을 동시에 만족한다. 전략 패턴은 이 두 원칙을 실현하는 구체적인 코드 구조인 셈이다.
비교: 세 갈래 패턴이 답하는 질문
| 갈래 | 답하는 질문 | 대표 패턴 |
|---|---|---|
| 생성 | 객체를 어떻게 유연하게 만들 것인가 | 팩토리 메서드, 빌더, 싱글턴 |
| 구조 | 서로 다른 인터페이스의 객체를 어떻게 조합할 것인가 | 어댑터, 데코레이터, 퍼사드 |
| 행동 | 객체 사이의 책임과 협력을 어떻게 분배할 것인가 | 전략, 옵저버, 커맨드 |
흔한 오개념
“패턴을 많이 쓸수록 좋은 설계다” — SOLID 원칙 개요에서 다룬 과잉 설계 문제가 패턴에도 그대로 적용된다. 정책이 하나뿐이고 바뀔 가능성이 낮은 곳에 전략 패턴을 미리 적용하면, if-else 한 줄이면 충분했을 코드가 인터페이스·구현 클래스 여러 개로 불어난다. 패턴은 “변경이 실제로 예상되는 지점"에 쓰는 도구이지, 코드를 있어 보이게 만드는 장식이 아니다.
“디자인 패턴은 객체지향 언어에서만 쓸 수 있다” — GoF 패턴은 클래스·인터페이스로 설명되지만, 그 아이디어(동작을 값으로 다루기, 생성을 캡슐화하기)는 함수형 언어에서도 일급 함수·클로저 같은 다른 형태로 나타난다. 예를 들어 위 전략 패턴은 파이썬에서 클래스 대신 함수를 인자로 넘기는 것만으로도 구현할 수 있다.
다른 개념과의 연결
전략 패턴은 결합도와 응집도의 낮은 결합도, SOLID 원칙 개요의 OCP·DIP가 실제 코드로 어떻게 구현되는지 보여주는 사례다. 다음 챕터에서는 이미 존재하는, 패턴이 적용되지 않은 코드를 어떻게 안전하게 개선해 나가는지(리팩토링)를 다룬다.
평가 기준
이 챕터를 읽은 후에는 다음을 할 수 있어야 한다. 디자인 패턴이 GoF의 세 갈래(생성·구조·행동) 중 어디에 속하는지 목적에 따라 분류할 수 있다. 전략 패턴이 SOLID의 OCP·DIP를 코드로 어떻게 구현하는지 설명할 수 있다. 패턴을 적용해야 할 때와 과잉 설계가 되는 경계를 판단할 수 있다.
참고 자료
Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley.
- Refactoring Guru: Design Patterns — GoF 23개 패턴을 그림과 다국어 코드 예제로 정리한 대표적인 참고 자료
- Source Making: Design Patterns — 패턴별 적용 상황과 안티패턴 비교
![Featured image of post [Computer Terms] 디자인 패턴 개요 (Design Patterns)](/post/computerterms/design-patterns-overview/wordcloud_hu_de32b703b851d294.webp)
![[Computer Terms] CAP 정리와 합의 알고리즘 (CAP Theorem, Consensus)](/post/computerterms/cap-theorem-and-consensus/wordcloud_hu_790afda0e1c08607.webp)
![[Computer Terms] 웹 취약점: SQL 인젝션, XSS, CSRF](/post/computerterms/web-vulnerabilities/wordcloud_hu_81b103705ed468c8.webp)
![[Computer Terms] 디자인 패턴 개요 (Design Patterns)](/post/computerterms/design-patterns-overview/wordcloud_hu_24f0125600c9cc49.webp)
![[Computer Terms] 리팩토링과 코드 스멜 (Refactoring, Code Smell)](/post/computerterms/refactoring-and-code-smells/wordcloud_hu_893b2b850bf2415e.webp)
![[Computer Terms] CPU 구조와 파이프라이닝 (CPU Architecture, Pipelining)](/post/computerterms/cpu-and-pipelining/wordcloud_hu_cffbb8a41463fbff.webp)
![[Computer Terms] SOLID 원칙 개요](/post/computerterms/solid-principles-overview/wordcloud_hu_485180c9cc39a48b.webp)
![[Computer Terms] 결합도와 응집도 (Coupling, Cohesion)](/post/computerterms/coupling-and-cohesion/wordcloud_hu_4fa8b9f443122636.webp)
![[Computer Terms] 피처 플래그 (Feature Flags)](/post/computerterms/feature-flags/wordcloud_hu_28502f74722a16f5.webp)
![[Computer Terms] 타입 시스템: 정적/동적, 강/약 타입](/post/computerterms/type-systems/wordcloud_hu_11e612e21280e94c.webp)