Skip to content

feat ✨ feed api 추가 #416

@niamu01

Description

@niamu01

내용

주요 기능: 새로운 소식 올리기 (피드 발행) , 팔로우 한 사람들의 소식 보기 (피드 생성)

피드 발행: 캐시&db에 기록, 나를 팔로우 하는 사람들의 피드에 전송
피드 생성: 내가 팔로우 하는 사람들의 피드를 모아 최신순 정렬

설계

feed db: {
피드 고유 id : objectId
유저 고유 id (로그인한 사람 말고 작성자) : number -> userPreview로 변경
작성된 시각 : Date
피드 타입 : enumType
각 피드에 맞는 글: 각 피드에 맞는 타입
}
// id까지만 한 collection에 두고 feed collection을 따로 두는 설계를 고민했지만... sql공부 중에 비슷한 컬럼끼리 한 테이블에 모아두라 해서 모아둠

feed cache: (Map자료구조)
key: 유저 id
value: 피드 고유 id의 배열

ex) Map<81730, [(81730이 팔로우 하는 사람이 적은 글1), ...]>

cache 방식 2가지

fanout-on-write

포스팅 시 뉴스피드(모든 피드)를 갱신
본인의 캐시에 해당 포스팅을 기록
뉴스피드가 갱신되어있어 (pre-computed) read시 빠름
팔로워가 많은 사용자는 모두(접속하지 않는 유저도) 갱신해줘야해서 오래 걸림 (hotkey)

fanout-on-read

피드를 읽으려 할 때 갱신 (요청기반 on-demand)
비활성화 사용자가 많은 경우 로그인 전까지 자원 소모 x
hotkey x
피드 읽기까지의 소요시간이 길어질 수 있음

+) 두 방법을 적절히 섞어 장점을 얻을 수 있지만, fanout-on-write 방식을 우선적으로 구현 완료하고 마칠 예정의 이슈

API

GET

캐시의 userId와 feedId를 통해 userPreview와 게시글을 가져와 반환
(그럼 게시글도 preloadCache를 해야하는게...맞나)

  1. feedCache에서 내 userId을 통해 (key) 내가 팔로우하는 사람들의 피드id를 받음 (value)
  2. 피드 id를 통해 feed를 가져옴
  3. 반환

POST

cache와 db에 업데이트

  1. 내가 새 소식을 포스팅 함
  2. 나를 팔로우 하는 유저들의 id를 userCache에서 가져옴
  3. (나를 팔로우 했지만 mute한 유저 filter)
  4. feedCache에서 id를 키값으로 새로 쓴 포스팅 id를 push 해줌

get, post 둘 다 Authorization header 필요

240303

  • 설계 고민 및 위 이슈 작성
  • 코드로 구조 맞춰보기...

240308

  • cursor paginated 추가
    • union type을 paginated할 수 없던 이슈
  • local에 cache가 있는 follow 먼저 만들기 시작
    • type을 고정할 수 없던 이슈

240309

  • temp_follow 데이터 만든 후 follow feed 테스트
  • get 틀 구현

  • cache Map으로 구현
  • post 틀 구현
  • follow이외의 피드 이어서 작업...
    • 작업 도중 cache를 바꾸게 될 수도 있음...
    • db참조를 덜 하는 방향으로 가려 함...

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

Status

🏗 In progress

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions