본문 바로가기

프로그래밍/컴퓨터 서적 리뷰 & After Service

JAVA 언어로 배우는 디자인 패턴 입문(3판) 리뷰

※ 이 글은 OKKY 에서 진행한 [영진닷컴] JAVA 언어로 배우는 디자인 패턴 입문(3판) 리뷰 이벤트 에 당첨이 되어 작성된 글임을 밝힙니다.

 

햇수로는 15년 넘게 개발자 인생을 살아온 나 이지만 프로젝트를 하면서 답답함이 점점 커져오는 부분이 있었다. 그것은 내가 이렇게 코딩하는게 맞는것일까..하는 점이었다. ASP, JSP 를 거쳐서 이제 Spring 에 안착하기까지 여러 종류의 코드를 봐왔지만 머랄까 늘 인터넷에서 검색해서 거기에 있는 코드를 흉내내서 하다보니 창조적으로 한다기 보단 늘 그때그때 내가 겪었던 경험을 근거로 하며 만들고 있었다. 프로젝트 템플릿을 만드는거 조차도 예전에 사용했던 것을 가지고 아무 생각없이 재탕 삼탕 해가며 사용하고 있었다. 템플릿을 만들때 이 사람이 어떤 사고방식과 의도로 이렇게 만들었나에 대한 고민없이 그냥 아무 생각이 없이 쓰다보니 템플릿을 응용해야 하는 시점에서는 지식 부족으로 인해 벽에 부딫칠때가 종종 있었다. 비단 템플릿 뿐만 아니라 시중에 돌고 있는 Util 클래스 조차도 나는 그러했다. 이렇게 부족하게 됐던 이유는 템플릿이나 클래스 등 이런 것들을 접할때 늘 시간 부족이란 이유로 해당 클래스에 대한 생각과 고민을 하지 않았기 때문이다. 가장 맨 밑바탕에 있는 디자인 패턴 개념이 부족하다보니 이런 현상이 있었다. 그래서 디자인 패턴에 대한 공부를 해야 겠다고 맘을 다잡고 있을때 기회가 닿아서 이 글에서 리뷰하게 될 JAVA 언어로 배우는 디자인 패턴 입문(3판) 을 보게 되었다.

 

이 글을 쓰는 시점을 기준으로 이 책은 GoF의 23가지 디자인 패턴을 다룬 책 중 가장 신간이다. GoF의 디자인 패턴은 워낙 오래전에 나왔던 것이고 새로 추가된 것도 없기 때문에 옛날책을 봐도 상관은 없겠지만 시중에 있는 책은 디자인 패턴에 대한 이론적인 설명 위주로 되어 있다보니 읽는 재미(?)가 없고 딱딱해서 금방 손을 놓게 되는 부분이 있다. 그러나 이 책은 자바를 이용한 예제를 사용해가며 책의 내용을 설명하고 있고 사용된 예제 코드 또한 출판사 홈페이지를 통해 제공되고 있기 때문에 다운로드 받아 이를 실행해서 그 결과를 확인할 수 있다. 그래서 자바 개발자인 나로서는 한 권의 소설책 읽듯이 편하게 읽을 수 있었다.

 

이 글의 구성은 내가 이 책을 읽으면서 가졌던 생각과 느낌으로 크게 장점과 단점으로 나누었다. 물론 장점과 단점은 절대적인 것은 아니다. 내 기준하에서 느낀것이기 때문에 다른 사람에게는 그게 아닐수도 있다. 그냥 대한민국에 살고 있는 모 개발자가 이 책을 읽으면서 가졌던 생각이라는 인식으로서 봐주었으면 한다.

 

 

장점

1. 작가가 강조하며 말하고자 하는 부분을 알기 쉬었다.

우리가 학교 다닐때를 생각해보면 교과서나 참고서에 중요한 부분에 대해서는 어떤식으로든 표시를 해두었다. 가령 형광펜으로 밑줄을 긋는 그런 행동들 말이다. 근데 이 책에서도 그런 부분들이 있다.

 

