221118 TIL 게시판 객체를 생성해 리팩터링

어제 협력에 필요한 객체의 종류와 책임, 메시지를 정리했고 오늘은 설계한 것을 바탕으로 어떻게 리팩터링 할지 고민하는데 시간을 많이 사용했다.
우선 카테고리와 게시판 객체 사이의 관계가 애매했었는데 그 이유가 게시판의 이름이 카테고리 이름이랑 동일한 역할을 한다고 생각을 했다. 왜냐하면 카테고리는 어차피 축구라는 카테고리 안에 여러 개의 게시판이 존재할 것이기 때문에 카테고리 객체가 필요한가에 대한 생각을 하게 되었다. 그래서 동료들에게 카테고리와 게시판에 대한 관계(카테고리 안에 여러 개의 게시판, 게시판 안에 여러개의 게시물)를 설명하니 카테고리가 굳이 필요 없을 것 같다는 이야기를 해줬다.

그래서 기존에 카테고리가 하던 역할(카테고리에 맞는 게시글들을 프론트 엔드로 넘겨주는 것)을 게시판이 하도록 리팩터링을 진행했다.


두 번째는 BoardController와 PostController가 해야 하는 역할에 대해서 고민을 했다. 기존에는 게시판 객체가 존재하지 않아 PostController에서 전체 게시글을 보여주고 게시물 등록, 삭제, 수정 모두 다 하고 있었는데 게시판 객체가 생기고 BoardController가 생김에 따라 게시글 리스트를 보여주는 건 게시판이 해줘야 하는 일 같아서 BoardController가 하도록 리팩터링 했다.

그러면 이제 게시물을 작성하고 수정, 삭제하는 건 PostController와 BoardController 중 누가 해줘야 하는지 고민이 되었다. 어제 협력을 설계하면서 "게시물을 작성하라"라는 메시지를 받은 건 게시판이니까 게시물 작성하는 건 BoardController가 하는 게 맞다고 생각을 했고, 나머지 게시물의 상세 정보를 보여주거나 수정, 삭제하는 부분은 PostController가 담당을 하게 했다.

프론트엔드에서도 이상한 구조에 대해서 발견을 했는데 카테고리별 게시글을 보여주는 컴포넌트와 전체 게시글을 보여주는 컴포넌트가 따로 존재한다는 게 매우 이상했다. 게시글을 보여주는 컴포넌트에 하나에서 카테고리가 달라질 때마다 보여주는 게시글이 달라야 하는 게 맞는 구조인 것 같은데 전체 게시글 보여주는 컴포넌트 따로 카테고리별 게시글을 보여주는 컴포넌트 따로....??? 너무 이상했다.

처음에 내가 왜 이렇게 만들었는가 생각을 해보니 전체 게시글을 보여주는 url이 "localhost:8080"으로 뒤에 아무것도 안 붙이고 싶었고 카테고리별로 게시글을 보여주는 url은 localhost:8080/posts? category={categoryId} 이런 식으로 쿼리 스트링을 이용해 url을 설정해주고 싶어 App 컴포넌트에서 Route path 설정을 전체 게시글은 "/"로 카테고리 게시글을은 "/posts"로 하고 쿼리 스트링을 이용했던 것 같았다.

그래서 오늘 게시글 보여주는 컴포넌트 하나로 게시판의 이름에 따라 게시글을 보여주게 하는 방법을 생각하다 아래 사진과 같이 Route를 path는 다른데 보여주는 컴포넌트가 똑같이 하는 게 가능한 건지 실험을 해봤는데 되는 것을 확인했다.

 

그러면 쿼리 스트링을 이용해 게시판의 아이디에 따라 보여주는 게시글을 다르게 하고 쿼리 스트링 값이 없을 때는 전달하는 boardId의 기본값을 설정해 전체 게시글을 불러오도록 설정할 수 있었다.

boardId가 1(기본값)일 때는 전체 게시글을 get 해오도록 하고 아니면 boarId의 값에 따라 게시글을 불러오도록 했다.

 

 

처음에 설계할 때 게시판 객체의 존재를 전혀 생각하지 못하고 있다가 어제 급하게 다시 협력 관계를 설계하고 리팩터링을 진행하려 하니 기존의 코드에서 상당히 많은 부분을 바꿔야 했고 아직도 다 바꾸지 못했다. 원래 기능을 구현한 상태로 돌아가려면 시간이 좀 걸릴거 같은데 구조를 바꾸는 거니까 어쩔 수 없는 것 같다. 사실 지금 만들고 있는 구조도 제대로 된 구조인지 스스로 판단할 수 없지만 이제는 시간이 별로 없어(오늘 2주밖에 안 남았다는 소식을 접했다..) 어떻게든 완성을 시키는 것을 목표로 달려보자.