본문 바로가기
띡딱똑띡 개발자 Hanna

NodeJS와 MongoDB로 SNS 만들어보기 - user_follow (팔로우 라우터)

by HannaDev 2019. 11. 14.

2019/11/14 - [띡딱똑띡 개발자 Hanna] - NodeJS와 MongoDB로 SNS 만들어보기 - user_profile (프로필 라우터)

 

NodeJS와 MongoDB로 SNS 만들어보기 - user_profile (프로필 라우터)

2019/11/14 - [띡딱똑띡 개발자 Hanna] - NodeJS와 MongoDB로 SNS 만들어보기 - user_passport (로그인 라우터) NodeJS와 MongoDB로 SNS 만들어보기 - user_passport (로그인 라우터) 저번 포스트에서는 전체적인..

granora2019.tistory.com

 

ㄴ 이전 글

 

 


 

routes 폴더 구조


 

 

* 현재까지 설명한 router => 7번 (user_passport), 10번 (user_profile)

 

* 현재 설명하고자 하는 router => 4번 (user_follow)

 

 

 

> user_follow

 

user_follow.js 파일 내의 라우터 및 함수 목록

 

user_follow.js는 사용자간 팔로우 관련 라우터들을 정의한 파일입니다.

 

3번 /flipFollow/:Id 라우터는 Id에 해당하는 유저를 팔로잉하고 있다면 팔로잉 해제를,

팔로잉하고 있지 않다면 팔로잉 설정을 하는 라우터입니다.

 

즉, 팔로우 설정/팔로우 해제 라우터가 각각 따로 존재하는 것이 아닌

'상태 뒤집기' 라우터 하나가 존재하는 구조입니다.

 

개인적으로 이 방식이 더 깔끔하고 프론트에서도 사용하기 편리하다고 판단되어

위와 같이 구현했습니다.

 

4번 /getUsers/:page 는 모든 사용자 유저를 대상으로 page 번째 페이지 목록을 불러오는

라우터입니다. 기획 상 사용자 목록을 조회하는 페이지가 존재하진 않지만 3번 팔로우 함수를

테스트하기 위해 만들었습니다.

 


 

현재 구현된 라우터 중 '목록 불러오기' 관련된 라우터는 파라미터에 따라

2종류로 나뉩니다. (page와 lastDate를 모두 받는 라우터 & page값만 받는 라우터)

 

보편적인 페이징 방식을 page 번호에 따라 해당 page에 해당하는 목록을 받아오는 구조입니다.

하지만 CatcherLand 어플에서는 스마트폰 어플리케이션인 만큼 모든 목록을 '스크롤링'으로 받기 때문에

목록 조회 중 밀림 현상으로 인한 중복 조회를 방지하기 위해 'lastDate'를 파라미터로 받습니다.

 

lastDate보다 전에 만들어진 정보를 불러오는 방식으로 단순히 위에서부터 n번째 정보를 받아오는 방식을

피함으로써 밀림 현상으로 인한 중복 조회를 방지합니다. (스크롤링인데 중복 조회되면 화면이 매우 이상해지기

때문에 이런 구조 사용) - 자세한 예시는 posting 라우터를 설명할 때 언급하도록 하겠습니다.

 

 

(왼) lastDate 파라미터 사용              (오) 단순 page 조회 방식

 

ㄴ Mongoose 함수에 대해서도 라우터 설명이 끝나면 따로 포스팅을 하도록 하겠습니다.

 

 

 

 

 

* Router 상세 정보 *

더보기

POST    /getFollowingList

* 팔로잉 목록 (최신순 - 팔로잉한 시점을 기준으로)

* 페이지당 최대 20개씩 받아옴.

 

>> 필요 파라미터 <<

{

  page: 페이지 번호 (int),

  ㄴ 첫번째 페이지일 경우 1로 보내주시면 됩니다.

  ㄴ 실질 라우터 처리에서는 1인지 아닌지 여부만 체크합니다.

      (skip관련 처리 때문에)

  lastDate: 목록 마지막의 created_at (String)

  ㄴ 첫번째 페이지일 경우 0으로 보내주시면 됩니다.

  ㄴ POST 결과값으로 보내는 newLastDate을 다음 페이지

      조회 시 lastDate 파라미터로 설정해 주세요.

}

 

 

> 에러 발생 시

{

  isGetFollow: false (boolean),

  errorMsg: 에러 메세지 (String)

}

 

> 정상 작동 시

{

  isGetFollow: true (boolean),

  users: [ { _id: 팔로잉한 유저의 ObjectId (String),

            nickname: 팔로잉한 유저의 닉네임 (String),

            userName: 팔로잉한 유저의 아이디 (String),

            isBasicImg: 팔로잉한 유저의 프로필 이미지가 기본 프로필 이미지인지 (boolean),

            cloudUrl: 팔로잉한 유저의 프로필 이미지 Url, 기본 프로필 이미지면 null값 (String)

           } ], <= 팔로잉 목록 리스트

  newLastDate: 다음 페이지 조회 시 파라미터로 설정해줄 lastDate값 (String),

  remainPage: 남은 페이지 수 (int),

  totalNum: 남은 목록 수 (int)

  ㄴ totalNum값이 0이면 더이상 조회할 데이터가 없는 상태인 것입니다.

}

 

 

 

 

 

