디자인 패턴이란 무엇인가

Table of contents

  1. 개요

개요

디자인 패턴( Design Pattern )이란 무엇일까? 사전적 의미는 디자인 패턴은 자주 사용하는 설계 형태를 정형화해서 이를 유형별로 설계 템플릿을 만들어둔 것을 말한다. 좀더 이론적인 개념에 대해서 자세하게 알고 싶다면 검색하면 많이 나올테니 직접 찾아 보시길 권장한다. 여기에서는 개인적인 나의 생각을 풀어보고자 한다.

난 무언가를 말하고자 할 때 비유하는것을 좋아 한다. 비유라는것이 상황에 따라 의도하지 않은 방향으로 해석될 때가 있어 조심스러울 때도 많지만 비유라는것은 대략적인 느낌을 전달하기 위함이지 완벽하게 해당 현상을 이해시킬려는 목적이 아니기 때문에 그 부분을 감안하여 들어주시길 바란다.

우리가 RPG 같은 게임을 즐길 때, 내 마음대로 캐릭터를 키울수 있겠지만 ‘잘’ 하고 싶을 경우 레벨별 사냥터, 스킬 찍는 순서, 스텟 배분, 아이템 빌드등 여러가지 정보를 찾아보게 된다. 이러한 정보들은 앞서 게임을 했던 유저들이 수 많은 시행착오를 겪어오며 경험과 노하우를 공유하며 정형화된 육성 방법이 자리 잡게 된다. 이것은 비단 게임 뿐만 아니라 어느 분야든 비슷한 현상을 볼 수 있는데 이는 ‘잘’ 하고 싶어 하는 인간의 본능인 것이다. 극 소수의 천재들의 경우 이러한 집단 지성의 틀을 깨고 자신만의 세계를 구축하는 경우도 있다. 하지만 이는 특별한 케이스의 경우이니 여기서 언급할 만한 주제는 아니라 넘어가자. 일반적으론 개인이 생각해낸 대부분의 방법은 집단 지성의 힘을 이기지 못한다. 이것은 정말 많은 생각을 하게 되는 대목이다. 대부분 내가 한번쯤 고민하고 문제라고 생각 했던 부분은 남들도 똑같이 고민 했을 것이고 이러한 고민의 결과로써 집단 지성의 힘으로 어느정도 해결방법이 나와 있는 경우가 대부분 이다.

건축도 마찬가지다. (본인은 건축관련 전문가가 아니라서 설명이 틀릴수 있다. 단순히 예시를 위하여 사용하는 것이므로 느낌만 파악해주길 바란다.) 건물을 지을때 사람이 살 수 있는 주택부터 초고층빌라 까지 짓기 위해서는 디테일한 건축설계와 공법이 필요할 것이다. 건축설계와 공법은 시간이 지남에 따라 관련 전문가들이 수많은 기술 공유과 시행착오로 계속해서 다듬어지며 발전하게 된다. 만약 이런 집단지성이 이루어낸 건축설계와 공법을 학습하지 않고 내가 처음부터 건물을 짓게 된다면 엄청나게 많은 시간과 시행착오를 겪어야 할 것이다. 코딩하는것도 동일하다. 이미 많은 사람이 코딩을 하면서 수많은 시행착오와 문제점을 겪어오면서 다양한 설계, 규칙들이 생겨났다. 코드를 작성할 때 명확한 기준 없이 작성하다 보면 수십명, 수백명이 함께 참여하여 만드는 거대 프로그램들은 정상적으로 동작할 수 없을 것이다. 그러므로 좋은 건축을 하기 위해서는 상황에 알 맞은 다양한 설계기법과 공법을 알아야 하는것처럼 코딩도 다양한 상황에 맞는 디자인 패턴을 숙지하고 있어야 ‘좋은코드’를 작성할 수 있다.

그러면 ‘좋은코드’란 무엇이며, ‘나쁜코드’는 무엇일까? 이것을 정의하기는 매우 어려울 뿐더러 함부로 정의할수도 없을 것이다. 왜냐하면 절대적인 기준 이라는것은 시대에 따라서 바뀌는 경우가 많기 때문이다. 살인이나 물건을 훔치는것과 같이 국가와 시대를 막론하고 하면 안되는 절대적인 기준의 법이 존재하기도 했지만, 일부 다처제와 같이 시대에 따라 불법이 되기도 하고 합법이 되기도 하는 법도 있다. 법은 정의라고 배웠는데 시대,국가,인종,종교에 따라 바뀌는 법이 과연 절대적 정의라고 볼수 있을까? 즉 좋은코드 나쁜코드를 함부로 정의하기에는 매우 어렵다는 것이다.

대신 ‘협업’ 이라는 관점에서 본다면 어느정도 코드의 기준이 생길수 있다. 그래서 함부로 ‘좋은코드’ 라고 표현하는것이 조심스럽긴 하지만 ‘좋은코드’에 가까운 코드는 있을 것이다. 협업의 관점에서 좋은코드에 가까운 패턴들이 디자인 패턴이라고 할수 있다. 그렇기에 내가 생각하는 디자인 패턴의 정의란, 불특정 다수가 좋은 프로그램을 만들기 위해 합의한 정형화된 코드 패턴이다.

‘좋은코드’ 를 작성하고자 하는 열망이 강하다면 디자인 패턴에 대한 학습은 필수라고 생각한다. 좋은 코드를 많이 볼 수 있는 곳은 유명한 오픈소스 코드들인데, 특히 스프링 프레임워크는 디자인 패턴의 집합체라고 해도 과언이 아니다.

오픈소스 코드를 보는데 도저히 이해가 안되는 경우를 많이 느껴 보셨을 것이다. 아직 언어에 대한 실력이 부족하여 이해가 안되는 경우도 있겠지만 디자인 패턴 자체를 모르기 때문에 코드의 해석이 이해가 안되는 경우도 많다. 오픈소스 코드를 보다 보면 쉽게 코드를 작성할 수 있음에도 굳이 귀찮게 한번, 두번, 세번 감싸서 클래스를 만드는 경우를 흔히 볼 수 있는데, 이는 디자인 패턴에 대한 학습이 없다면 왜 그렇게 설계 했는지 감이 전혀 오지 않기 때문이다.

‘좋은코드’를 작성하고 싶은 개발자라면 퀄리티가 높은 오픈소스 코드를 많이 보아야 하고, 그 오픈소스 코드를 해석할 줄 알여면 디자인 패턴에 대한 학습이 반드시 필요하다.


The work and the work are derivative works because they are included in the work. However, derivative works include material and lyrics in the original work. CC BY-SA 4.0