241119 뉴스피드 프로젝트 시작

0
post-thumbnail

두 번째 팀 프로젝트가 시작했다!

바로 뉴스피드의 백엔드 api들을 구현해보는 것이다.
뉴스피드는 친구들의 최신 게시물들을 볼 수 있는 페이지이다.
페이스북이나 인스타그램, 트위터같은 SNS를 포함한다.

오늘은 팀원들과 회의를 하며 설계를 진행했다.

프로젝트를 시작하기 전에는 언제나 와이어 프레임, ERD, API 명세서 제작같은 프로젝트 설계 단계가 선행되어야한다.
우리는 인스타그램을 참고한 SNS를 만들어보기로 했다.

구현 기능

우리가 구현할 기능은 크게 네 가지로 정했는데 다음과 같았다.

  1. 유저 CRUD (회원가입, 프로필 조회, 프로필 수정, 회원탈퇴)
  2. 유저간 친구 요청, 수락, 거절 기능
  3. 게시글 CRUD (조회-페이지네이션) + 좋아요 기능
  4. 댓글 CRUD + 좋아요 기능

와이어 프레임 제작

기능을 정하고 나서는 와이어 프레임을 작성하기 시작했다.

이번에는 처음으로 Miro라는 사이트을 사용하여 협업으로 와이어 프레임을 제작했다.

모바일 템플렛에 만들었지만 어쨌든 이런 식으로 와이어프레임을 짰다.
라이브러리에서 요소들을 꺼내어 만드니 그럴싸하고 편리해서 좋았다.

ERD 작성 & API 명세서 설계하기

사실 CRUD 기능은 이전의 일정 관리 앱 기능을 만들며 많이 익숙해져서 괜찮았지만
이번에 새롭게 도전해 보는 기능들 중 '유저들간 친구를 맺는 기능''좋아요 기능'을 설계하는 데에 고민을 많이 했다.

친구를 맺는 기능?

우리는 프론트까지 구현하는 것이 아니기때문에 post man 으로 request를 보내면 response를 받는 식으로 구현을 해야하는데 친구 요청을 보내고 받은 요청을 처리하는 과정과, 이들의 친구 상태 저장을 어떤 식으로 해야할지 고민을 많이 했다.

실제로 사용자 입장에서는 친구 요청을 보내면 상대 측에서 받은 요청을 수락하거나 거절하는 일련의 과정이 물 흐르듯 진행되지만 이 통신과 관계를 db에 저장하는 것이 생각보다 어려웠다.

구현)
우리는 친구 관계를 다루는 db table을 하나 만들어서 관계를 맺을 유저 A와 B, 그리고 이들의 관계 상태(ex. 승인 대기중, 수락)를 저장하기로 했다.

그리고 user 테이블과 두 개의 유저 A, B를 외래키로 연결했다.
(ERD Cloud에서 같은 테이블끼리 두 개의 외래키 지정이 안돼서 하나는 미지정 외래키로 표시되어있다(점선))

그리고 API는 최대한 단순화하여 다음과 같이 구현하기로 했다.

  • 친구 목록 조회 : 현재 친구 상태인 유저 목록 조회
  • 친구 요청 목록 조회 : 내게 친구 요청을 보낸 유저 목록 조회
  • 친구 요청 전송 : db 테이블에 요청을 보낸 유저, 받을 유저, 그리고 상태를 승인 대기 중으로 설정하여 데이터를 insert
  • 친구 요청 수락 : 위의 친구 상태를 수락으로 update
  • 친구 요청 거절 : db 테이블에 생성된 데이터 자체를 delete

그리하여 작성한 api 명세서는 이 부분이다.

좋아요 기능 설계

좋아요 기능도 어떻게 구현해야할지 고민이 많은 부분이었다.
게시글이나 댓글에 유저들이 좋아요를 찍으면 좋아요 숫자가 올라가는 것까지는 좋으나, 대체로 sns들에서 유저는 한 게시글이나 댓글에 딱 한번만 좋아요를 누를 수 있고 다시 누르면 좋아요가 취소되기 때문이다.

게시글쪽에서도 좋아요를 누른 유저가 1:N 관계가 되고 유저쪽에서도 좋아요를 누른 게시글이 1:N 관계가 되는데 특정 게시글에 특정 유저와의 관계(1:1)가 다뤄지기때문에 우리는 따로 좋아요 테이블을 만들어서 양쪽과 연관관계를 맺기로 했다.

게시글의 좋아요 기능을 erd로 표현한 것이 이것이다.

댓글 쪽에도 똑같이 댓글 좋아요 테이블을 만들어 양쪽과 연관관계를 맺어주었다.

그리고 API 구현을 어떻게 할 지 고민을 했는데
단순히 좋아요 누르기 / 좋아요 취소하기 로 api를 두 개씩 구현할 수도 있었지만
api 실행을 했을 때 만약 좋아요를 누르지 않은 상태라면 데이터를 생성하고, 좋아요를 누른 데이터가 이미 있는 상태라면 데이터를 삭제하는 식으로 토글을 하듯 하나의 api로 구현을 할 수 있다고 보았다.

그리하여 작성한 API 명세서 부분은 이렇다.

아직 설계까지만 하고 코드를 직접 쳐보지는 않았지만 새로운 기능들을 구현해볼 생각에 설렌다. 비록 내가 맡은 역할에는 둘 다 포함되어 있지 않지만 내가 맡은 부분을 빨리 끝내면 시도해볼 수 있지 않을까 싶어 내일부터 분발해보기로 했다!

0개의 댓글