개요
리트코드를 통한 코딩테스트 스터디를 개시했다.
그런데 역시 문제를 선정하고 선정한 문제를 게시하고 푼문제를 아카이빙하고 공유하는 작업은 필요없지만 시간도 많이 들고 사람의 신경을 분산시킨다.
즉 사람은 '문제 풀이'에만 집중하고 나머지 필요없는 과정(문제 선정, 게시, 아카이빙, 공유)는 자동화 할 필요가 있었다.
그것이 스터디의 계속성을 더 보증할 수 있게 해주고, 문제풀이에만 집중할 수 있게하여 생산력을 늘려준다.
링크
https://www.notion.so/invite/83acac4ccb06382f41db678796eafe1db5cd6493
소스코드
이게 내가만든 소스
작동원리
리트 허브 사용
리트허브라는 크롬확장프로그램을 사용했다. 나는 이전에 '솔브커밋'이라는 확장프로그램을 통해 자동으로 리트코드의 풀이를 감지하여 내 깃허브 레포지토리에 푸쉬하는 프로젝트를 수행한 적이 있었다.
https://okane-on-cliff.tistory.com/309
즉 노하우가 있었는데 왜 외부 확장프로그램을 사용했는가?
나는 솔브커밋의 계속적인 업데이트를 할 생각은 크게 없다. 애초에 솔브커밋은 백준, 프로그래머스, 리트코드의 돔트리를 분석하여 풀이 여부를 분석한다. 즉 해당 코테 연습 사이트가 UI를 변경하여 돔트리가 바뀌면 이에 대응하는 업데이트가 필수라는소리이다. 나는 이게 불만이었다.
그래서 이를 계속적으로 업데이트 하는 다른 외부 확장프로그램의 도움을 받기로 하였다.
https://chromewebstore.google.com/detail/leethub-v3/kdkgpjpenaeoodajljkflmlnkoihkmda
리트허브와 싱크한 레포지토리의 웹훅설정
리트허브가 내 깃허브 레포지토리에 푸쉬를 발생시키면 푸쉬를 트리거로 하는 웹후크를 만들 수 있다. 이것이 내가 바란 상황이다.
리트허브의 풀이감지, 레포지토리 푸쉬 <= 리트허브의 역할
레포지토리 푸쉬를 트리거로 지정된 엔드포인트에 http요청 <= 웹훅의 역할
엔드포인트에서 일어나는 일
엔드 포인트에서는 웹후크에서 보내는 body를 분석하여 필요한 정보를 빼낸다.
1. 저자정보 : 저자의 이름을 찾아낸다.
2. 풀이한 문제 : 풀이한 문제 이름을 알아낸다.
3. 수정, 추가 여부 : 이 웹후크가 파일의 추가 혹은 수정을 일으켜 발생된 것인지 알아낸다.
파일의 수정, 추가가 없었다면 요청은 그냥 흘려보낸다. 풀이한 문제를 통해 노션 데이터베이스에서 이 문제에 해당하는 page(행)의 page_id를 알아낸다. 알아낸 page_id에서 저자이름에 해당하는 property의 값을 수정하는 notion api를 호출함으로서 자동으로 데이터 베이스를 수정한다.
사용한 노션 api
1) 노션 데이터베이스의 정보를 모두 가져오는 api는 다음과 같다.
https://developers.notion.com/reference/post-database-query
웹후크에서 보낸 문제 제목과 일치하는 page의 page_id를 찾기위해 사용함. body에 적는 쿼리는 뭔소린지 이해 못하겠어서 전부 불러와서 스프링 부트에서 해당하는 page_id를 찾음
database_id를 찾는 방법은
https://developers.notion.com/reference/retrieve-a-database
여기에 적혀있다.
2) 찾아낸 page_id를 바탕으로 데이터베이스의 내용을 수정하는 api
https://developers.notion.com/reference/patch-page
그냥 따라서 하면된다.
매일 일어나는 데일리 퀘스천의 업데이트
@Scheduled(cron= " ~~ ")을 이용했다. gpt에서 설명을 잘해준다. 그리고 메서드에 이 어노테이션을 사용하려면 class에 @EnableScheduling를 붙혀 줘야 된다.
여기서 한번 더 데이터 베이스에 페이지를 추가하는 notion api가 필요하다
https://developers.notion.com/reference/post-page
하라는 대로 하면 됨
패치노트
24-05-31
leetcode api가 만들어내는 제목과 leethub가 만들어내는 제목이 다른 경우 업로드가 되지 않는 상황 패치
문제 번호가 4자리가 아닌경우 leetcode api는 3자리 숫자를 문제번호로 적지만 leethub는 앞에 0을 채워 기어코 4자리 숫자를 만든다 이로인한 제목 미스매치로 제목이 일치하는 페이지를 찾지 못하는 오류였다. 그냥 5번정도 앞에 0을 채워 주는 방식으로 수정했다