본문 바로가기
더이상 하지 않는 망한 프로젝트/프로젝트 개발 과정

[앱삼] 10. (backend) 무한스크롤 - 게시물 몇개씩 정해서 던져주기

by VictorMeredith 2023. 3. 15.

1. 몽구스 스키마 정의하기.

- 일단 게시물 하나의 스키마를 정의해준다.

- 타입, 아이디, 텍스트, 좋아요 수, 좋아요를 누른사람 목록 등을 정의한다.

- mongoDB에서 제공하는 자동 타임스탬프를 활용해서 생성 시간, 수정 시간을 쉽게 가져다 쓸 수 있다.

- 복합 인덱스를 생성해서 mongoDB에서 제공하는 인덱싱 기능을 사용할 수 있다. 여기서는 최신 순, 좋아요가 많은 순으로 인덱싱해서 각각 4개씩 보여줄 수 있도록 구현할거다.

models/ChatApp.js

 

2. 좋아요가 많은 순으로 4개씩 보내주기

 

controllers 모듈

- type은 게시판 타입이다

- count는 /api/chatmain/:type/popular/:count 로 들어온 파라미터이다.

- nowMyId 는 현재 나의 아이디를 가져온다 이는 수정,삭제,좋아요 버튼 등에 쓰인다

- sort({기준인덱싱, 보조인덱싱}) 이렇게 적으면 인덱싱 기능을 사용할 수 있다. 여기서는 like로 내림차순을 하고, 같다면 최신순으로 보내줄 수 있도록 했다.

- pageSize는 전역변수로 4로 설정했다. 4개씩 보내주기 위해서이다. skip()함수를 사용하여 count * 4 만큼 제끼고 그 다음 부터 limit(4)를 써서 4개의 데이터 만큼 보내주도록 했다. 0이 아닌경우 1,2,3개도 잘 보내준다.

- 그렇게 find한 Mongoose Document는 수정하려면 일반 JS객체로 변환해서 작업해야한다. 찾은 글을 좋아요 누른 사람을 모두 글의 정보 안에 담아두었는데, 그 중에 유저가 포함되어 있으면 isLike라는 필드를 만들어 true를 하나하나 박아서 가공 후에 클라이언트로 보내주는 방식이다. 지금 생각해보니 유저정보안에 글의 고유번호를 저장할걸 그랬나. 근데 그러면 그 글을 좋아요를 눌렀는지 안눌렀는지 서버가 알려면 유저의 정보를 또 조회해야 하는 경우가 생길 것 같긴 하다. 데이터를 어디에 포함시키냐에 따라서 장단점이 있겠다. 

- auth 구현 할때는 async-await 패턴하고 Promise 패턴하고 짬뽕되서 리팩토링 때 정리하려 했으나 이번에는 신경을 좀 썼다.

- 이제 /api/chatmain/app/popular/:count 로 요청하면 count가 0이면 좋아요가 많은글 4개, 1이면 그다음 4개, 2면 그다음4개 ..... 

이런 식으로 잘 보내준다. 없으면 없다고 stat:false로 보내준다. 이는 프론트엔드에서 캐치하면 된다.

- 스크롤을 내릴때마다 count를 +1 하면서 글목록을 보관한 state에 받아온 데이터를 push해주면 알아서 생성된다.

댓글