파란색으로 칠해져 있는 부분이 작가가 강조하는 부분이다

이것에 대해 사람들은 아마 호불호가 갈릴것 같간 하다는 생각이 들었다. 나도 이렇게 표기하는것에 대해 처음에는 거부감이 있었다. 오히려 책의 구성이 지저분해져서 집중에 방해가 되는 상황이 있었다. 그러나 내가 결국 이것을 장점이라고 최종결론을 내린 이유는 이렇게 표기를 한 부분이 결국 작가가 독자에게 말하고 싶은 내용을 한눈에 바로 알게 해주었기 때문이다.

 

작가가 설명을 친절하게 하지 않았거나 또는 번역자가 이상하게 번역해버리면 책을 읽는 독자는

 

"그래서 작가야..네가 나에게 말하고 싶은것은 뭔데..?"

 

라는 질문만 책을 읽으며 하게 되고 결국 그 해답을 얻지 못하는 상황이 오게 된다. 그러나 이 책은 적어도 이렇게 표시가 된 부분이 작가나 번역가가 독자에게 말하고 싶은 내용이란걸 명확하게 해준다. 물론 기존에 디자인 패턴에 대해 잘 알고 있는 사람이 봤으면

 

"나는 네가 내게 말하고자 하는 걸 알고 있어. 괜히 뻔한 말 하면서 책만 지저분하게 만드네.."

 

이렇게 생각할 수도 있다. 그러나 이 책의 독자는 디자인 패턴에 대해 잘 아는 사람만 보지는 않는다(머..잘 아는 사람이면 애초에 이 책을 보지 않겠지만..) 나 처럼 경력은 쌓여가지만 디자인 패턴에 대해서는 아무것도 모르는 허당 개발자들도 보게 될 것이다. 개발에 대한 지식은 충분한데 디자인 패턴에 대한 이해가 부족하거나 없는 사람에게는 이렇게 작가가 말하고자 하는 부분을 쉽게 파악하게 해주는 것도 책을 이해하는데 도움이 된다.

2. 각 Chapter 마다 이해하기 쉬운 구성의 흐름

이 책의 모든 Chapter 가 지금부터 말할 흐름을 모두 따르는건 아니지만 이 책의  Chapter 들은 대부분 다음과 같은 전개를 따르고 있다.

 

Chapter 에서 설명하고자 하는 패턴의 소개 -> 예제 프로그램 및 이에 대한 설명 -> 패턴의 등장인물 -> 독자의 사고를 넓혀주는 힌트 -> 관련 패턴 -> 이 장에서 학습한 내용 -> 연습 문제

 

Chapter 의 처음 부분에서는 해당 Chapter 에서 다룰 패턴에 대한 소개를 해주고 그 다음엔 이 패턴을 설명하기 위한 예제 및 여기서 사용되는 클래스를 설명한다. 여기까지는 책을 보지 않은 사람이어도 어떤 구성인지 느낌이 와닿을텐데 지금부터 얘기하는 패턴의 등장인물..이란 부분에서는 고개를 갸우뚱 거릴것 같다.

 

패턴에 대한 설명과 예제 프로그램

사실 이 부분이 어찌보면 이 책에서 정말 의미있게 다룬 구성 이라고 개인적으로 생각하는데 이 책의 초반에 드라마의 배역과 배우 에 대해 언급하는 부분이 나온다. 이 설명을 보고 참 적절한 비유라고 느낀게 배역에 따른 역할은 해당 디자인 패턴에서 특정 메소드가 어떤 일을 하게 되는지를 정의한 것과 같고 배우는 이 메소드를 어떤 클래스가 구체적으로 어떻게 구현했는지에 대한 것으로 비유하고 있다. 마치 인터페이스와 이를 구현한 클래스에 대한 비유 같이 말이다. 이걸 보고 디자인 패턴에 대해 어떻게 이해해야 하는지 큰 가닥을 잡고 공부할 수 있게 되었다.

 

패턴의 등장인물

