실시간 최저가 검색

신경연·2023년 5월 23일
0

Project_디붕

목록 보기
5/8

실시간 최저가 검색

디붕이네 공장은 실시간 최저가를 기반으로 계산하여 창출 가능한 최대 수익 방향을 제시해주는 사이트입니다. 실시간 최저가 검색은 이 프로젝트의 핵심 기능 중 하나입니다.
Spring으로 이식 및 기능을 개선하면서 Selenium으로 크롤링 하던 방식에서, OpenApi를 통한 가격 정보 검색 방식으로 전환 하였습니다.

디붕이네 공장

1. 기대 효과

기대효과는 물론 속도였습니다.

기존 Selenium 방식에서 원하는 데이터를 화면에 도출해내는 과정이 매우 복잡했었고, 덕분에 Sleep 과정이 너무 많이 들어갔습니다. OpenApi를 활용하여 이를 해결하고자 하였습니다.

2. 해결 과제

로스트아크 OpenApi 측에서 설정한 리미트가 존재하였습니다. 리미트는 1분에 100 Access 였습니다. 개인이 운영하는 사이트에서 1분에 100 Access면 충분해 보이지만, 문제는 최저가 검색 1번에 3번의 Access를 필요로 한다는 것입니다.

저는 이 문제를 Redis의 TTL을 활용한 일시적 캐싱을 통해, 고트래픽 상황에서의 OpenApi 접근 속도를 제한함으로써 해결을 시도했습니다.

3. 코드

1) Redis Data Check

최저가 검색을 시작하면, Redis Data가 존재하는지 먼저 확인합니다. 있다면 Redis Data를 그대로 출력하고, 없으면 OpenApi를 통해 최저가를 검색한 후 그 데이터를 Redis에 3초의 짧은 TTL의 데이터로 저장합니다.

최대 분당 Access 횟수 : 3 * 60s/3s + 4(전날 평균가 검색) = 64회

2) Open Api

첫번째 빨간 박스는 최저가 검색의 경우 '융화' 라는 키워드는 검색하지 않아도 되기 때문에, continue로 빼준 모습입니다. 이를 통해 한번 검색에 4회에서 3회로 줄일 수 있었습니다.

두번째 빨간 박스는 Access 횟수를 최대한 줄이기 위해 커다란 Category라는 항목으로 검색하여 나온 데이터들 중 원하는 데이터만 고르는 과정입니다. (큰 범위로 검색했지만 데이터는 페이지 구분이 되어있어, 10개의 데이터 중 고르면 됩니다.)

3) Body, Keyword

Open Api Server에 보내는 BodyDto 입니다. CategoryCode는 필수 항목입니다.
ItemName의 '융화'는 데이터를 좁히기 위해 사용했습니다.

4) Item Checker

필요한 item인지를 체크합니다. 좀더 search에 용이한 Hash를 사용하였고, 그 item의 Category도 필요하여 HashMap으로 만들었습니다. 나름 자료구조를 생각해서 만들어봤는데, 맞는 방향이었으면 좋겠습니다.

4. 결과

Selenium에서 OpenApi로 바꾸면서 속도가 대폭 향상 되었습니다.

기존 : 약 2초. (전날 평균가는 약 5초).
변경 : 약 0.5초. (Redis Data는 거의 즉시.)

5. 마치며

감사하게도 배포 첫날 조회수 1320을 달성할 수 있었는데, 다행히도 사고 없이 기능이 잘 수행되었습니다. Redis Data도 잘 수행되고 있는 모습을 볼 수 있었습니다.
또한 RDS 요금을 관리하고자 Keyword에 Enum을 적극 활용하였는데, 덕분인지 원래 안넘는 범위인지는 모르겠지만 무료 범위를 초과하지 않게 이용하는 것에 성공하였습니다.

profile
반갑습니다

0개의 댓글