나같은 흔한 취준생들은 포폴을 채우기 위해 사이드 프로젝트 커뮤니티를 하루에도 여러번씩 들어가서 할 만한 프로젝트가 있는지 없는지 찾고있을 것이다.
대표적인 사이트로 인프런과 hola가 있을텐데, 이게 또 지원하는 속도도 중요하다. 분명 2시간 전에 올라온 모집공고인데 연락을 드려보니 이미 뽑았다는 답변을 들은게 여러번.. 그렇다고 안그래도 지금 하루에 3번씩은 들어가고 있는데 하루종일 모니터링 할 수는 없는 노릇이었다.
그래서 나와 같은 사람들이 있지 않을까? 싶어 새로운 인원 모집 공고가 뜨면 이메일로 알림을 보내주는 서비스를 월 서버비 0원, 서버리스 아키텍처로 만들어보았다.
사이트 링크: https://github.com/project-notification/readme
위 사이트에 들어가보면 사이트 홈페이지가 아니라 웬 github 레포지토리가 뜰 텐데, 이 서비스는 홈페이지가 없다.
단순히 구독을 하기 위해선 Issue를 만들기만 하면 끝이다.
이슈 생성을 눌러보면 밑에 사진과 같이 미리 만들어진 Issue Form이 있다.
해당 이슈 폼을 눌러보자
알림을 받을 이메일과 주제만 선택하고 이슈를 등록하면 자동화된 프로세스로 구독신청이 완료된다.
참고로 아무 주제도 선택하지 않으면, inflearn과 hola에 등록되는 모든 프로젝트 구인글을 이메일로 받아볼 수 있다.
또, 주제를 어떤 알고리즘으로 분류할지 고민이 많았는데 아래 작동원리 파트에서 자세히 다루겠지만 대충 LLM API를 사용했다.
이슈를 등록하고, 구독 신청 프로세스가 정상적으로 완료된다면 Github Bot의 댓글을 볼 수 있다.
댓글에도 나와 있듯 구독정보를 수정하고 싶다면 Issue를 수정, 구독을 더이상 받고싶지 않다면 Issue를 닫기만 하면 끝이다.
(다만 이메일을 수정하고 싶다면,, Issue를 한 번 닫아서 구독취소를 한 후, 이메일을 수정한 상태로 다시 reopen 해야한다.)
이러면 한 시간에 한 번씩, 서비스가 인프런과 hola를 탐색해 새로운 글이 있다면 분석하고, 다음과 같이 이메일 알림을 받아볼 수 있다.
이제 내가 외출중이라 할지라도, 휴대폰으로 오는 메일을 통해 프로젝트 모집 공고를 열람할 수 있다.
이 서비스에 웹 프론트는 따로 없다. 단지 Github를 활용했을 뿐이다. UX적으로 웹 프론트를 따로 만드는게 편하지 않나? 라고 생각할 수 있지만, 웹 프론트를 따로 둔다면 구독절차가 위에 소개한 방식보다 더 복잡해져야만 한다. 예를 들어, 이메일 본인 인증 프로세스가 없다면 내 이메일이 아닌데도 아무렇게나 등록 할 빌런들이 있기 때문에. (하지만 단점으로 Github를 쓰지 않는 기획자나 마케터, 디자이너 분들은 사용하기 어려운 서비스이긴 하다.)
또한, 기존에 본적 없던 형식의 서비스라 사용자들도 재미삼아 사용할 것 같아 사용자를 모으기 더 유리할 것 같았다.
먼저 Issue Form은 Github Issue Template 에 잘설명이 되어있어 따라 만들었다.
Issue가 등록되었을 때의 동작은 Github Action과 shell script 조합으로 구성되어 있고, AWS API Gateway & Lambda 조합으로 구성된 api를 호출해 dynamodb 에 구독정보가 저장된 후, 정상 등록되었을 때 github bot이 댓글을 달아준다.
구독 파트 Lambda 코드
https://github.com/project-notification/subscribe
구독 해제 Lambda 코드
https://github.com/project-notification/unsubscribe
현재 사이드 프로젝트 커뮤니티는 inflearn과 hola가 거의 90퍼센트 이상을 차지하고 있다.
그래서 두 사이트 모두 데이터를 수집해야 하는데 inflearn은 프로젝트 리스트 페이지가 SSR로 되어 있어 html 문서를 파싱하면 된다. 그런데 hola는 SPA 방식이라 단순 html 문서 파싱으론 안되고 브라우저가 내재된 크롤링 라이브러리를 사용하는 방법을 생각했지만 lambda에 올리기엔 용량이 다소 클 것이라고 생각했다.
그래서 hola를 뜯어보던 중 api를 요청하던 부분을 로컬에서 그냥 실행해봤더니 정상작동하길래 그걸 그대로 가져다 썼다. (써도 되냐고 메일 넣었더니 흔쾌히 허락해주셨다.)
이제 수집한 프로젝트 구인 공고에 대해 topic을 분류해야 했다. 글의 제목과 태그를 소스로 사용해 안드로이드, react, ios, 웹 등등은 프론트로 분류, spring, nestjs 등등은 백엔드. 이런식으로 topic을 분류해야 했는데 단순 문자열 비교로는 예외 케이스가 너무나도 많았다. 그래서 이 부분은 LLM API를 사용하기로 했고 GPT와 Claude를 비교해 성능과 가격 모두 우위에 있는 Claude AI를 선택했다.
정보 수집 및 topic 분류 Lambda 코드
https://github.com/project-notification/reserve
이제 분류된 topic에 따라 이메일을 보내야 하는데 메일을 보내는 서비스는 AWS SES를 사용하고 있다.
다만 SES는 초당 이메일 발송 횟수가 제한되어 있어 사용자가 많아지면 알림을 받지 못하는 사용자가 늘어날 것이 분명했다.
따라서 메일 리스트를 SQS에 먼저 적재 후, SQS에 데이터가 들어옴에 따라 메일 발송용 Lambda가 트리거 되는 식으로 메일 발송 프로세스를 분리시켰다.
이메일 발송 예약 Lambda 코드
https://github.com/project-notification/reserve
메일 발송은 SQS API 문서를 보며 html 태그를 조합해 메일을 보내고 있다.
메일 발송 Lambda 코드
https://github.com/project-notification/send-email
우와 지린당 잘 쓸게요 !!!