독자의 사고를 넓혀주는 힌트 부분은 해당 패턴을 공부하는데 있어 오해할 수 있거나 미진한 부분에 대해 보강하는 차원에서의 설명이 이어지고 관련 패턴은 지금 설명하는 패턴과 어떤식으로든 관계가 있는 패턴에 대한 언급을 해준다. 마지막으로 이 장에서 학습한 내용은 해당 Chapter 에서 공부한 내용을 한줄 정리 또는 요약설명 해주고 자신이 공부한 패턴에 대해 확인하기 위한 연습문제를 제공하는 그런 구성으로 되어 있다.

 

독자의 사고를 넓혀주는 힌트
관련 패턴
이 장에서 학습한 내용

그래서 책의 전개과정이 디자인 패턴을 공부하고 이해하는데 도움이 되는 흐름구조를 가지고 있다. 

3. UML 을 먼저 알려주어 패턴을 이해하는데 도움을 줌

디자인 패턴 이라는 것은 구현된 코드를 보고 이해한다기 보다는 클래스와 클래스와의 관계 및 해당 클래스의 객체가 이 관계에 따라 어떻게 구현되고 움직이는지를 알아야 하는 부분인지라 각 클래스 간의 관계가 어떤 구조인지를 먼저 알아두어야 할 필요가 있다. 그래서 작가는 이를 위해 UML 을 사용했다. 사실 UML 은 가장 중요한 녀석이지만 어찌보면 가장 찬밥신세로 대우 받는 녀석이기도 하다. 프로젝트를 건물을 만드는 과정에 비유하면 UML은 건물의 설계도이기 때문에 중요한 요소이지만 정작 현업에서 UML은 그저 산출물 낼때 필요한 자료들 중 하나이고 또 이걸 보고 개발한다기 보단 DB 구조와 선임개발자가 작업한 템플릿 및 그 예제를 가지고 만들다보니 UML 작성은 개발자에게 있어서 가장 짜증나는 작업 중의 하나이기도 하다(머 문서 작성 좋아하는 개발자는 없기도 하지만..)

 

그러나 지금은 프로젝트를 수행하는 것도 아니고 우리가 디자인 패턴을 공부하는 과정이고 그 과정에서 UML은 이해에 많은 도움을 준다. 그래서 패턴에 대한 설명을 듣고 UML 을 보며 책에서 제공하는 샘플 코드를 보면 작가가 설명하는 의도가 무엇인지를 이해하게 된다.

 

디자인 패턴은 언어가 중요하진 않다. 그 때문에 패턴에 대한 설명과 제공되는 UML에 대한 이해로도 자기가 알고 있는 다른 언어로도 이를 충분히 구현할 수 있고 그 둘로도 이해가 부족하다면 자바로 만든 샘플 소스를 보면 좀더 도움이 될 꺼라 생각한다.

 

UML 은 디자인 패턴을 이해하는데 도움을 준다

단점

1. 초급 개발자는 이 책을 읽지 마라

이 책은 절대 초급 개발자용이 아니다. 출판사에서는 책의 등급을 어떻게 매겼는지는 알지 못하겠으나 일단 내가 현재 일하고 있는 프로젝트의 1년차 개발자에게 이걸 보여주었을때 "아유..부장님..내용을 잘 모르겠어요.." 란 얘기를 들었다. 오히려 초급 개발자라면 언어나 프레임워크에 대한 공부를 하는게 디자인 패턴을 공부하는거 보단 더 낫다.

 

