참고: 리팩토링 구루
✳️ 디자인 패턴이란,
소프트웨어를 만들다 보면 비슷한 문제들이 반복해서 등장한다.
디자인 패턴은 이런 문제를 해결하는 공통된 방식이라고 생각하면 된다.
표준화된 라이브러리나 함수들을 코드에 복사해서 사용하는 것과는 다르다.
디자인 패턴은 문제를 해결하는 방식을 알려주는 개념이다.
패턴의 세부 개념들을 적용해서 프로그램에 맞는 해결책을 구현할 수 있다.
✅ 알고리즘과 디자인 패턴, 뭐가 다를까?
둘 다 알려진 문제를 해결하는 방법이지만, 개념 자체는 완전히 다르다.
- 알고리즘은 어떤 목표를 달성하기 위한 일련의 절차를 정의한다.
- 반면에 디자인 패턴은 문제를 해결하기 위한 상위 개념과 구조를 제시한다.
- 쉽게 말해서, 알고리즘은 레시피, 디자인 패턴은 청사진 같은 느낌이다.
✅ 디자인 패턴의 기원
디자인 패턴은 사실 컴퓨터 공학에서 시작된 개념이 아니다.
처음에는 건축학에서 등장했다. 건축가 크리스토퍼 알렉산더가 제안한 개념인데,
건축 설계에서 반복적으로 나타나는 문제를 해결하는 패턴을 정리한 것이 출발점이다.
나중에 소프트웨어 개발에서도 이런 반복적인 문제를 해결하는 방식이 필요하다는 인식이 생기면서,
GoF(Gang of Four)라는 네 명의 개발자가 소프트웨어 설계 패턴을 정리해서 책으로 펴냈다.
그 책이 바로 유명한 Design Patterns: Elements of Reusable Object-Oriented Software 이다.
디자인 패턴의 개념을 정리해서 책으로 펴내면서 널리 알려지게 됐다.
✅ 디자인 패턴을 꼭 알아야 할까?
사실 패턴을 몰라도 개발하는 데 큰 문제는 없다.
어쩌면 이미 개념을 모른 채로도 일부 패턴을 자연스럽게 구현하고 있을지도 모른다.
하지만 왜 굳이 공부해야 할까?
이유는 두 가지다.
- 객체지향 프로그래밍을 이해하는 데 도움이 된다.
디자인 패턴은 객체지향 설계의 핵심 원칙들을 잘 담고 있다. - 의사소통에 유리하다.
팀에서 협업할 때, 특정 패턴 이름을 언급하면 복잡한 구조를 한마디로 설명할 수 있다.
그래서 디자인 패턴을 배우면 코드 작성뿐만 아니라 코드 리뷰나 설계 토론에서도 도움이 된다.
✅ 디자인 패턴 분류하기
1. 패턴의 범위와 복잡성에 따른 분류
먼저, 디자인 패턴 자체를 복잡성, 상세도, 시스템에 대한 적용 범위로 구분할 수 있다.
이때 나오는 개념이 이디엄(Idiom), 디자인 패턴(Design Pattern), 아키텍처 패턴(Architecture Pattern)이다.
- 이디엄(Idiom)
특정 프로그래밍 언어에 특화된 간단한 패턴
자바의 try-with-resource 같은 패턴
도로 건설 비유: 교차로의 신호등 설치처럼 소규모 문제를 해결하는 방식 - 디자인 패턴(Design Pattern)
객체 지향 프로프래밍에서 자주 발생하는 문제를 해결하기 위한 재사용 가능한 설계 템플릿
GoF(Gang of Four)가 정리한 생성, 구조, 행동 패턴이 여기에 속한다.
도로 건설 비유: 교차로 설계 자체, 예를 들어 회전 교차료 같은 구조적 설계 - 아키텍처 패턴(Architecture Pattern)
애플리케이션 전체 구조를 설계하는 상위 개념
MVC, 마이크로 서비스 같은 전체 시스템을 구성하는 방식
도로 건설 비유: 도시 전체의 다층 인터체인지 같은 복잡하고 큰 구조
2. 디자인 패턴의 목적에 따른 분류 (GoF 기준)
디자인 패턴 자체도 그 의도나 목적에 따라 세 가지로 나뉜다
- 생성 패턴 (Creational Patterns)
객체를 효율적으로 생성하는 방법
객체를 생성하는 방식을 개선해서 코드 재활용성과 유연성을 높이는 데 초점을 맞춘다.
ex) 요리 재료를 직접 사서 준비하지 않고, 밀키트를 이용해서 요리하는 것과 비슷하다 - 구조 패턴 (Structural Patterns)
객체를 유연하게 조합하여 구조를 만드는 방법
객체와 클래스를 더 큰 구조로 조합하는 방법을 다룬다.
ex) 레고 블록을 조립하는 것처럼, 각각의 객체를 유기적으로 연결해서 크고 복잡한 구조를 만든다 - 행동 패턴 (Behavior Patterns)
객체 간 의사소통과 책임 분담을 효율적으로 처리하는 방법
ex) 오케스트라처럼, 여러 연주자가 각자 역할을 맡고 서로 조화를 이루어 하나의 곡을 완성하는 느낌이다.
각 객체가 언제, 어떻게 행동해야 할지 명확하게 정해둔다