디붕이네 공장은 실시간 최저가를 기반으로 계산하여 창출 가능한 최대 수익 방향을 제시해주는 사이트입니다. 실시간 최저가 검색은 이 프로젝트의 핵심 기능 중 하나입니다.
Spring으로 이식 및 기능을 개선하면서 Selenium으로 크롤링 하던 방식에서, OpenApi를 통한 가격 정보 검색 방식으로 전환 하였습니다.
기존 Selenium 방식에서 원하는 데이터를 화면에 도출해내는 과정이 매우 복잡했었고, 덕분에 Sleep 과정이 너무 많이 들어갔습니다. OpenApi를 활용하여 이를 해결하고자 하였습니다.
로스트아크 OpenApi 측에서 설정한 리미트가 존재하였습니다. 리미트는 1분에 100 Access 였습니다. 개인이 운영하는 사이트에서 1분에 100 Access면 충분해 보이지만, 문제는 최저가 검색 1번에 3번의 Access를 필요로 한다는 것입니다.
최저가 검색을 시작하면, Redis Data가 존재하는지 먼저 확인합니다. 있다면 Redis Data를 그대로 출력하고, 없으면 OpenApi를 통해 최저가를 검색한 후 그 데이터를 Redis에 3초의 짧은 TTL의 데이터로 저장합니다.
첫번째 빨간 박스는 최저가 검색의 경우 '융화' 라는 키워드는 검색하지 않아도 되기 때문에, continue로 빼준 모습입니다. 이를 통해 한번 검색에 4회에서 3회로 줄일 수 있었습니다.
두번째 빨간 박스는 Access 횟수를 최대한 줄이기 위해 커다란 Category라는 항목으로 검색하여 나온 데이터들 중 원하는 데이터만 고르는 과정입니다. (큰 범위로 검색했지만 데이터는 페이지 구분이 되어있어, 10개의 데이터 중 고르면 됩니다.)
Open Api Server에 보내는 BodyDto 입니다. CategoryCode는 필수 항목입니다.
ItemName의 '융화'는 데이터를 좁히기 위해 사용했습니다.
필요한 item인지를 체크합니다. 좀더 search에 용이한 Hash를 사용하였고, 그 item의 Category도 필요하여 HashMap으로 만들었습니다. 나름 자료구조를 생각해서 만들어봤는데, 맞는 방향이었으면 좋겠습니다.
기존 : 약 2초. (전날 평균가는 약 5초).
변경 : 약 0.5초. (Redis Data는 거의 즉시.)
감사하게도 배포 첫날 조회수 1320을 달성할 수 있었는데, 다행히도 사고 없이 기능이 잘 수행되었습니다. Redis Data도 잘 수행되고 있는 모습을 볼 수 있었습니다.
또한 RDS 요금을 관리하고자 Keyword에 Enum을 적극 활용하였는데, 덕분인지 원래 안넘는 범위인지는 모르겠지만 무료 범위를 초과하지 않게 이용하는 것에 성공하였습니다.