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

2025. 5. 3. 21:58개발/🦉 뀨업

 

 

 

랭킹 완성하즈아...

1 )  MySQL ranking table 정기 갱신 (하루에 한번)

2 )  refresh 버튼 눌렀을 때 MySQL ranking table - rare, basic 값 갱신

3 )  ranking 조회

 

 

Ranking Table 정기 갱신

 

ranking table 구조

ranking_id handle total basic rare
int String float float float

 

-  basic값 갱신 : solved.ac API 사용하기

GET  https://solved.ac/api/v3/user/problem_stats

parameter : handle(String)

response

[
  {
    "level": 0,
     "total": 0,
     "solved": 0,
     "partial": 0,
     "tried": 0
  }
]

 

-  rare값 정기 갱신

DynamoDB 정기 갱신 후에 계산

:  dataCrawlingService.getSolvedStudents(pid) 사용

( 동기식 처리 필요 - 후처리 콜백 : TransactionSynchronizationManager.registerSynchronization() 사용)

 

 

Refresh 버튼 누르면 - Ranking Table 갱신

 

1 )  userRefresh 후 새로 푼 문제, 최초 솔브 여부 반환받기

 

2 )  새로 푼 문제에 대해서

( 1 )  rare값 갱신

 dataCrawlingService.getSolvedStudents(pid) 사용

( 2 )  basic값 갱신

:  problems table에서 tier 가져오기

:  problems table 갱신 아직 안 됐을 경우, solved.ac API 사용 - https://solved.ac/api/v3/problem/show 

 

 

1 ) 과 2-1 ) / 2-2 ) 는 비동기 처리 수행하기 : 이벤트 처리

 

 

필요한 메서드 / SQL

getEwhaRank : 교내 기여도 랭크 조회
->  selectEwhaRank() : 교내 기여도 랭크 조회 SQL

updateRankingTable : ranking table 정기 갱신 (하루 한번)
-  updateBasic() : solved.ac API 사용
-  updateRare() : dataCrawlingService.getSolvedStudents(pid) 사용
->  insertScores() : basic, rare, total 새로 삽입 SQL
->  deleteScore() : table 초기화 SQL

refreshScores : refresh 버튼 눌렀을 때 basic, rare, total 점수 update
-  userRefresh() : 새로 푼 문제 조회
-  refreshRare() : dataCrawlingService.getSolvedStudents(pid) 사용 / 더할 rare 값 계산 및 업데이트
-  refreshBasic() : problems tier 조회, solved.ac API 사용 / 더할 basic 값 계산 및 업데이트
->  selectRare() : 기존 rare 값 조회
->  selectBasic() : 기존 basic 값 조회
->  refreshScores() : basic, rare, total 업데이트 SQL