🦉 뀨업 - 이화 백준 사이트 리팩토링 ( 10 ) - 학생별 기여도 순위 조회 API ( 2 )

2025. 3. 29. 06:39개발/🦉 뀨업

 

 

 

오늘 밤샘 코딩하기루 했당...!

다들 바쁘고 개발은 자꾸 늘어지고 2차 릴리즈는 해야 돼서 오늘 밤새서 기능 완성하기루 했다

그래서 알바 끝나구 학교 공도 달려갔당 ✌

 

 


 

 

기여도 랭킹 API

 

1 )  기여도 랭킹 로직 확정

1.  하루 한 번 전체 업데이트
:  학생 한명씩 돌면서 각 학생이 푼 문제 불러오기
-  student : 각 학생이 푼 문제 삽입
-  problem : 문제 삽입하면서 푼 사람 수 +1 해주기

2.  리프레시 버튼 눌렀을 때 특정 학생에 대해서 업데이트
:   특정 학생이 푼 문제 업데이트하기
-  student : S(basic), S(rare)값 업데이트
-  problem : 업데이트된 문제 푼 사람 수 +1 해주기 

 

 

2 )  DynamoDB

 

DynamoDB

:  AWS에서 제공하는 완전관리형 NoSQL 데이터베이스

:  Key-Value 및 문서(Document) 저장 방식의 DB

 

특징

  • 서버리스(Serverless)
    • 별도로 서버를 운영할 필요 없이 AWS에서 자동 관리
    • 데이터 증가에 따라 자동 확장(Scaling)되므로 성능 최적화에 신경 쓸 필요가 적음
  • NoSQL 데이터베이스
    • 관계형 DB와 달리 고정된 스키마가 없음
    • JSON 형식으로 데이터를 저장하며, 컬럼을 자유롭게 추가 가능

 

테이블 구조

Primary Key (기본 키)

:  DynamoDB에서는 모든 테이블이 기본 키(Primary Key)를 반드시 가져야 함

-  Partition Key (해시 키, 단일 키 기반) : 단순한 Key-Value 저장 방식

-  Composite Key (해시 키 + 정렬 키, 복합 키 기반) : Partition Key + Sort Key 조합으로 구성, Sort Key 기준으로 정렬

 

Attributes (속성, 컬럼 개념)

-  DynamoDB는 RDBMS처럼 고정된 컬럼을 가지지 않음

-  한 아이템(레코드)에 저장되는 속성(Attribute)은 JSON 형태로 자유롭게 변경 가능

 

 

 

3 )  기여도 업데이트 방식

 

DynamoDB 테이블

<Student>

handle total basic rare problem
         

handle : 백준 핸들(partition key) / total : 기여도 점수(sort key) / basic : 난이도 점수 합 / rare : 희소성 점수 합 / problem : 푼 문제 번호들

<Problem>

problem_id solved_num
   

problem_id : 백준 문제 번호 / solved_num : 푼 사람 수

 

기여도 수식

S(basic) = i=1 ∑ n​ (Ki)

n: 총 문제의 개수
Ki: 해당 문제(i)의 난이도 점수
K => Bronze V는 1점, Bronze IV는 2점, ..., Ruby I는 30점




S(rare​) = i=1 ∑ n​ (K * e ^(− λ*Ni​))

n: 총 문제의 개수
K: 기본 가중치 ( 10 )
λ: 감소율 (0.02)
Ni​: 문제 i를 푼 사람 수 



S(total​) = S(basic​) + S(rare​)

 

리프레시 버튼 업데이트 로직

리프레시 누르면

📍 기존 데이터베이스 조회(student) : 특정 학생이 푼 문제 리스트 조회

📍 업데이트 시점에 특정 학생이 푼 문제 리스트 불러오기

: S(basic) update -> 각 문제 번호별로 난이도 구하기, 난이도 점수 더해주기

: S(rare) update -> 각 문제 번호별로 푼 이대 학생 수 구하기, 10 * e ^(− 0.02*Ni ) 값 계산해서 더해주기

 

 

 


 

 

우엥 졸려...