디자인 패턴은 개발 과정에서 자주 마주치는 전형적인 고민거리들에 대한 올바른 설계 방법을 제시해주는 솔루션이다.
개발을 하면서 우리는 필연적으로 이전에 해결했던 문제를 다시 마주치게 된다.
그 과정에서 새로운 해결방법으로 풀어내기도 하고, 이전에 겪었던 유사한 문제의 해결 방법을 그대로 가져와서 코드로 옮겨내곤 한다.
디자인 패턴은 결국 이런 해결방법을 a-z까지 전부 알려주는 것이 아니라, 우리 각자의 프로젝트에서도 적절히 적용할 수 있도록 큰 틀로 적절한 가이드라인을 주는 것이다. 선배 개발자들이 "내가 여러가지로 해봤는데, 이런 문제에서는 이렇게 설계하는게 가장 좋더라" 라고 알려주는 것처럼 말이다.
일반적으로 디자인 패턴이 아키텍처 패턴도 같이 묶어서 포괄적으로 이야기한다.
하지만 엄밀히 말하면 이런 솔루션은 크게 디자인 패턴과 아키텍처 패턴으로 나뉜다.
디자인 패턴은 특정 유형의 문제를 해결하는 설계 방법이고,
아키텍처 패턴은 Client-Server, MVC처럼 전반적인 시스템 설계, 분리를 효과적으로 구성하는 설계 방법이다.
GoF 패턴은 1995년에 만들어진 디자인 패턴의 모음집으로 현재 가장 많이 사용되는 특정 디자인 패턴들을 의미한다. 대부분의 개발자들이 이 패턴을 따라서 설계하고 있으며, 많은 라이브러리와 프레임워크도 내부적으로 뜯어보면 이 패턴이 적용된 부분이 상당히 많다.
GoF 패턴은 크게 목적과 범위에 따라 구분되는데,
목적은 생성, 구조, 행위로 분리되고,
범위는 클래스, 객체로 나뉜다.

범위에 대한 구분은 해당 패턴을 클래스에 적용하냐, 객체에 적용하냐로 나뉘는 것인데,
목적에 대한 구분은 단어들만 봐서는 쉽게 구분이 되지 않는다.
각각의 목적에 따라서 디자인 패턴이 어떻게 구분되는 건지 먼저 알아보자.
생성 패턴은 객체를 효과적으로 생성, 관리하는 방법을 의미한다.
이러한 패턴들을 적용시켜 객체의 구조 변화에 유연성을 지닐 수 있으며, 불필요한 과정을 최소화시킬 수 있다.
생성 패턴과 달리, 구조 패턴과 행위 패턴은 그 경계가 다소 애매하다.
구조 패턴은 클래스나 객체의 구성과 계층 구조를 정의하고,
행위 패턴은 객체 간의 상호작용을 정의한다.
간단한 예시를 들어보면, 구조 패턴은 폴더가 파일을 소유하고 있는 관계, 행위 패턴은 사냥꾼이 총을 사용하는 관계가 각각 연관된 객체에 작용하고 있는 형태라고 생각하면 이해에 도움이 되지 않을까 생각한다.
모든 GoF 패턴들에 대해 상세하게 다루기에는 글이 너무 길어질 것 같아 먼저 디자인 패턴과 GoF 패턴에 대한 간략한 개념만 살펴보았다.
다음에는 주요 GoF 패턴들에 대해서 세부적으로 알아보자.