디자인 패턴을 공부하게 된 계기 |
처음 디자인패턴이라는 개념이 존재한다는것을 알게된것은 컴퓨터공학과 3학년 재학시절 소프트웨어공학이라는 강의를 수강하던 때였다.
교내 교수님의 강의가 아닌 외부강사님이 진행하시는 강의였는데 디자인패턴 강의를 진행한것은 아니었고 강의 중 지나가는 말로 다음의 한마디를 남기셨는데 그게 몇년이 지난 지금에도 기억에 남아있었다.
나중에 면접자리에서 디자인패턴과 리팩토링을 공부해봤다고 말하면 면접관분들이 좋아하실거에요.
다시 프로그래밍 공부를 하면서 꼭 디자인패턴을 공부해봐야겠다는 생각을 가지고 있었고 최근 한사이클 공부를 해본 후기를 남겨볼까 한다.
디자인 패턴이란? |
디자인 패턴은 소프트웨어 디자인 과정에서, 즉 프로그래밍 과정에서 개발자가 겪을 수 있는 문제점이나 해결과제에 대한 검증되고 유용한 해결법들이라고 할 수 있다.
재사용할 수 있는 코드뭉치같은것이 아니라 이런 상황에선 이런식으로 하면 좋다라는 방법론 내지는 가이드라인이라고 보면 된다.
디자인 패턴에도 종류가 아주 많은데 Gang of four라고 불리는 4명의 저자가 집필한 책이 가장 유명하며 흔히 GoF라고 불리는 이 책에서는 디자인패턴을 생성패턴, 구조패턴, 행동패턴으로 분류하고 그 분류안에 여러가지 패턴들에 대해 설명해뒀다.
그래서 주로 디자인패턴을 공부한다고 하면 GoF분류로 공부를 시작한다고 보면 된다.
물론 GoF분류뿐 아니라 객체지향관련 디자인패턴이나 more effective java같은 책에서 분류한 패턴 등 더 많은 내용들이 있는 듯 하다.
디자인 패턴 공부 진행내역 |
우선 난 GoF분류로 공부를 시작하기로 했었지만 GoF 책을 구매할 필요는 느끼지 못했다.
그냥 구글에 ~~~패턴 이라고 검색만 해도 수십개의 블로그 글이 쏟아져나왔었고 그걸로 충분하다고 생각해서 패턴 하나당 블로그 5개정도씩 읽고 일반화해서 내 블로그에 정리하는 식으로 공부를 진행했다.
2023년 04월 20일
디자인 패턴 공부의 첫 시작이었던 생성패턴 중에서도 첫번째 패턴인 팩토리 메서드 패턴을 공부한날이었다.
첫 시작은 굉장히 당혹스러웠다.
도대체 무슨 말을 하는것인지부터, 그래서 내가 뭘 익혀야 하는 것인지까지 모든게 애매모호했다.
왜 재사용하는 코드뭉치가 아닌 가이드라인이라고 하는지 바로 알 수 있을정도로 특정 상황에서 이런 식으로 해결하면 좋다라는 내용이었고
이 말인즉슨 그 특정 상황을 겪어본적이 없다면 이 패턴이 왜 필요한지 직접적으로 체감하기가 매우 힘들다는 뜻이기도 하다.
그래서 첫 패턴을 공부하는데만 하루를 다 보냈음에도 무슨 말인지 제대로 이해도 못하고 넘어가게 됐다.
2023년 05월 06일
첫 패턴 공부에서의 당혹스러움에 장장 16일간은 디자인패턴을 거들떠보지도 않고 다른 공부를 했었다.
하지만 결국 넘어야 할 산이기에 첫번째로 공부했던 팩토리 메소드 패턴을 정리해둔 글을 다시 한번 읽어보고 두번째 패턴인 추상 팩토리 패턴을 공부해봤다.
디자인 패턴 공부를 시작하기 전에 이 글을 읽고 있는 사람이 있다면 가급적이면 첫 패턴공부를 팩토리 메서드 패턴으로 시작했다면 바로 뒤에 추상 팩토리 패턴으로 이어가지는 않길 바란다.
내 입장에선 엎친데 덮친격으로 디자인 패턴에 대한 이해가 전혀 없는 상황에서 연속으로 팩토리 패턴 2개를 공부하다 보니 도대체 둘이 무슨 차이인지 구분하는데만 하루가 지나갔고 디자인 패턴이 다 이런식으로 비스무리한 이야기만 모호하게 계속 나오는 것인가라는 공포감만 자라는 날이었다.
2023년 05월 08일
5월 7일에는 앞서 공부한 두 패턴을 최대한 이해하기 위해 복습을 진행했고 5월 8일자부터 새로운 패턴인 빌더패턴을 공부하게 됐다.
이때 비로소 조금의 자신감이 생겼다.
왜냐하면 기존의 두 패턴과는 전혀 다른 용도이며 심지어 빌더패턴은 코드진행 생김새부터가 특이해서 다른 패턴과 명확히 구분해서 이해할 수 있었다.
또한 "특정 상황에서 사용할만한 가이드라인"이라는 디자인 패턴의 존재의의를 이해하기도 좋게 빌더패턴이 필요할만한 특정 상황을 이미 겪어본적이 있었기에 이런 방법이 있었구나 배워가는 날이었다.
2023년 05월 09일
지난 날에 이어 생성패턴의 프로토타입 패턴과 싱글턴 패턴을 공부한 날이었다.
지난 날 자신감을 얻은 덕에 2개의 패턴을 하루에 공부할 수 있었고 비로소 디자인패턴이 무엇인지, 또 내가 뭘 공부하고 익혀야 하는 것인지에 대한 감이 잡히기 시작했다.
또한 생성패턴으로 분류되는 5종을 모두 이해하고 공부를 마쳤다는 자신감도 생겼었다.
이때의 나는 생성패턴/구조패턴/행동패턴 중 하나의 패턴을 마쳤으니 3분의 1이나 진행했다고 착각하고 있는 애송이였다.
2023년 07월 09일
생성패턴을 마친 후 2달정도의 기간동안은 자료구조를 다시 한번 공부하면서 정리하고 modern C++의 라이브러리들을 사용해보고 익히는 시간을 가졌다.
그리고 7월 9일 처음으로 구조패턴의 시작인 어댑터패턴을 공부하게 되었다.
구조패턴이라는 새로운 분류를 공부한다는 걱정이 무색하게 다행히도 어댑터패턴은 아주 쉬운 개념이었다.
어댑터패턴을 금새 공부한 후 다음 패턴인 브릿지 패턴에 대한 내용을 검색하며 블로그 글 5개정도를 읽었는데 여기서 내 디자인 패턴 공부의 맥이 끊겨버렸다.
정말 아예 단 하나도 이해를 할 수가 없었다.
이 때 내린 결론은 내가 이 코드를 이해못하는것이 아니라 이 패턴이 필요한 상황을 겪어본적이 없어서 이 패턴을 왜 써야하는지부터를 받아들이지 못한다는 것이었고 지금 디자인 패턴을 공부하는것보다는 프로젝트 하나를 끝까지 완성하면서 다양한 패턴들이 필요할만한 경험을 먼저 쌓는게 맞다고 판단했다.
그래서 이때부터 https://github.com/batsalee/TaskManager 프로젝트를 진행하면서 시간이 흘러갔고 프로젝트를 어느정도 완성 후에는 알고리즘 공부 및 코딩테스트를 하느라 오랜 시간이 지나가게 되었다.
2024년 04월 28일
장장 9달가량의 많은 경험을 쌓은 뒤 다시 디자인패턴 공부에 뛰어들었다.
확실히 달랐다.
많은 경험이 쌓인 덕인지 디자인 패턴이 필요할만한 특정 상황들에 대한 설명이 바로바로 이해가 됐고
그 결과 28일 ~ 30일 3일만에 기존에 공부했던 내용들을 복습하는데 이어 구조패턴으로 분류되는 7개의 디자인패턴까지 모두 공부를 마쳤다.
사실상 28일은 복습과 브릿지패턴에 대한 이해로 넘어갔으니 29, 30일 이틀간 하루 2~3개의 패턴을 완벽히 이해하고 공부한 꼴이었고 이제야 디자인 패턴이 정말로 무엇인지, 내가 뭘 공부해야 하는것인지 명확히 깨닫게 되었다.
2024년 05월 12일
몇일이 지난 후 행동패턴으로 넘어가 공부를 시작하게 된 날이다.
이미 디자인패턴에 대한 감도 잡았고 자신감도 생긴터라 진행속도가 아주 빨랐다.
5월 12일 하루동안 역할사슬패턴/인터프리터패턴/이터레이터패턴/미디에이터패턴/메멘토패턴/옵저버패턴까지 6개의 패턴을 공부했고 추가로 커맨드패턴까지 자료조사를 마친 후 마무리했다.
2024년 05월 13일
전날에 이어 스테이트패턴과 스트레티지패턴을 공부했고 12일, 13일간 공부한 내용을 복습까지 했다.
2024년 05월 24일
대장정의 마지막날이었다.
마지막으로 템플릿 메서드 패턴과 비지터 패턴을 공부했고 미뤄뒀던 커맨드패턴까지 마무리 지었다.
최종 후기 |
아주 오래전부터 디자인패턴 공부는 꼭 해야지 해야지 생각을 했었는데 이상할정도로 디자인 패턴 공부만 시작해보려고 계획을 잡으면 정말 이상하게 그 날부터 공부가 너무 하기 싫거나 모든 자신감을 잃는 등 공부 의지에 맥이 끊겨버리고 도저히 못할것같다는 생각이 들곤 하는 일이 여러번 생겼었다.
그러다보니 디자인 패턴이 나에게 큰 산처럼 느껴졌고 공부를 시작하는데만 오랜 시간이 걸렸고 공부를 하는 과정 또한 정말 오래 걸렸다.
그래도 결국 개인적으로 큰 산을 넘으며 많은 것을 배울 수 있었다.
1) 좋은 가이드라인
디자인패턴은 소프트웨어 디자인 과정에서 생길 수 있는 특정 상황들을 정말 잘 해결할 수 있는 좋은 가이드라인들이다.
다만 디자인패턴이 필요한 그 특정 상황을 겪어본적이 없다면 이해하기 아주 어려울 수 있다.
하지만 이미 겪어봤다면 공부진행속도가 아주 빠를것이며 큰 도움이 될것이다.
2) 앞보다 뒤가 빠르다
만약 디자인 패턴을 공부하기 전에 이 글을 읽는 사람이 있다면 처음 내용을 이해하는데 걸리는 시간보다 나중에 나오는 내용을 이해하는데 걸리는 시간이 훨씬 짧으므로 처음만 잘 이겨내보길 응원한다.
디자인패턴이 도대체 뭔지 이해만 한다면 그 다음 진행은 훨씬 수월할것이다.
3) 객체지향에 대한 월등한 이해
기존에 C++이나 Java같은 프로그래밍 언어들을 배울 때 객체지향에 대해 배우고 이해하긴 했었지만 디자인패턴을 공부하고 나니 기존의 이해도는 지금에 비해 정말 밑바닥이었음을 느끼게 됐다.
디자인패턴을 공부하는것만으로도 객체지향을 사용하는 경험자체가 많아지게 되고 객체지향의 원칙인 단일책임원칙이나 개방폐쇄원칙 등에 대한 온전한 이해를 할 수 있게 됨으로써 정말로 객체지향이 추구하는 바와 클래스를 작성하는 법에 대한 월등한 이해를 얻게 되었다.
4) 기존에 작성한 코드들이 밉다
디자인 패턴을 공부하면서 기존에 진행했던 프로젝트들에 대한 아쉬움이 너무나도 많이 생겼다.
그때 이런식으로 했으면 더 좋았겠구나 같은 생각이 아주 많이 들었고 디자인 패턴 공부를 한 사이클 마친 후 지금 심정은 기존 프로젝트는 그냥 다 지워버리고 새로 만들어야 겠다는 생각뿐이다.
당장에 목표로 두고있는 백준(solved ac) 플레티넘 티어를 달성하고 나면 기존에 작성한 프로젝트에 피처 브랜치를 만들고 디자인패턴을 반영해가면서 리팩토링 해볼 예정이다.
마무리 |
이상으로 나에게만 유독 큰 산처럼 느껴졌던 디자인 패턴을 드디어 넘어선 후기였다.
디자인 패턴을 공부할 수 있게 잘 정리된 내용들을 제공해줬던 많은 블로그들에 감사를 남긴다.
디자인패턴을 통해 배운것도 많지만 그 과정에서 앞으로 공부해야겠다고 생각한 내용들이 더 많은것같다.
앞으로의 목표
1) 백준 플래티넘티어 달성
2) TaskManager 프로젝트 리팩토링
3) 소프트웨어 공학적인 내용들 공부(UML, 객체지향원칙 등)
4) GoF분류 외의 디자인패턴들 공부