부트캠프

[부트캠프] 실전 프로젝트 정리

반응형

실전프로젝트 최종 제출을 완료하고 회고해보고자 합니다.

 

1. 피드(게시글) CRUD

 

저희가 만든 서비스에 퀘스트를 완수함에 있어서 3가지 타입의 퀘스트가 있습니다. 그 중 피드(게시글)를 작성하는 퀘스트가 있습니다.

지도에서 피드에 해당하는 퀘스트가 뜬 장소에 도착하여 피드를 작성할 수 있습니다.

피드 목록은 이웃 커뮤니티에 초점을 맞춰서 현재 위치의 동에서 생성된 피드만 볼 수 있습니다.

피드를 보여줄 때 최신순, 인기순, 거리순 세 카테고리로 정렬하여 보여줍니다.

 

2. 댓글 작성

 

위에서 작성한 피드에 댓글을 작성, 수정, 삭제할 수 있는 기능입니다. 댓글은 해당 피드가 작성된 위치가 아니어도 어디서든 자유롭게 작성할 수 있습니다.

 

3. 좋아요

 

자신의 동네에서 올라온 피드 목록을 보고 마음에 드는 피드에 좋아요를 누르고 취소할 수 있습니다.

 

4. 채팅 기능(socket - mongoDB)

 

각 동마다 하나의 채팅방만이 만들어 집니다. chatRooms라는 테이블에 각 도큐먼트가 하나의 채팅방입니다. 만약 접속자의 주소로 생성된 chatRoom이 없다면 해당 주소로 채팅방이 만들어 지고 socketId 라는 배열칼럼에 socket.id를 push합니다. 만약 기존에 만들어진 방이 있다면 socketId칼럼에 접속자의 socket.id를 push합니다.

다른 위치의 채팅방을 들어가고싶다면 다른 동으로 움직이시면 해당 동의 채팅방에 접속할 수 있습니다. socket.io로 채팅을 구현했으며 현재 접속자 수 역시 socket으로 실시간 반영이 되도록 구현했습니다.

 

5. 업적 달성 기능(마이페이지)

게임답게 퀘스트를 몇 번 이상 달성하면 뱃지를 수여하여 마이페이지에서 뱃지를 볼 수 있도록 구현했습니다. 이런 업적리스트는 mission이라는 테이블에 미리 insert 해놓고 사용자가 퀘스트를 수행할 때마다 횟수를 카운트해서 achievement테이블에 insert합니다.

이 과정에서 쿼리빌더를 필수적으로 사용해야했습니다.

 

 

6. DB 설계(채팅 DB)

 

채팅 서버 DB 설계 (MongoDB) 

 

 

여기까지가 제가 맡았던 부분입니다.

 


 

고민했던 부분

1. 쿼리빌더

 

피드 및 댓글을 GET 요청이 들어올 때 피드 및 댓글을 작성한 사용자 정보를 요청을 보내야 합니다. 그 때 암호화된 비밀번호라지만 비밀번호까지 return을 하는데 이를 막아야 했습니다.

기존에는 TypeORM의 기본 리포지토리로 find findAll 정도의 메서드를 사용했지만 원하는 데이터만 뽑아오기 위해 queryBuilder를 적용하기로 했습니다. 

 

2. 채팅 서버

 

채팅을 구현할 때 socket의 id값이 접속할 때마다 바뀌게 되어 채팅방에 입장했을 때 기존의 메세지들이 해당 유저가 보낸 메세지인지 판단이 필요했습니다. 따라서 user 테이블에 userId 와 socketId 를 동시에 저장하고 사용자가 접속할 때마다 userId로 기존의 사용자인지 판단하고 socketId를 업데이트 하는 식으로 구현했습니다.

 

3. 테스트 코드

 

NestJS 유닛테스트의 경우 service, repository등을 mock 하는 등으로 Express보다 까다로웠습니다. mocking을 아직 완벽히 할 수 있다고는 할 수 없지만 꾸준히 테스트 코드를 작성해 나가겠습니다.

반응형