본문 바로가기

일상+자잘한 일/개발일지-unsolved.hgu

[Flutter/unsolved.ac/01] 문제 배경 및 API 호출 문제

[22/11/01] 요즘 학교 백준 랭킹이 많이 내려가기 시작해 어떻게 하면 학교 순위를 올릴 수 있을까 고민하게 되었다.

학교에서 푼 문제 수는 중복되지 않은 문제를 해결할 때 올라가는 것을 알게 되었고 서로 풀지 않은 문제가 무엇인지 알 수 없어

우리가 풀지 않은 문제 리스트를 난이도 별로 제공하면 어떨까? 하는 생각을 하고 기획하게 되었다.


 

[22/11/10] 백준 자체는 robots.txt로 확인해보니 크롤링을 허용하지 않았고 api가 없을까 고민하던 중 solved.ac에서 unofficial하게 제공하는 것을 알게 되었다. (https://solvedac.github.io/unofficial-documentation/#/)

Web, Android, Apple 모두 범용적으로 쓸 수 있으며 내가 현재 공부하고 있는 기술 스택인 flutter로 배포하기로 결정하였고 api 호출 방법에 대해 공부하기 시작했다.

 


[22/11/17] 앱으로 배포를 하게 된다면 수정할 때마다 업데이트를 해야하고 학생들이 귀찮게 다운받아 쓰지 않을 것 같아서 웹배포를 최종 목표로 하게 되었다. 또 Firebase로그인과 디자인 등등을 공부하여 대충 틀을 짰다. 프레임을 구축하는데 도움이 된 자료는 아래와 같다.
(https://github.com/ReinBentdal/styled_widget/wiki/demo_app)

(https://firebase.google.com/codelabs/firebase-get-to-know-flutter#0)


[22/11/23] 데이터베이스(Firebase Firestore) 설계를 다시하게 되었다. api를 호출하는 과정이 아래와 같은데

  1. 우리학교에 속해있는 사람들의 handle(이름)을 호출해 모두 받아온다.
  2. 호출한 유저가 각 각 풀어낸 문제 명단을 받아온다.(중복된 문제는 count를 올려준다.)
  3. 난이도별 문제를 긁어와 풀어낸 문제 명단에 없는 문제를 뽑는다.

API를 받아서 유저를 저장해야하고, 학교에서 푼 문제 수를 저장해야하고, 각 유저가 풀어낸 문제의 명단과 갯수, 가장 많은 사람들이 푼 문제 명단, 풀지 못한 문제 명단, 문제에 대한 세부 내용 등을 받아와 저장해야했다. 생각보다 firebase 설계를 잘못하면 관리와 지속적인 확장에 어려움이 있을 것 같아서 설계를 다시하게 되었다.


[22/12/01] API를 무지성으로 끌어쓰던 중 호출 횟수에 제한이 있다는 것을 알게 되었다. 사이트마다 다르지만 내가 쓰려는 api는 15분에 300회가 되지 않았다. 어떻게 이 문제를 해결할 수 있을까.. 어떻게 하면 15분에 1번씩 호출할 수 있을까 고민하던 중 교수님께서 힌트를 주셨다. 힌트를 주시기 전에 내가 생각한 방법은

  1. timer를 구현해서 일정 시간마다 함수를 호출 (유저가 그 타이머 시간동안 내 프로그램을 실행시켜야 하는 문제가 있다.)
  2. multithread로 구현해 sleep 시키기 (역시 유저가 그 시간동안 실행시켜야 한다.)

도저히 답도 떠오르지 않을 때 알려주신 방법은

  1. cronjob
  2. ReactiveX
  3. firebase function

위 3가지였고 현재 학기가 끝나기 전에 구현하기에 어려움이 있으니 firebase에 로그를 찍어 로그 시간과 현재시간을 확인해보고 갱신할 때가 되었을 때만 함수를 호출하는 것이 어떻겠느냐는 힌트를 주셔서 이 방향으로 우선 구현하기로 결정하였다.