POST    /getFollowerList

* 팔로워 목록 (최신순 - 팔로잉 당한 시점을 기준으로)

* 페이지당 최대 20개씩 받아옴.

 

>> 필요 파라미터 <<

{

  page: 페이지 번호 (int),

  ㄴ 첫번째 페이지일 경우 1로 보내주시면 됩니다.

  ㄴ 실질 라우터 처리에서는 1인지 아닌지 여부만 체크합니다.

      (skip관련 처리 때문에)

  lastDate: 목록 마지막의 created_at (String)

  ㄴ 첫번째 페이지일 경우 0으로 보내주시면 됩니다.

  ㄴ POST 결과값으로 보내는 newLastDate을 다음 페이지

      조회 시 lastDate 파라미터로 설정해 주세요.

}

 

 

> 에러 발생 시

{

  isGetFollow: false (boolean),

  errorMsg: 에러 메세지 (String)

}

 

> 정상 작동 시

{

  isGetFollow: true (boolean),

  users: [ { _id: 팔로우한 유저의 ObjectId (String),

            nickname: 팔로우한 유저의 닉네임 (String),

            userName: 팔로우한 유저의 아이디 (String),

            isBasicImg: 팔로우한 유저의 프로필 이미지가 기본 프로필 이미지인지 (boolean),

            cloudUrl: 팔로우한 유저의 프로필 이미지 Url, 기본 프로필 이미지면 null값 (String)

           } ], <= 팔로잉 목록 리스트

  newLastDate: 다음 페이지 조회 시 파라미터로 설정해줄 lastDate값 (String),

  remainPage: 남은 페이지 수 (int),

  totalNum: 남은 목록 수 (int)

  ㄴ totalNum값이 0이면 더이상 조회할 데이터가 없는 상태인 것입니다.

}

 

 

 

 

 

GET    /flipFollow/:Id

* 팔로우 상태 뒤집기 라우터

 

>> 필요 파라미터 (링크 뒤에 붙여 보내기!) <<

{

  Id: 팔로우 대상의 ObjectId (String)

}

 

> 에러 발생 시

{

  isUserFollow: false (boolean),

  errorMsg: 에러 메세지 (String)

}

 

> 정상 작동 시

{

  isUserFollow: true (boolean),

  status: 최종 팔로우 상태 (boolean)

  ㄴ true면 팔로우 설정된 것.

  ㄴ false면 팔로우 해제된 것.

}

 

 

 

 

 

GET     /getUsers/:page

* 유저 목록 조회

* 최대 20개씩 받아옵니다.

* 테스트용이니가 그냥 page값으로만 목록 조회합니다.

 

>> 필요 파라미터 (링크 뒤에 붙여 보내기!) <<

{

  page: 페이지 번호 (int)

}

 

> 에러 발생 시

{

  isGetUser: false (boolean),

  errorMsg: 에러 메세지 (String)

}

 

> 정상 작동 시

{

  isGetUser: false (boolean),

  users: [ { _id: 해당 유저의 ObjectId (String),

            nickname: 해당 유저의 닉네임 (String),

            userName: 해당 유저의 아이디 (String),

            isBasicImg: 해당 유저의 프로필 이미지가 기본 프로필 이미지인지 (boolean),

            cloudUrl: 해당 유저의 프로필 이미지 Url, 기본 프로필 이미지면 null값 (String),

            board_count: 해당 유저의 작성 게시글 수 (int),

            follower_count: 해당 유저의 팔로워 수 (int),

            following_count: 해당 유저의 팔로잉 수 (int),

            userInfo: 해당 유저의 프로필 소개글

           } ], <= 유저 목록 리스트

  page: 현재 페이지 번호 (int),

  maxPage: 마지막 페이지 번호 (int),

  totalNum: 총 유저 수 (int)

}

 

 

 

 

 

GET    /getOtherProfile/:id

* 유저 프로필 조회

 

> 에러 발생 시

{

  isGetUser: false (boolean),

  errorMsg: 에러 메세지 (String)

}

 

> 정상 작동 시

{ 

  isGetUser: true(boolean),

  _id: 해당 유저의 ObjectId (String),

  nickname: 해당 유저의 닉네임 (String),

  userName: 해당 유저의 아이디 (String),

  isBasicImg: 해당 유저의 프로필 이미지가 기본 프로필 이미지인지 (boolean),

  cloudUrl: 해당 유저의 프로필 이미지 Url, 기본 프로필 이미지면 null값 (String),

  board_count: 해당 유저의 작성 게시글 수 (int),

  follower_count: 해당 유저의 팔로워 수 (int),

  following_count: 해당 유저의 팔로잉 수 (int),

  userInfo: 해당 유저의 프로필 소개글

}

ㄴ 프론트(Flutter)를 위한 라우터 상세 정보 입니다.

 

 

 

 

 

 

 

 

 

 

댓글