221117 TIL 객체들로 구성된 작은 세상을 만들어 보자

어제 했던 협력 설계의 잘못된 부분을 감사하게도 아샬님께서 짚어주셨다.

어제 했던 협력 설계 인데 아샬님께서는 사용자에서 뭔가가 시작되었다는 건 의인화가 충분히 이뤄지지 않았다는 신호라고 말해주셨다.

사실 어제 혼자 설계하면서도 "게시물을 작성하라"메시지를 사용자부터 시작하면 게시물뿐만 아니라 다른 모든 것들도 다 사용자부터 시작하게 될 것 같은 느낌이 들어서 이게 맞나? 라는 생각이 들어 이상함을 느꼈었다.

아샬님께서 일반적인 게시판 서비스는 게시판이 “게시물을 작성해라”를 메시지를 받는다는 말을 해주셨다.

기존에 설계한 객체에서 게시판 객체가 존재하지 않았었는데 게시판 객체를 만들어서 객사오를 참조해 새롭게 처음부터 설계해봤다. 

 

우선 게시판을 구성하는 요소들에 대해서 고민하는 것이 좋다고 책에 나와있기 때문에 현재 내가 진행하는 축구 게시판을 객체들로 구성된 작은 세상으로 바꿔봤다. 게시물 하나를 작성하기 위해 객체들의 관계는 어떻게 되고 협력 관계는 어떻게 되는지 작성해봤다.

우선 게시판이 게시글을 작성하기 위해 필요한 정보는 최소한 카테고리, 작성자(등급), 게시물 내용(제목, 내용)은 필요하다.

Category

그 중 카테고리와 게시판의 연관관계부터 살펴보자.

게시판에는 유럽 4대 리그(EPL, LaLiga, SerieA, Bundesliga)의 카테고리가 존재한다. 객체지향 관점에서 카테고리는 객체로 바라볼 수 있고 카테고리 안의 리그 항목들 역시 객체로 볼 수가 있다. 즉 카테고리는 리그라는 카테고리 항목 객체들을 포함하고 있는 객체로 볼 수가 있다.

 

게시판은 카테고리에서 어떤 카테고리에서 게시글을 작성할 것인지 선택할 수 있어야 하기 때문에 게시판은 카테고리 항목을 알아야 한다.

이 말은 게시판과 카테고리 두 객체 사이의 관계가 존재한다는 것을 암시하고 있다.

게시판과 카테고리 사이의 연관 관계

위에서 카테고리 객체에서 카테고리 항목 쪽으로 향하는 마름모는 포함 관계 또는 합성 관계를 나타낸다. 카테고리 항목이 카테고리에 포함된다는 사실을 표현한 것이다.

 

User

다음은 게시판과 사용자의 연관 관계이다.

게시판은 카테고리를 보고 원하는 카테고리를 고르고 게시물을 작성할 것이다. 이때 게시물 정보(제목, 내용)를 작성할 사용자가 필요하다.

사용자는 게시판에게 자신이 작성하고 싶은 게시물의 정보를 작성을 요청한다. 객체지향 관점에서 보면 사용자 역시 하나의 객체이다.

게시판은 카테고리를 보고 원하는 카테고리를 정하고 사용자에게 게시물 정보를 전달받아 게시물을 작성할 것이다.

이때 사용자는 게시물 정보와 같이 자신의 정보도 전달하는데 사용자의 정보 중 등급이 필요하다.

등급 또한 하나의 객체로 바라볼 수 있으며 사용자 역시 자신의 등급을 선택할 수 있어야 하기 때문에 사용자는 등급 항목을 알아야 한다.

이렇게 사용자와 등급 객체 사이의 연관 관계가 생겼다.

사용자는 등급 항목 객체 하나를 전달받아 자신의 정보와 함께 게시판에게 게시물을 작성해달라고 요청한다. 게시판이 작성하는 게시물 역시 객체로 볼 수 있다.

사용자, 등급, 게시물이 추가된 연관 관계

게시판에 존재하는 객체들을 구성하고 연관 관계들을 정리해봤다. 객체지향 세계에서는 이 객체들이 모두 서로 협력하는 자율적인 객체들의 존재임을 잊으면 안 된다. 이 관계들을 바탕으로 어제 했던 헙럭을 설계해서 객체에게 적절한 책임을 할당해보자.

 

협력을 설계하는 방법 : https://seungjjun.tistory.com/191 

먼저 "게시물을 작성하라" 메시지를 처리할 적합한 객체로 사용자가 아닌 게시판을 선택했다. 이제 게시판 객체는 게시물을 작성할 책임을 위임받게 되었다. 게시판 객체는 카테고리 항목을 알지 못하기 때문에 카테고리 항목을 누군가가 제공해주어야 한다. 항목을 전달해준 가장 적합한 객체가 카테고리 항목 객체들을 갖고 있는 카테고리 객체이다. 따라서 "카테고리 항목을 찾아라" 메시지를 수신한 카테고리는 카테고리 이름에 대응되는 카테고리 항목을 게시판에게 반환해야 한다.

 

 

이후 게시판은 게시물을 작성하기 위한 게시물의 정보를 전달받아야 한다. 그래서 게시판은 "게시물의 정보를 작성하라" 메시지를 수신할 객체를 찾는다. 해당 메시지를 수신할 객체는 사용자가 가장 어울릴 것 같다. 사용자 객체는 게시물 정보를  작성할 책임을 위임받았고 게시판에게 게시물 내용을 전달한다. 

사용자는 자신의 정보도 같이 전달해야 하는데 사용자는 등급의 이름에 대해 알지 못하기 때문에 등급 항목을 전달받아야 한다.

사용자 역시 게시판과 마찬가지로 "등급 항목을 찾아라" 메시지를 수신하기에 가장 적합한 등급 객체에게 등급 항목을 요청한다.

 

이제 게시판은 게시물을 작성할 모든 정보를 전달받아 게시판이 게시물을 만드는 것으로 끝이 난다.