나는 디자인 패턴을 온전히 이해하고 싶다

date
Oct 29, 2022
thumbnail
slug
about-design-pattern
author
status
Published
tags
Thought
summary
주니어 개발자의 디자인 패턴에 관한 생각
type
Post
updatedAt
Feb 1, 2023 09:16 AM

서론

이 글은 디자인 패턴같은 거 다 필요 없고, 코딩하다 보면 다 자연스럽게 알게 된다!같은 위험한 의견을 말하려는 게 아니다. 나 역시 최근 Nest.js의 useFactory를 사용하면서 factory method같이 특정 패턴을 알면 프레임워크의 이해에 도움이 되는 경우도 당연히 있었고, 애초에 나 같이 경험이 적은 개발자가 위와 같은 의견을 내는 것도 굉장히 오만한 생각이다. 다만 내가 정리하려는 생각은 디자인 패턴을 무작정 암기하자는 것의 유용성에 대한 것이다.
가끔 디자인 패턴을 무작정 읽어보면 어려운 철학책같이 느껴질 때도 있고 이게 왜 필요한가 하는 생각이 들 때가 있다. 이는 내 지식과 경험이 부족하기 때문인 것을 잘 알고 있다. 아마 지금까지 내가 해온 프로그래밍이 그 설계가 너무나 간단해서, 설계에 대한 깊은 고민이 결핍되서, 디자인 패턴을 적용할 만큼의 복잡성이 필요 없던 수준이어서 그런 게 아닌가 싶다. 이런 상황에서 과연 디자인 패턴을 달달 외운다고 당장 내게 큰 도움이 될까?

내가 생각하는 디자인 패턴과 설계

한 가지 분명한 것은, 디자인 패턴은 어떤 신이 설계에 대한 문제를 해결하기 위해 갑자기 만든 정답 같은 것이 아니라는 거다. 이도 결국 누군가의 반복된 시행착오로 만들어진 결과물이다.
설계자들이 동일한 문제를 반복적으로 경험한 후, 나는 이 문제를 이렇게 해결하니 좋았다에 대한 사례를 정리한 것일 뿐이란 거다.
 
개인적으로 디자인 패턴이 마치 철학책처럼, 단순한 활자로만 느껴지고 있다면 현재 중요한 것은 디자인 패턴이 아니라고 생각한다.
스스로 온전히 이해할 수 없는, 필요성을 느끼지도 못하고 있는 개념을 단순히 읽기만 한다고 해서 실제 프로그래밍에 적용할 수 있을 리 만무하다.
결국 내가 디자인 패턴을 온전히 느끼기 위해 필요한 것은 디자인 패턴에 관한 글을 읽는 것이 아니다. 정말로 필요한 것은 제대로 동작하고 추후에 유지 보수를 해나가는 진지한 프로젝트, 그리고 이를 설계하기 위한 깊은 고민이다.
디자인 패턴을 몰라서 어떻게 설계해야 하는지 모르겠어요... 라고 말하며 디자인 패턴을 공부하는 것은 모순이라 생각된다. 머리를 아프게 하는 구조적인 문제를 직접 겪은 후에야 각종 디자인 패턴의 존재 의의를 받아들일 수 있기 때문이다. (애초에 구조라는 것에 특정 상황에 맞는 Best Practice정도가 있을 뿐 정답이 없기도 하다)

나는…

나는 이전에 학교 수업으로 객체 지향이 뭔지, 캡슐화, 추상화, 다형성, SOLID 원칙이 무엇인지 분명히 배웠다. 하지만 느낄 수 없었다.
그렇게 시간이 흐르고, 전 회사에서 일할 때 자주 변경되는 요구 사항으로 인해 엄청난 코드 수정의 늪에 빠져 괴로워한 적이 경험이 있다. 그제야 비로소 내 코드에서 좋지 못한 냄새를 맡을 수 있었고, 다시 객체지향을 공부해보니 객체지향이 추구하는 가치를 조금이나마 느낄 수 있었다.
 
전 회사에서 1년간 유지 보수 및 여러 SI성 프로젝트들을 해왔지만, 당시엔 프로젝트에 대한 진지한 고민이 빠져있었고, 내 성장은 미미했다.
오히려 지금 하고 있는 네이버 부스트캠프 활동을 하면서 이룬 성장이 훨씬 크다. 나 혼자가 아니라, 함께 하는 캠퍼들, 리뷰어님들, 마스터님들이 있기에 성장한 부분도 분명히 크지만, 스스로 설계에 대해 깊게 고민하고, 나름의 코드를 짜고, 차후에 설계나 코드에서 좋지 못한 냄새를 맡으면 고치는 과정에서 배운 게 굉장히 많고, 여러 사람들과 대화를 하면서 스스로 한 설계의 타당성을 말할 수 있게 되었다.

나는 어떤 프로그래머가 되고 싶은가…

프로그래머는 결국 문제를 해결하기 위해 코드를 짜는 사람이다.
기술에 대한 지식은 금방 쌓을 수 있지만, 설계는 경험을 통해서 천천히 쌓을 수 있다. 특히 설계는 주관적인 영역이 크다고 생각하고, 이러한 설계 경험을 쌓아가면서 자신만의 (설계)가치관을 만들어 나갈 수 있고 자신의 설계를 동료에게 납득시킬 수 있을 것이다.
설계가 잘 되어있는 프로젝트의 코드를 누군가에게 주고, 이 부분 좀 수정해달라고 하면 누가 못하겠는가… 이건 진짜 프로그래밍이 아니라고 생각한다.
내가 언제 쯤 디자인 패턴의 설계자들이 말하고 있는 개념들을 온전히 받아들일 수 있을 지 모르겠다. 하지만 비슷한 부류의 문제 상황들을 많이 접하며 이 문제를 다른 방식으로 풀면 어떤 문제가 있는 지에 대한 감이 많이 쌓인다면 언젠가 자연스럽게 느끼고 받아들일 수 있지 않을까 싶다.