본문 바로가기
OOP/<헤드 퍼스트 디자인 패턴>, 에릭 프리먼 외

헤드 퍼스트 디자인 패턴 서평

by 민휘 2023. 2. 28.

놀러와요 깃헙

https://github.com/Mingadinga/2023-Design-Pattern

 

GitHub - Mingadinga/2023-Design-Pattern: <헤드 퍼스트 디자인 패턴>

<헤드 퍼스트 디자인 패턴>. Contribute to Mingadinga/2023-Design-Pattern development by creating an account on GitHub.

github.com

드디어 헤드 퍼스트 디자인 패턴을 다 읽었다~! 원래 여행 출발 전까지(1월 중순) 다 읽는게 목표였는데 계절학기에 여행 준비가 겹쳐 2월 중순에 끝냈다😅 대신 신나게 놀고 돈 쓰고 면허도 땄다. 번아웃을 완전 극복한 갓생걸이다.

 

생각보다 별거인 헤드 퍼스트

책을 읽기 전에는 헤드 퍼스트니까 가벼운 마음으로 읽어야겠다는 마음으로 시작했다. 표현 방식이 가볍기는 했으나 내용은 결코 가볍지 않았다. 많은 인터페이스와 객체지향 개념과 코드의 향연이 펼쳐졌다. 아무 생각 없이 읽었을 때는 다소 난해하다고 느껴졌으나, 이 디자인 패턴이 왜 존재하는지에 주목하면 어떻게 정리할지 길이 보이기 시작했다.

 

결국 결론은 객체지향

지난 학기에 읽은 조영호 님의 <객체지향의 사실과 오해>에서 가장 중요한 것은 객체들은 어떤 기능을 수행하는 협력에 참여하기 위해 책임을 가지고 자율적인 존재가 되며, 메시지를 통해 의사소통하는 것이었다. 이 관점을 그대로 가져와서 디자인 패턴에 적용해보았다.

옵저버 패턴을 정리해보자. 옵저버 패턴의 목표는 어떤 객체의 내부 상태가 바뀌었을 때 이 객체와 관심 있는 객체들에게 변경을 알리는 것이다. 상태 변화를 일으키는 책임, 상태 변화를 알리는 책임, 상태 변화를 알릴 객체를 아는 책임, 상태 변화 알림을 받고 싶다고 요청하는 책임, 변화된 상태를 받아 사용하는 책임이 필요하다. 이 책임들을 객체에게 적절히 분배한다. 변화를 일으키고, 연락 받을 객체를 알고, 이 객체에게 알림을 보내는 책임은 Subject에게 할당한다. 상태 변화 알림을 받고 싶다고 요청하고 변화된 상태를 사용하는 책임은 Observer에게 할당한다.

 

옵저버 패턴의 클래스 다이어그램은 다음과 같다.

Subject는 옵저버를 알고 연락하는 역할을, Observer는 상태 변화를 요청하고 변경된 상태를 사용하는 역할을 한다. 이들은 인터페이스이며, 외부에 자신이 이런 메시지를 수신할 수 있음을 공개한다. 코드에서 Subject의 모든 구현은 Subject 타입으로 인식되어, 실행 시점에 주입된 모든 Subject 구현체가 Subject 타입으로 보내지는 동일한 메시지를 처리함을 보장한다. 인터페이스가 공개한 메시지는 구현이 내부적으로도 구현한다.

 

구현은 코드를 많이 쳐보면서 익혀야한다

디자인 패턴을 처음 공부한다면 구현을 익히는 것이 중요하다고 생각한다. 디자인 패턴은 설계를 유연하게 만들 목적으로 적용하는 것이므로, 동일한 패턴이라도 구현의 모습은 다를 수 있다. 옵저버 패턴을 적용할 때 상태를 변화시키는 객체에 직접 Subject 인터페이스의 메소드를 바로 구현할 수 있다. 하지만 이미 구현체가 너무 많은 상황에서 Subject를 구현하려면 중복 코드가 많아진다. 이럴땐 구현체의 인터페이스에 Subject 인터페이스를 상속하고, Subject 메시지를 구현하는 구현체를 만들어 기존 구현체에 구성으로 추가하는 방법을 사용할 수 있다.

 

그리고 디자인 패턴을 공부할 때 이 책과 함께 짧은 유튜브 강의를 함께 들었다. 헤드 퍼스트 디자인 패턴이 다 좋은데, 본론으로 들어가기까지 문제 상황을 질질 끄는 경향이 있다. 나는 참지 못하고 8분 정도의 강의를 들으면서 의도, 문제 상황, 구현, 코드까지 빠르게 쳐보고 헤드 퍼스트를 읽었다. 방향성도 잘 잡히고 훨씬 빨리 읽힌다. 성질이 급한 사람들은 이 방법을 추천한다.

 

디자인 패턴 카탈로그

디자인 패턴 내용을 정리할 때, 공부하는 유형의 카탈로그를 만들면 좋겠다고 생각했다. 무슨 내용을 채울까 하다가, 예전에 토비의 스프링 첫번째 책을 띄엄띄엄 읽으면서 토비 님이 디자인 패턴에 대해서 언급하신 부분이 떠올랐다.

패턴에서 가장 중요한 것은 각 패턴의 핵심이 담긴 목적 또는 의도다. 패턴을 적용할 상황, 해결해야 할 문제, 솔루션의 구조와 각 요소의 역할과 함께 핵심 의도가 무엇인지를 기억해둬야 한다.

이 문장에 의거해서 나만의 디자인 패턴 템플릿을 작성했고, 14개의 디자인 패턴을 정리했다. 내용이 궁금하신 분들은 저의 깃허브에 놀러오세요 >< 이슈로 예쁘게 정리해놓았답니다. 책의 마지막 장에서 디자인 패턴을 공부하고 자신만의 카탈로그를 만들 것을 제안했다. 나는 이미 이걸 하고 있었지요. 이런 중요한 내용은 초장에 알려주시기 바랍니다 작가님~~

 

그래서 얻은 것, 앞으로 읽을 것

토끼책(객체지향의 사실과 오해)로 객체지향에 눈을 뜨긴 했지만, 코드에 대한 이해는 부족하다는 생각이 들었다. 디자인 패턴을 공부하면서 객체지향적 설계를 어떻게 코드로 구현하는지 느껴볼 수 있었다. 디자인 패턴 코드 쳐보면서 인터페이스나 추상 클래스 문법에 꽤 익숙해졌고 흥미를 붙이기 시작했다. 이제 오브젝트와 토비의 스프링을 읽으면서 객체지향 개발자로 거듭나기 위해 노력할 것이다. 아자 아자 화이팅!!!

'OOP > <헤드 퍼스트 디자인 패턴>, 에릭 프리먼 외' 카테고리의 다른 글

MVC (아키텍처 패턴)  (1) 2023.02.24
Proxy  (1) 2023.02.24
State  (0) 2023.02.24
Composite  (0) 2023.02.24
Iterator  (0) 2023.02.24