한빛 미디어 서평단 활동의 일환으로 책을 제공 받고 작성된 리뷰입니다.
이 책에서는…
지금이야 다양한 디자인 패턴을 활용하고 또 필요에 따라 응용하기도 하지만 처음부터 그런 것은 아니었습니다. 학부생시절 강의를 통해 디자인패턴을 배웠으나 그 당시에는 디자인 패턴의 중요성을 깨닫지 못했습니다. 그 당시 학생수준에서 개발한 소스코드는 제출로 끝인 과제만 있었기 때문에 유지보수에서 일어나는 문제를 알 수 없었고 결과적으로는 디자인 패턴의 필요성도 느끼기 어려웠습니다. 그러나 상용 프로그램을 개발하기 시작하면서 부터 깨달은 점은 개발자는 새로운 것을 개발하는 시간보다 더 많은 시간을 기존에 개발되어 있는 소스코드를 수정하는 데 쏟는 다는 점입니다. 쉽게 말해 SW불변의 진리는 변화
입니다.
계속 변화하는 SW
변화하지 않는 SW는 죽은 SW 뿐입니다. 즉 살아있는 SW프로젝트라면 변화할 수 밖에 없습니다. 개발자가 산출물을 빠르게 내는 것 보다 유지보수하기 좋은 코드를 짜는 것을 더 중요하게 생각하는 이유도 여기에 있습니다. 디자인패턴은 이러한 SW 유지보수하며 나올 수 있는 공통적인 문제를 객체지향 디자인 원칙에 따라 해결하는 가장 효과적인 방법 혹은 모범사례라 할 수 있습니다. 그리고 이 헤드퍼스트 책은 그 디자인 패턴을 가장 효율적으로 학습할 수 있는 책입니다. 이 책에서는 단순히 디자인패턴을 나열하며 소개하는 것을 넘어 객체지향적 디자인 원칙(설계 원칙)을 소개하고 그에 적합한 디자인패턴을 하나씩 소개합니다. 그 과정에서 디자인 패턴이 ‘왜 필요한지’를 충분히 공감할 수 있도록 구체적인 문제 시나리오를 설정하고 그 문제를 ‘어떻게 해결 할 것인지’를 단계별로 이해할 수 있도록 많은 지면을 할애해가며 차분히, 그리고 반복적으로 설명합니다.
헤드퍼스트 시리즈
헤드퍼스트는 독보적으로 실용적이고 효과적인 책입니다. 눈에 띄는 이미지와 구어체로 정보를 여러분 머릿속에 강제로 주입합니다. 어렵고 격식있고 정제된 문어체 대신 직관적이고 쉬운 구어체와 이미지들로 소화하기 쉬운 상태로 내용을 전개하는 등, 책의 구성 자체가 중요한 정보를 뇌리에 박히게끔 의도되어 있습니다. 은근 페이지가 많아보이는데 그 이유는 더 많은 내용을 설명하기 위해서가 아니라 더 쉽고 친절하게 설명하기 위해 지면을 투자하기 때문입니다. 이번 개정판에서는 전체적으로 이미지와 레이아웃이 깔끔해져서 가독성이 좋아졌지만 아이러니하게도 더 이상 예전의 헤드퍼스트 특유의 이질적인 느낌의 사진과 삽화를 볼 수 없는 점은 개인적인 아쉬움이 있습니다. 그러나 디자인 패턴을 의인화 하여 인터뷰를 하고, 퀴즈를 내고, 스승과 제자의 대담 등으로 구성되어 여전히 재미있으며 쉽고 빠르게 학습할 수 있도록 당신의 뇌를 말랑말랑하게 활성화 시켜줄 것입니다.
디자인패턴이란
디자인 패턴이란 Gof(Gang of Four)가 정립한 개념으로 SW개발(특히 유지보수/코드수정)에서 흔히 발생하는 문제들을 객체지향 디자인 원칙에 맞게 코드수준에서 해결하는 검증된 방법론 또는 코드 형식입니다. 이미 개발자 생태게에서는 상식수준으로 통용되어 장황하게 설명하는 대신 Factory, Repository, Adapter 처럼 디자인 패턴 이름만으로도 어떤 문제를 어떻게 해결하고자 한 코드인지 정확하게 파악이 가능하여 훨씬 효율적으로 소통할 수 있게 해줍니다.
장황하게 설명했으나, 객체지향적 코드 패턴이라 이해하시는 걸로 충분합니다.
그보다 중요한 점은 개발자라면 상식으로 반드시 알아야한다는 것입니다.
객체지향 디자인 원칙이 아주 원론적이고 가장 추상적인 개념이라고 한다면 디자인 패턴은 이러한 디자인 원칙을 바탕으로 한 실제 코딩 유형 또는 전략에 해당합니다. 여전히 추상적인 수준이고 언어에 종속되지 않고 객체지향 언어라면 어느 언어에서나 적용할 수 있습니다. 그러나 디자인 패턴이 라이브러리나 프레임워크로 존재하기 어렵습니다. 그 이유는 대부분의 디자인 패턴이 실제 소스코드로 구현된 수준이 아닌 그 이상의 추상화를 필요로 하고 또 실제 용도에 따라 다르게 응용되거나 적용되는 방법이 다양하기 때문입니다. 실제로 Java에서도 옵저버 패턴이 java.util.Observer
로써 존재했으나 Java9 부터 deprecate 된 사례도 있습니다. 결론적으로 디자인 패턴은 구현된 라이브러리로 참조해서 사용하는 대신 패턴으로써 필요한 순간에 개발자가 자신의 목적에 맞게 직접 구현해야하므로 디자인 패턴을 언제 어떻게 사용해야하는지 확실하게 이해하고 있어야 합니다.
결국엔 추상화와 인터페이스
궁극적으로는 디자인패턴은 추상화 통해 SW의 본질인 수정과 유지보수에 유리한 구조를 만드는 작업이라고도 할 수 있겠습니다. 디자인패턴은 결국 어떤식으로 추상화를 하느냐, 즉 인터페이스 설계에 관한 이야기라고 봐도 무방합니다. 클래스의 책임을 나누어 결합성을 낮추고 그래서 수정으로 인한 영향을 다른 클래스에 전파하지 않도록 하거나, 비슷한 역할을 모아서 응집도를 높여서 관리포인트를 줄일 수도 있습니다. 이 책에서는 객체지향의 추상화
가 무엇인지 다시 한번 고민해보게끔 도와주며 또 객체지향 디자인 원칙만으로는 실무 수준에서 코드를 설계하는데 모든 문제를 대응할 수 없는 이유를 다시금 설명합니다. 대표적으로 학부생 시절에 상속을 통해 재사용성을 높인다고 배운 점이 실제로는 어떤 부작용을 초래하는지 등 사례를 통해 실전레벨의 추상화
를 배우실 수 있습니다.
이런 사람들에게 추천합니다.
개발경력을 이제 막 시작한 주니어 개발자에게 강력 추천합니다.
만약 1~3년차정도의 주니어 개발자가 성장에 정체기가 왔다면, 혹은 주니어 티를 벗고 이제는 중니어(?) 개발자가 되고 싶다면 이 책으로 시작해보세요. 개발자의 학습을 돕는 많은 자료는 초심자를 위한 입문서거나 아니면 아예 수준급 전문가를 위한 내용인 경우가 많습니다. 하지만 반대로 입문 이후 실무를 뛰면서 생기는 고민들을 해결해주거나 내공을 쌓기위해 볼만한 자료들을 생각보다 찾기 어렵습니다. 이 책은 그런 점에서 주니어개발자라면 꼭 한번 읽어볼 책으로 강력히 추천드립니다. 또 이미 어느정도 연차가 있으신 분들도 이 책을 읽으면서 디자인 패턴을 잘 사용하고 있는지, 또 객체지향 디자인 원칙을 잘 준수하고 있는지 되돌아보기 위해 읽어보는 것도 좋을 것 같습니다. 하지만 아직 실무 경험이 없는 학생이라면 이 책을 읽어보는 것도 분명 도움이 되겠지만 와닿지 않을 수도 있을 것 같습니다. 헤드퍼스트 시리즈인 만큼 학생도 충분히 읽을 수는 있으나 아무래도 유지보수 경험이 생긴 이후에 좀 더 그 의미를 공감하면서 재밌게 읽으실 수 있을 것입니다. 그러나 신입 개발자분들이라면 오히려 이 책을 읽고 모든 것을 디자인패턴으로 구현하려는 디자인패턴-만능주의
에 빠지는 개발자-사춘기
에 빠질 수도 있으니 주의가 필요합니다. 물론 그 순간을 슬기롭게 지나고 나서, 어느새 성장해있는 본인의 모습을 발견하실 수 있을 것입니다.