디자인 패턴
소프트웨어를 설계하는 과정에서 자주 발생하는 문제를 해결하기 위한 설계 방식
Last updated
소프트웨어를 설계하는 과정에서 자주 발생하는 문제를 해결하기 위한 설계 방식
Last updated
디자인 패턴이라는 용어는 원래 건축학에서 시작되었습니다.
건축가 크리스토퍼 알렉산더(Christopher Alexander) 는 건축 및 도시 설계에서 반복적으로 나타나는 문제를 해결하기 위해 패턴 랭귀지(Pattern Language)라는 개념을 제안했습니다. 그는 “A Pattern Language: Towns, Buildings, Construction” (1977) 책에서 253개의 디자인 패턴을 정리했으며, 이 패턴들은 도시, 건축, 실내 공간 등에 적용될 수 있는 재사용 가능한 설계 솔루션으로 정의되고 있습니다.
크리스토퍼 알렉산더의 건축 디자인 패턴은 공간을 더욱 인간 중심적으로 설계할 수 있는 지표가 되었습니다.
이후 점차 컴퓨터 공학에서도 널리 사용되기 시작하며 GoF(Gang of Four: 4명의 소프트웨어 공학자들)이 <Design Patterns: Elements of Reusable Object-Oriented Software> (한글 번역: “디자인 패턴: 재사용 가능한 객체 지향 소프트웨어의 요소”) 이라는 책을 통해 23가지 디자인 패턴을 정리했습니다.
패턴은 단순한 반복이 아니라, 맥락(Context)에 맞는 최적의 해결책을 제공해야 합니다.
좋은 디자인 패턴은 재사용 가능하고, 가독성이 뛰어나며, 유지보수가 용이해야 합니다.
작은 요소들이 모여서 더 크고 유기적인 시스템을 형성해야 합니다.
코드 재사용성 증가 → 반복적인 구조를 피하고 효율적인 설계를 유도하기
유지보수 용이 → 변경이 발생하더라도 최소한의 수정으로 해결하기
소프트웨어 확장성 증가 → 새로운 기능 추가 쉽게 하기
설계의 표준화 → 팀원 간의 협업 시 일관된 코드 스타일 유지하기
객체 간의 관계를 쉽게 정의하고 유지보수하기 위한 패턴
클래스 간의 결합도를 줄이고, 효율적인 상속 및 조합을 유도
Adapter (어댑터)
인터페이스가 다른 객체들을 연결해주는 패턴
Bridge (브릿지)
구현부를 추상화하여 독립적으로 확장할 수 있도록 하는 패턴
Composite (컴포지트)
객체를 트리 구조로 만들어 단일 객체와 그룹을 동일하게 다룸
Decorator (데코레이터)
객체에 동적으로 기능을 추가하는 패턴
Facade (파사드)
복잡한 서브시스템을 단순한 인터페이스로 제공하는 패턴
Proxy (프록시)
접근을 제어하기 위해 대리 객체를 사용하는 패턴
객체 간의 커뮤니케이션을 효과적으로 처리하는 패턴
코드의 응집도를 높이고, 결합도를 낮추는 데 도움
Chain of Responsibility (책임 연쇄)
요청을 여러 개의 처리 객체가 연속적으로 처리하는 패턴
Command (커맨드)
요청을 캡슐화하여 실행 취소 기능을 제공하는 패턴
Interpreter (인터프리터)
특정 언어의 문법을 분석하고 실행하는 패턴
Iterator (이터레이터)
컬렉션 요소들을 순차적으로 탐색하는 패턴
Mediator (미디에이터)
객체 간의 직접적인 통신을 방지하고 중재자를 통해 조정하는 패턴
Memento (메멘토)
객체 상태를 저장하고 복원할 수 있는 패턴
객체 상태 변화 시, 관련 객체들에 자동으로 알림을 보내는 패턴
State (스테이트)
객체의 상태에 따라 다른 행동을 수행하는 패턴
알고리즘을 캡슐화하여 동적으로 변경할 수 있도록 하는 패턴
Template Method (템플릿 메서드)
알고리즘의 구조를 정의하고, 세부 사항은 서브클래스에서 구현하는 패턴
Visitor (비지터)
객체 구조와 별개로 연산을 추가할 수 있도록 하는 패턴
지금부터 하나씩 흔히 쓰이는 디자인 패턴들을 살펴보겠습니다.