Django-Wanted-Internship-3-Team / repo1_feed-service

소셜 미디어 통합 Feed 서비스 (원티드 팀 과제 1)
https://bow-hair-db3.notion.site/Feed-938175f1165b470e90462d1f1d52fd78
MIT License
2 stars 0 forks source link

추가기능 API (최근 많이 사용한 태그 추천, 내 게시물 단기간 조회수 급상승) #21

Open JaeHyuckSa opened 1 year ago

JaeHyuckSa commented 1 year ago

PR 체크리스트

아래 항목을 확인해 주세요:

PR 유형

이 PR은 어떤 종류의 변경을 가져오나요?

현재 동작은 무엇인가요?

14

이슈 번호: N/A

새로운 동작은 무엇인가요?

최근 가장 많이 생성된 해시태그를 추천하는 API 구축

이 PR은 호환성 변경을 도입하나요?

기타 정보

JaeHyuckSa commented 1 year ago

최근 많이 사용한 태그 추천 API Flow 생각

우선 3시간이라는 시간을 기준점을 잡기 위해 객체들의 기준이 되는 시간이 필요했습니다. hashtag - post 사이의 pivot table에 timestamp를 추가하여 그 시간을 기준 점으로 3시간 전의 생성된 데이터들을 모두 조회하여 그 중 id 값을 기준으로 Count하여 많은 순서대로 정렬하면되겠다 생각하여 구현했습니다.

더 좋은 방법이 있다면 공유해주시면 감사하겠습니다 :)

JaeHyuckSa commented 1 year ago

(기능 구현 예정)

On Fire : 내 게시물이 단기간 조회수 급상승 -> 해당 기능에 대한 설명이 부족해 비즈니스 적으로 활용하여 API를 구현했습니다.

기존 24시간 동안 일정 조회수 (100건으로 생각)을 넘겼을 때 일시적으로 단기간 급상승 게시물에 올라옵니다. 내 게시물이 단기간 조회수 급상승이라는 서비스(광고 유료 서비스로 구입시간으로 부터 24시간 동안만 )를 사용했을시 동일하게 단기간 급상승 게시물로 인식하여 올라옵니다.

simseulnyang commented 1 year ago

코드 확인했습니다! 재혁님께서 선택하신 방법이 좋다고 생각합니다. 저였으면 HashTag 테이블 하나만 이용하려고 하다 보니 코드 자체가 엄청 복잡해지고 구현 자체도 힘들었을 것 같아요😢 이번에도 또 하나 배웠네요 ㅎㅎ 감사합니다!

JaeHyuckSa commented 1 year ago

고생하셨습니다!😁

우선 저는 '최근 많이 사용되는 해시태그'에 대해서 ' 게시물 조회 시 많이 검색 혹은 포함되는 해시태그'라고 생각하였습니다. @saJaeHyukc 님은 '게시물 생성시 많이 사용된 해시태그'라고 생각하신 것 같은데 이부분은 충분히 그렇게도 해석가능할 것 같습니다!

우선 HashTag 모델의 name이 unique가 아니어서 같은 이름의 해시태그라도 카운팅이 다르게 될 수 있을 것 같습니다. 또한, 기준 3시간 기준 시 데이터베이스에 입력하여 쿼리를 하는 것은 연산이 버거울 수도 있지 않을까 생각됩니다.

현재는 없지만 Cache를 통해서 해결할 수 있지 않을까 생각됩니다. (Redis)

  1. 3시간 이내 카운팅 기록 방법 : HashTag 이름을 Key로 하여 3시간 전 분단위 별로 해시태그 이름 사용 건에 대한 카운팅을 합니다.
  2. Cache에 존재하는 HashTag를 대상으로 Ordering을 통해 총 카운트가 높은 HashTag를 얻습니다. 이러한 방법으로 접근하여 구성할 수 있지 않을까 생각됩니다!

좋은 접근인것 같습니다 :) 만약 레디스를 사용할 수 있다면 해시태그가 생성될 때마다 Redis에 저장하고 하면 간단하게 카운팅할 수 있겠네요 ! 캐시 사용을 해당 API 내용을 저장하고 그 내용을 조회할 수 있도록 하는 방법만 생각했는데 위의 방식도 사용할 수 있을 것 같아요 피드백 해주셔서 감사합니다.

JaeHyuckSa commented 1 year ago

코드 확인했습니다! 재혁님께서 선택하신 방법이 좋다고 생각합니다. 저였으면 HashTag 테이블 하나만 이용하려고 하다 보니 코드 자체가 엄청 복잡해지고 구현 자체도 힘들었을 것 같아요😢 이번에도 또 하나 배웠네요 ㅎㅎ 감사합니다!

감사합니다 :)