디자인 패턴을 공부해야 하는 시점은 내가 부족한게 느껴질 때 해야 한다. 물론 초급 개발자도 부족한건 맞다. 그러나 여기서 내가 말하는 부족하다는 것은 아무것도 모르는게 아니라 아는 건 이제 어느 정도 알게 되었는데 먼가 부족함이 느껴지는 것을 의미한다. 내가 이 리뷰 이벤트에 응모했던 이유가 그러했다. 스프링 개발자로 살아온 개발 경력도 거진 10년이 되어가고 프로젝트를 할 때 기본 샘플 템플릿은 척척 알아서 잘 만들어서 개발자들에게 배포하는 수준에 이르렀지만 이런걸 만들다보면 내 결과물에 만족 못할때가 종종 있다. 매끄럽지 않은 느낌을 주는 나의 결과물을 보면서 내가 먼가 몰라서 놓치고 있는 부분이 있다는 것을 느껴가고 있던 시점에 디자인 패턴이 나의 이런 부분에 대한 해결책을 줄 수 있지 않을까 싶어서 응모했던 것이다. 남들이 다 하니까 나도 그걸 안하면 뒤떨어질꺼 같아 하는 공부가 아니라 좀더 나의 완성도를 올려주고 싶은 필요성이 느껴질때 하는 것이 디자인 패턴..인 것이다. 어쩌면 이 책을 구입할 초급 개발자도 있을 수 있다. 초급 개발자가 디자인 패턴을 알아야 하는 걸 부정하는게 아니다. 다만 초급 개발자에게 디자인 패턴은 우선순위에서 후순위로 미뤄둬도 괜찮다는 뜻이다. 그러나 본인이 중급 개발자로 들어섰다면 이 책은 추천한다. 디자인 패턴을 알고 시작하는 것과 모르고 시작하는 것은 차이가 있기 때문이다.

2. 예제의 불친절함

이 책의 예제는 출판사 홈페이지를 통해 다운로드 받을 수 있다. 출판사 홈페이지를 통해 받는 것은 옛날에는 많이 대중적으로 사용하는 방법이었으나 요즘은 각 출판사마다 github 계정을 만들어 운영하고 있다. github url 을 알려주면 독자들이 알아서 clone 과정을 거쳐 자신의 IDE 에서 사용할 수 있는데 약간 소스를 제공하는 방법이 요즘 출판사들과는 다른 점이 있었다.

 

근데 이 부분은 나름대로 독자들이 알아서 할 수는 있는데 내가 불친절하다고 느껴지는 부분은 소스를 받은 다음에 이걸 연습하기 위해 IDE 환경에서 이를 어떻게 셋팅해야 하는지에 대한 언급이 없었다. 이 책의 서두에 보면 작가의 말이 있는데 3판에 대한 언급을 하면서 예제 프로그램을 자바 버전에 맞춰 업데이트 했다고 말하는 부분이 있는데 사용한 자바 버전에 대한 언급이 없어서 어떤 버전을 사용해야 하는지를 몰랐다.

 

나 같은 경우는 작가의 말을 대강 보고 예제를 다운로드 받아 OpenJDK 11 버전을 사용해서 예제로 프로젝트를 구성했는데 이 과정에서 문법 오류를 겪게 되었다. 근데 검색을 해보니까 문법 오류가 아니라 JDK 15 버전에서 새로 추가된 문법이라 JDK 11 에서는 오류로 알려주었던 것이었다. 작가의 나라인 일본은 JDK 15 이상이 대세일진 몰라도 우리나라는 아직도 JDK 8 을 사용하는 프로젝트가 있으며 이제 11로 넘어가고 있는 추세다(물론 스타트업 같이 기술 중심 기업은 그렇지 않지만 안정성을 중시해서 JDK 버전 올리는데에도 민감한 공공이나 금융 같은 분야는 아직도 옛날 기술을 사용하고 있는 것이 현실이다) 그래서 예제를 OpenJDK 11 버전에 맞춰서 이를 재구성해서 github 에 올려두었다. JDK 11 버전에서 공부하고 싶은 독자들은 이용하길 바란다. 이클립스 이용자라면 위의 링크된 github repository  에서 clone 명령을 통해 다운받은 뒤 File -> Open Projects from File System 을 선택한 후 Import source 항목에서 Directory 버튼을 눌러 clone 명령을 통해 만들어진 design-pattern-study 폴더를 선택한 후 Finish 버튼을 클릭하면 된다(물론 IntelliJ 에서도 사용 가능하며 나도 IntelliJ 를 이용해 소스를 수정한 뒤 이를 github 에 반영했다)