디자인패턴이란


디자인패턴이란?


디자인 패턴이란

디자인 패턴은 소프트웨어를 디자인 할 때 자주 발생하는 문제들에 대한 전형적인 해결책이다. 즉 소프트웨어를 개발하며 반복적으로 등장하는 디자인 문제들을 해결할 수 있는 노하우를 패턴으로 정리한 것이다.

수학 문제나 과학 문제를 풀더라도 한 유형의 문제를 여러 번 풀면 문제 푸는 시간을 단축 시킬 자신만의 꼼수나 노하우가 생기게 된다. 소프트웨어를 개발할 때 발생하는 문제들도 마찬가지로 이런 패턴을 가질 수 있는데, 이를 디자인 패턴이라고 생각하면 이해하기 쉽다.

‘패턴’이라고 해서 알고리즘과 같은 것은 아니다. 두 개념 모두 잘 알려진 문제에 대한 일반적인 해결책을 제공하는데, 알고리즘은 해결을 위한 명확한 단계가 제시되어 있는 반면 패턴은 그보다 더 상위 수준의 설명이다. 예를 들어 이진 탐색 알고리즘을 생각하면 처음에 왼쪽, 오른쪽 포인터를 생성하고 중간값을 목표값과 비교해서 포인터 중 하나를 옮긴다..와 같은 굉장히 명확한 해결 방법을 제시한다. 하지만 패턴은 이런 단계가 명확하게 정해진 것도 없고, 같은 패턴을 다른 프로그램에 적용하면 당연한 말이지만 두 프로그램의 코드는 다를 것이다. 설명이 장황했는데, 패턴은 청사진으로서 결과와 기능은 제시하지만 어떻게 구현할 지는 사용자가 정한다는 점이 핵심이다.

등장 이유

그렇다면 디자인 패턴은 왜 생긴 걸까?

디자인 패턴이 등장한 이유를 알기 위해 소프트웨어 프로그래밍 패러다임의 변화를 함께 보면 더 이해하기 쉽다. 프로그래밍 패러다임은 프로그래밍을 하는 방법으로, 언어와는 독립적이다. 그래서 개발할 때 어떤 구조를 사용할지와 같은 문제를 결정한다.

  • 구조적 프로그래밍 : 최초로 적용되어 무분별한 goto문을 사용한다.
  • 객체 지향 프로그래밍 : 한 개념과 연관된 데이터, 연산을 캡슐화한 객체로 관리한다.
  • 함수형 프로그래밍 : 가장 먼저 만들어졌지만, 최근에 도입되기 시작했다. 프로그램의 ‘상태’를 변경하지 않는 순수함수를 사용한다.

이 중 아마도 우리에게 가장 익숙한 객체지향 프로그래밍은 1966년 등장해서 현재까지 굉장히 오랜시간 사용됐다. 이 오랜 시간 개발하며 반복적으로 등장하는 문제가 있었을 것이고, 이런 문제들을 해결할 수 있는 노하우가 생겼을 것이다. 이런 노하우가 자연스럽게 디자인 패턴으로 정착한 것이다.

중요성

디자인 패턴이 뭔지도 알겠고, 자연스럽게 등장했다는 것도 알겠다. 근데 이 디자인 패턴을 왜 꼭 알아야 하는지 의구심이 들 수도 있다고 생각한다. 디자인 패턴을 모르고 개발하는 사람도 많고, 이미 사용하고 있으면서 모르는 개발자들도 많지만, 개발자라면 디자인 패턴을 한 번쯤 공부하고 넘어가야 하는 이유가 있다.

  • 디자인 패턴은 오랜 시간 사용된 검증된 방법이고, 이미 검증된 방법을 사용하고 코드의 개선점들을 찾아 개선할 수 있기 때문에 이런 과정에서 드는 시간을 줄일 수 있다.
  • 디자인 패턴은 협업자들과 효율적으로 의사소통할 수 있게 한다. 가령 싱글턴 패턴을 모든 팀원들이 알고 있다면 싱글턴 패턴을 설명할 필요없이 그냥 ‘싱글턴’이라는 단어를 사용해서 설명할 수 있을 것이다.

하지만 물론 이런 패턴을 무분별하게 사용하는 것 또한 경계해야 한다. 굳이 사용하지 않아도 될 부분에 디자인 패턴을 사용하거나, 잘못 사용하면 사용하지 않는 것만 못하기 때문에 주의해야 한다.

분류

디자인 패턴은 패턴의 의도, 목적에 따라 분류할 수 있다.

  • 생성 패턴 : 객체 생성에 관련된 패턴이다. 객체를 생성하고 조합하는 방법을 캡슐화해서 기존 코드를 재사용하고 유연성을 증가시키는 객체 생성 매커니즘을 제공한다.
  • 구조 패턴 : 유연하고 효율적인 구조를 유지하면서 클래스나 객체를 조합해서 더 큰 구조를 만들 수 있게 한다.
  • 행동 패턴 : 객체 간의 효과적인 알고리즘이나 책임 할당을 처리한다.

  • 참고
  • https://refactoring.guru/design-patterns/what-is-pattern
  • 클린 아키텍처 - 로버트 C.마틴
  • https://eeyatho.tistory.com/77
  • https://gmlwjd9405.github.io/2018/07/06/design-pattern.html