기간 2024. 8. 19(월) - 9. 3(화)
블레이버스 해커톤을 해보니 단 기간에 몰입해서 서비스를 만드는 경험을 또 겪어보고 싶었다.
서비스를 만들면서 배우는 것이 많았고, 인프라를 구축하며 운영 및 유지보수를 하는 과정에서 얻는 인사이트가 정말 좋았다.
그래서, 블레이버스 해커톤이 끝나고서 바로 프라이머의 GenAI 해커톤에 참여했다.
해커톤에 참여하려면 먼저 팀 빌딩을 해야 했다. 블레이버스에서는 팀빌딩을 해줬는데, 여기선 내가 직접 해야했다.
방식은 아이디어를 올린 팀에 지원자들이 팀 지원을 하는 식이었다.
여러 팀에 지원을 해도 연락이 오지 않아서, 해커톤에 참여할 수 있을까? 싶었는데 운이 좋게도 두 개의 팀에서 답장을 주었다.
그 중 smerp라는 팀과 커피챗을 하며 서로 핏이 잘 맞는다는 생각에 합류를 하게 됐다.
팀 빌딩 이후로 팀원들과 직접 만나는 자리가 있었다. 이 팀은 프라이머 GenAI 해커톤에서 본 사업과 관련된 실험을 하려는 초기 창업팀이었다.
아이디어는 비상장 기업의 재무제표를 알려주는 생성형 AI였다. DART에서 제공하는 분기보고서와 네이버 기사들을 활용해서 비상장 기업의 재무 정보를 쉽게 알 수 있도록 해주는 서비스다.
재무쪽으로는 잘 몰랐지만 평소에도 배워보고 싶던 영역이다. 투자에 관심이 많았기 때문이다. 기업에 대한 재무 정보를 쉽게 알 수 있다면 사람들이 투자를 할 때 큰 도움을 얻을 수 있을 것이라고 생각했다.
게다가 비상장기업은 재무와 관련된 정보를 쉽게 알기 어렵다는 말을 몇번 들었던 터라 이 서비스에 대한 수요도 있을 것이라고 생각했다.
팀 구성원은 나 혼자만 백엔드였고 나머지 사람들은 모두 AI 엔지니어였다.
프라이머 GenAI 해커톤에서는 모두 생성형 AI를 활용해서 서비스를 만들어야 한다. 그래서, 백엔드 개발자보다는 AI 엔지니어가 할 일이 많다. 나 혼자서 백엔드 작업을 처리하는 데 무리는 없을 거라고 판단했다.
생각과는 다르게, 작업을 시작하려니 쉽지 않았다.
기획 의도는 정말 좋은데 어떤 데이터와 API를 사용해야할지 감이 잡히지 않았다.
DART에서 제공하는 API는 많은데... 우리에게 딱 필요한 뾰족한 데이터와 API는 없었다.
비상장 기업의 재무정보를 알려주려면 어떤 데이터가 필요하지?
도메인 지식이 없다보니 팀원들에게 계속 어떤 데이터가 필요한지 물어야 했다.
우선, 초반에는 DART를 비롯해서 여러 사이트에서 어떤 데이터를 제공하는지부터 확인해야 했다.
다행스럽게도 AI 엔지니어분 중에 백엔드 개발을 하셨던 분이 계셨다. 이분이 우리에게 필요한 데이터를 어떤 식으로 가져와야 할지 가이드라인을 주셨다.
DART에서는 비상장 기업의 재무제표 PDF 파일을 제공한다. 다운받을 수도 있다. 다운받을 때 URL에 접속하는데, 기업의 재무제표 분기보고서마다 URL을 내가 직접 만들면 됐다. 자바로 이 URL을 만들어서 접속하면 분기보고서를 다운받는 걸 자동화할 수 있었다.
다만, 문제는 URL을 만드는 과정이 상당히 복잡했다는 것이다.
우선, 10만개의 공시 기업 리스트를 활용해야 했다. 공시 정보를 반환하는 API에 이 10만개의 기업들을 모두 돌려보면서 기업의 '등록번호'를 가져와야 했다.
이 등록번호를 활용해서 기업들이 올린 공시 보고서 목록을 API로 받아올 수 있었다. 여기서 최신 분기 보고서나 감사 보고서를 찾아서, html 정보를 읽은 뒤 document_number와 보고서 등록일자를 일일이 크롤링해야 했다.
기능을 구현하기는 했다. 근데 문제가 있었다. DART에서 비정상적인 API 호출이나, URL을 통한 홈페이지 접속을 봇으로 인식하고 차단했다.
여기서 크게 당황했다... 그럼 데이터를 어떻게 가져와야하지? IP를 우회하라는 말도 들었지만 너무 어려워보였고, 우회적인 방식을 쓰는 게 문제가 될수도 있을 거 같았다.
차라리 API 호출이나 URL 접속량을 조절하자는 생각을 했다. 1분에 API를 100번 호출하면 IP가 차단되니 1분에 100번 이하로만 API를 호출하도록 했다.
다행이도 IP 차단이 되지 않았다.
다만, 또 다른 문제가 있었다. 속도가 너무 느렸다!!...
API 한번 호출하고 1초 쉬고, API 호출 100번당 1분씩 쉬었다.
5000개 기업을 돌리니 대략 2시간 정도가 걸렸다...
며칠 동안 데이터를 가져오는 작업만 해야 했다.
그래서, AWS EC2를 4개 사용해서 이 작업을 여러 서버에서 했다. 하루만에 끝낼 수 있을 것 같았다.
그렇게, AWS EC2 네 개를 돌리면서 뿌듯해 하고 있었는데
팀의 리더분이 공시 보고서를 쉽게 가져올 수 있는 방법을 찾으셨다.
DART 검색창에서 공시 보고서를 검색할 수 있었다. 여기서도 document_number와 보고서 등록일자를 받아올 수 있었다. 심지어 비상장 기업만 타깃으로 할 수 있었다.
개발자 도구에서 이 API의 URL와 요청 헤더를 뜯어보고서 오픈 API처럼 연결했다.
기업의 수가 10만개에서 500개로 줄었다 !
허탈하기도 했지만 API로 고생한 덕분에 API 사용법과 크롤링에 대해서도 많이 배웠다.
그리고, 개발에는 역시 도메인 지식이 중요하다는 것도 새로 배웠다. 백엔드 개발자로서 어떤 데이터를 저장하고, 반환해야할지를 판단하려면 중요한 건 도메인 지식인 거 같다.
기획팀과의 타협(?)도 중요하다는 걸 알게 됐다. 여러 기획팀과 작업을 하면서 느끼 건데, 만들려는 서비스와 실제로 그 서비스를 제공하기 위해 확보할 수 있는 데이터에는 큰 간격이 있을 수 있다.
필요한 데이터를 아예 찾지 못할 수도 있고, 데이터를 찾았는데 API를 쓰려면 돈을 내야할 수도 있고, 데이터가 있긴 한데 정제 작업에 시간을 상당히 많이 써야 할 때도 있다.
이런 상황에서 현실적인 타협안을 찾는 게 중요하다는 걸 알게 됐다. 개발자로서 가능한 것과 가능하지 않은 것을 명확하게 설명하고, 그걸 통해서 대안을 찾는 일을 이번 해커톤에서 경험할 수 있었다.
지금 스위프라는 프로그램을 통해서 사람들과 함께 서비스를 만들고 있다. 이런 서비스를 통해서 긴 호흡으로 공부를 하고, 여러 실험을 하면서 유지보수를 하는 것은 당연히 해야 할 과제다.
나는 이것과 더불어 해커톤을 통한 도전에서도 많은 걸 배우고 있다. 그래서, 앞으로도 틈틈이 해커톤에 참여하면서 도전을 할 것이다. 새로운 사람들로부터 새로운 아이디어를 얻고, 새로운 도전을 하는 것이 즐겁다. 다음번에는 2박 3일동안 진행되는 해커톤에 참가해서 몰입해보고 싶다!
사실 서비스가 너무 잘 나와서 수상을 할 수 있을 것이라고 생각했는데 아쉽게도 기회를 얻지 못했다ㅠㅠㅠ AI 엔지니어분들이 너무 작업을 잘 해주셔서...정말 잘 만들어져서 아쉬웠다 ㅎㅎㅎ
그래도 이후 계속 유지보수를 맡기로 해서 꾸준하게 작업을 할 계획이다!