메가테라 19주차 주간회고 (프로젝트 3주차 회고)

19주 차 회고


메가 테라 19주 차를 진행하면서 있었던 일을 종합해서 회고하였습니다.

 

리팩터링의 연속

이번 주는 객체 구조를 바꾸는 데 시간을 너무 많이 사용했다. 실제로 주중에 2번을 바꾸면서 좋아요 기능과 댓글 기능을 구현하는데 예상했던 스토리 포인트를 객체 구조를 바꾸는 데 사용을 해서 예상했던 것보다 오버되기도 했다.

모양이 이상하긴 한데 맨 처음 객체를 설계할 때 작성했던 것이다.

 post라는 게시글이 담고 있어야 할 정보들의 연관관계를 @ManyToOne과 @OneToMany 어노테이션을 이용해 매핑했었는데 이 방식 말고 한 객체 안에서 다른 객체의 정보를 들고 있지 않고 자신이 갖고 있어야 할 갖고 기존에 갖고 있던 다른 객체들의 정보는 아이디 값만 갖는 방식으로 구조를 다시 바꿨다. post라는 게시글을 요청받으면 post가 보여줘야 할 정보들은 post가 id값으로 갖고 있기 때문에 그 id값으로 레파지토리에서 찾아오는 방식으로 바꿨더니 컨트롤러 부분의 로직이 엄청 길어지는 현상이 발생했다.

그리고 테스트 코드 작성하기도 매우 불편했던 게 하나 테스트하기 위해서 post와 연관된 모든 것들을 mocking 해줘야 하는 문제도 있었다.

 

그래서 이 로직이 컨트롤러 부분에 있는 게 맞지 않는 것 같아 서비스에서 처리해주는 방식으로 다시 리팩터링을 했는데 오늘 아샬 님의 특강을 들으면서 이 방식 또한 문제가 있다는 것을 알게 되었다.

PostController에서 post를 요청했으면 딱 post만 건네줘야 되는데 나는 post, comment, category, like 등등 여러 가지를 한꺼번에 넘겨주고 있었다.

이렇게 하지 말고 필요한 정보의 API를 여러 번 호출하는 방식으로 하는 것을 말씀해주셨다. 이렇게 하면 컨트롤러에서는 자기의 관심사의 것만 전달해주면 되기 때문에 코드가 훨씬 가독성이 좋아졌고 유지보수 하기도 매우 편해졌다.

 

댓글 / 대댓글

댓글과 대댓글 기능은 이전에 좋아요 기능을 구현하면서 객체 구조 설계를 바꿔놨기 때문에 생각보다 쉽게 구현할 수 있었다.

어려웠던 점은 댓글과 대댓글을 불러와서 댓글에 맞는 대댓글을 바로 밑에 보여주는 게 어려웠었는데 그 이유가 JS문법이 부족해서 어려움을 느꼈었다. 이번 기회에 map, filter, find를 더 심화적으로 공부하고 사용하는 계기가 되었다.

댓글 / 대댓글 기능

 

실시간 채팅

프로젝트에서 가장 핵심적인 기능 중 하나인 실시간 채팅 기능 구현을 이번 주 목표로 잡았다. 처음 구현하는 기술이고 채팅 관련해서는 아는 정보가 거의 없었기 때문에 스토리 포인트를 생각보다 더 넉넉하게 잡았다.

좋아요 기능, 댓글 / 대댓글 기능 두 개를 완료하고 목요일 저녁이 되어서야 채팅 관련해서 알아보기 시작했다. 처음에는 실시간 채팅을 구현하는 방법들(polling, long polling, streaming 등)에 대해서 조사하고 그중에서 많이 사용하고 있는 websocket을 이용하기로 결정했다.

내가 원하는 채팅 기능을 구현하기 위해서는 내가 당장 어떤 것을 해야 하는지, 아무것도 모르는 상태인 게 가장 큰 문제였었는데 일단 가장 기본이 되는 WebSocket을 이용해 1:1 채팅을 구현하기로 했다.

구글의 확장 프로그램인 Simple WebSocket Client 프로그램을 이용해 1:1 채팅을 구현하는 건 많은 정보들이 있었기 때문에 어렵지 않게 구현할 수 있었다.

 

그런데 위의 방식의 문제는 채팅방이 1개라는 게 문제였다. 내가 원하는 건 채팅방이 여러 개인 기능 필요했기에 STOMP라는 것을 이용해 된다는 것을 알게 되었고 이것 또한 조금 찾아보면 금방 구현할 수 있겠지 라는 알 수 없는 근자감을 갖고 시작을 했는데 내가 생각했던 것보다 더 어려워서 애를 좀 먹었다.

 

실시간 채팅 기능

 

아무튼 일요일이 되어서야 구현할 수 있었는데 넉넉하게 잡았다고 생각했던 스토리 포인트보다도 훨씬 많이 사용을 했다.

결국엔 페이지 네이션 기능을 구현하지 못한 상황을 만들어 버렸다. 실시간 채팅을 구현하는 것과 객체 구조를 리팩터링 하는데 많은 시간을 사용한 게 페이지 네이션 기능을 구현하지 못한 이유라고 생각하고 이번 주 작업할 때는 목표 설정과 스토리 포인트 분배를 내가 어떤 걸 못하고 잘하는지 파악하고 분배해야 할 필요를 느꼈고, 작업 설계하는 시간을 좀 더 많이 가져서 최대한 리팩터링 하는 시간을 줄여야겠다는 결론을 내렸다.