본문 바로가기
👨‍💻 프로그래밍/책잇아웃(포트폴리오)

🔥 Hot Ranking 알고리즘, Spring Batch로 구현하기 (feat. Strategy 패턴)

by 개발자 진개미 2023. 5. 18.
반응형

Hot Ranking 알고리즘이란?

인기있는 것 (Hot한 것)에 순위(Ranking)을 매기는 알고리즘

 

실시간 검색어, 커뮤니티의 인기 게시글, 화제가 되고 있는 뉴스 등 무언가에 특정한 기준으로 순위를 매기고 싶을 때 쓰는 알고리즘을 Hot Ranking 알고리즘이라고 부릅니다. 보통은 공개되어 있지 않고, 다양한 데이터를 바탕으로 계속 개선합니다.

책잇아웃(포트폴리오)을 만드는 도중, 커뮤니티 기능을 만들게 됐는데 게시글을 인기순으로 보여 주고 싶어 Hot Ranking 알고리즘을 고안해 봤습니다.


나만의 Hot Ranking 알고리즘

우선, 커뮤니티 부분의 DB 구조만 잠깐 보여 드리자면 아래같이 되어 있습니다.

즉, 게시글을 평가할 때 게시글 자체, 게시글의 좋아요/싫어요, 댓글, 댓글의 좋아요 싫어요 4개를 기준으로 평가해야 합니다.

일단 기본적인 구조는 이 4개의 카테고리에 가중치를 두고, 특정 행동에 점수를 부여해 점수가 높은 게시글을 먼저 선택하게 했습니다. 하지만 여기서 중요한 것! 바로 게시글 작성 시간을 어떻게 처리할지 입니다. 몇 달, 몇 년이 지난 글을 인기 게시글로 보여주는건 명백하게 Business Domain에 맞지 않기 때문에 게시글 작성 일수에 따라 음의 가중치를 주게 했습니다.

실제 코드를 보시면, 기본적인 앞서 말한 기본적인 구조가 잘 나타나 있습니다.

 

추가로 댓글을 평가한 방식을 자세히 보여드리겠습니다. 댓글의 경우 정성스런 댓글이 많은 게시글이 올라가는게 맞다고 생각했습니다. 하지만 갑자기 AI를 들고와서 이걸 평가할 수도 없으니 일단 단순하게 길게 작성한 댓글을 "정성스런 댓글"이라고 평가해 더 높은 점수를 줬습니다.


Strategy 패턴을 쓴 이유

처음 개발 공부를 시작할 때는 디자인 패턴을 왜 쓰는지 이해가 되지 않았습니다. 고민끝에, 대충 어떤건지만 알아두고 정말 필요성을 느낄 때 제대로 공부하자고 다짐했습니다. 지금이 그 필요성을 느낄 때 같습니다. Hot Ranking 알고리즘을 구현하려고 할 때 불현듯 Strategy 패턴이 떠올랐습니다.

Hot Ranking 알고리즘은 "점수를 계산한다"라는 명확한 목적 아래에 다양한 구현 방법이 있고, 그 방법을 유연하게 바꿔야 하니 Strategy 패턴을 쓰기에 딱 알맞는 장소 같았습니다.

우선, 점수를 계산한다는 목적이 같으니 Strategy interface를 정의했습니다.

Context는 아래와 같이 정의했습니다.

그리고 MAU가 0명이고, 출시한다고 해도 100명을 넘기 힘들거 같은 현재, 단순한 Hot Ranking 알고리즘을 구현한 Strategy 1개를 만들었습니다.


Spring Batch로 구현하기

마지막으로, 일정주기마다 특정 Hot Ranking 전략으로 점수를 계산하는 Batch를 만들었습니다.

구조는 단순히 점수만 계산하는 Batch이기 때문에 Job 1개Step 1개만 붙여 놨습니다.

  • Reader : 최근 100개의 게시글을 10개씩 읽어 옴
  • Processor : Context에서 Strategy 선택해서 점수 계산
  • Writer : 계산한 점수를 저장함

 

Job, Step 정의

Reader

Processor

Writer


개선점

  • Strategy의 Context를 Spring Bean으로 만들었는데, 중간에 전략의 일관성을 보장해 주기 못 할거 같아 좋은 방식은 아닌거 같습니다.
  • Processor에서 게시글에 관한 다른 여러 데이터를 불러오고 있는데, 관심사의 분리가 되지 않아 데이터를 불러 오는 것을 Reader에 다 일임해야 합니다.
  • Scheduler에 주기를 property로 빼는게 더 유연성 있을거 같습니다.

 

추후 지속적으로 Github에서 개선해 나갈 예정입니다.


 

반응형

댓글