디자인 패턴이란 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용해서 쓸 수 있는 것을 정리하여 특정한 "규약"을 통해 쉽게 쓸 수 있는 형태로 만든 것을 말합니다.
저명한 소프트웨어 엔지니어 마틴 파울러는 디자인 패턴을 '절반만 완성된' 것이라고 표현합니다. 디자인 패턴은 코드로 구현된 구현체가 아니라 문제 해결을 위한 패턴이기 때문에 자신의 개발환경에 맞게 구현하는 것은 개발자의 몫이기 때문입니다.
어떠한 앱을 만든다고 한다면 그 앱을 유지보수를 하고 또 다른이들과 공유를 하면서 만들어야 할 떄 좀 더 쉽고 깔끔하게 만들 수 있는 방법을 우리는 고안해야 됩니다. 만약 이러한 방법들을 명확히 하지 않는다면 우리는 매번 클래스 함수들을 일일히 다 만들어야 하게 될 겁니다.
라이브러리나 프레임워크가 그에 따른 예입니다.
예를 들어 그냥 jQuery를 이용한다면 $('#lucid')로 DOM을 선택할 수 있는 것을 그냥 순수Javascript를 사용한다면 document.getElementsByid('lucid')로 길게 써가며 찾아야 하겠죠. 예를 들어 어떠한 data를 만들고 이 data를 수정할 로직을 짠다. 그리고 그 data를 보여주는 부분을 만들 때 이거 하나하나가 로직이 분리가 안되있고 한꺼번에 정의가 되어있다면? 나중에 유지보수하기가 힘들겁니다. 그걸 "돕기" 위해 디자인패턴이라는게 나오는 것이며 이렇듯 "좀 더 쉽고 편리하게" 사용할 수 있게 만든 특정한 방법들을 디자인 패턴이라고 합니다.
간단한 TODO 앱을 만들 때 디자인 패턴이 필요하다고 말하지 않습니다. 대부분의 디자인 패턴은 복잡하고 거대한 프로그램을 위해서 만들어졌습니다.
디자인 패턴은 최고의 개발자들이 만들어낸 솔루션입니다. 또한, 오랫동안 사용되어 오면서 안정성 검증이 완료된 솔루션입니다. 심지어 디자인 패턴은 문서화도 잘 되어있습니다. 거인의 어깨에 올라타서 안정적인 프로그램을 만들 수 있습니다.
한 달 전의 나는 항상 왜 이렇게 코드를 짰는지 이해가 되지 않습니다(?). 디자인 패턴을 사용하지 않았다면 기존 코드를 이해하는 것뿐만 아니라 수정하는 데에도 큰 비용이 들겠지만, 디자인 패턴을 사용함으로써 패턴대로 코드가 전개되고 수정에 열려있는 구조이기 때문에 유지보수에 들어가는 비용이 줄어듭니다.
디자인 패턴은 언어에 제약을 받지 않고 사용할 수 있습니다. 대부분의 디자인 패턴이 객체 지향적으로 문제를 해결하려고 하므로 객체 지향 언어를 사용하고 있다면 (객체 지향 언어만 객체 지향을 구현할 수 있다는 뜻은 아닙니다.) 대부분의 디자인 패턴을 쉽게 구현할 수 있습니다.