본문 바로가기
개발 공부 중!/KNU 공지사항 알림봇 제작기

[카카오 챗봇] 간단한 대학 공지사항 알리미 제작하기 (feat. 끝나지 않는 버그 리포트)

by 김evelyn 2024. 2. 5.

👋 개요

 

대학 생활에서 공지사항을 놓치지 않는 것은 꽤나 중요하다. 취업에 도움 되거나, 학교 생활에 도움 되는 활동들이 업로드되기 때문이다. 특히나 우리 학교는 공지사항에 비교과 프로그램이나 긴급 점검 등에 대한 정보가 업로드된다. 비교과 프로그램의 경우에는 선착순으로 신청을 받는 활동도 있기 때문에 신속한 확인이 필수적이다. 하지만 시도 때도 없이 홈페이지에 들어가 오늘 무슨 공지가 새로 떴는지 확인하기란 쉽지 않다. 

 

그래서 누구나 손쉽게 강원대학교의 공지사항을 확인할 수 있도록 하고 싶어 카카오 챗봇을 제작하게 되었다. 마침 2주 전에 AWS 클라우드 해커톤도 다녀와서 AWS Lambda를 내 프로젝트에 적용해보고 싶기도 했다.

 


🧐 어떻게 만들까...

 

프로젝트 시작 전, 플랫폼에 대한 고민이 많았다. Java를 사용해 카카오 챗봇을 개발하고 싶지만, 인터넷에는 Java로 제작된 카카오 챗봇에 관한 정보가 많지 않았기 때문이다. 다른 플랫폼으로는 슬랙, 디스코드, 텔레그램 등이 있었으나, 접근성 측면에서 카카오톡이 가장 적합하다고 판단했다. 애초에 접근성에 대한 고민으로부터 기획을 했으니까.

 

이번 프로젝트를 통해, 지금까지 프로젝트에서 사용해 온 Python이 아닌 Java로 프로젝트를 진행해보고자 했다. AWS Lambda 함수를 Java로 작성하려면 JAR 또는 ZIP 파일로 코드를 업로드해야 한다. (현재 코드 편집기는 Node.js와 Python만 지원한다.) 이런 번거로움에도 Java를 사용하겠다는 열정으로(...) 제작했다. 

 

데이터 크롤링에는 Jsoup이라는 Java 기반의 HTML 파서를 사용했다. Jsoup의 사용법과 기능에 대해서는 이미 너무나도 잘 정리된 글이 있어 첨부한다. 

 

https://compmath.korea.ac.kr/indust/WebCrawl.html

 

웹 크롤링 — Java documentation

Docs » 웹 크롤링 View page source 웹 크롤링 웹 페이지에 있는 필요한 정보들을 사용할 수 있습니다. jsoup jsoup은 java에서 사용할 수 있는 html parser 패키지입니다. 설치 및 라이브러리 추가 jsoup 사이트

compmath.korea.ac.kr


🔍 제작 중 마주친 문제들

 

❓ 1. Java 코드로 Lambda 함수 제작하기!

 

이번에 공식 문서의 중요성을 새삼 깨닫게 되었다. 지금까지 무언가를 개발할 때 우선순위가 바뀌어있었음을 알게 되었다. 공식 문서를 읽고 난 후 구글링을 통해 이후 에러들을 해결해야 한다. 입력 형태와 출력 형태에서 계속 오류가 생겨 근본적인 원인을 찾기 위해 공식문서를 읽었고 바로 해결책을 찾을 수 있었다.

나의 경우는 일단 OpenJDK 기반의 Java17 coretto를 사용하지 않았었고, 파라미터 형태가 문제였다. AWS의 Java 17으로 만드는 Lambda 함수 공식문서를 보니 빠르게 제작할 수 있었다. 아래는 해당 공식문서이다.

 

https://docs.aws.amazon.com/lambda/latest/dg/java-handler.html

 

AWS Lambda function handler in Java - AWS Lambda

AWS Lambda function handler in Java The Lambda function handler is the method in your function code that processes events. When your function is invoked, Lambda runs the handler method. Your function runs until the handler returns a response, exits, or tim

docs.aws.amazon.com


❓ 2. Lambda와 카카오 챗봇 스킬 연결하기

 

이상하게도 챗봇에서 API를 호출할 때마다 'Internal Server Error'가 발생했다. 3~4시간 동안 애를 먹었는데 원인은 카카오톡에서 제시한 JSON 형태로 만들지 않았기 때문이었다. 카카오 챗봇을 제작할 때에는 꼭 카카오톡에서 제공한 챗봇 응답 타입별 JSON 포맷을 확인하고 코드를 짜야한다. (가이드라인을 정말 잘 살펴보아야 한다는 배움을 다시 한번..)

 

JSON 포맷에 생각보다 다양한 말풍선 구성이 있어서 고를 때 신났었던 기억이..🙂


❓ 3. 카카오 채널 Event API는 한 건당 15원!?

 

Event API란 챗봇이 사용자의 입력 없이도 스스로 대화를 시작할 수 있도록 도와주는 기능이다. 처음에는 이 기능을 이용해 평일 20시에 그날 업로드된 공지사항을 자동으로 전송하는 챗봇을 개발하려 했다. 그러나 사용자의 입력 없이 메시지를 전송하는 데에는 건당 15원의 비용이 든다는 사실을 확인하고.. 살포시 포기했다. 나만 사용한다면 괜찮은 비용이지만 다른 학우들도 사용했으면 좋겠다는 마음에 제작한 거라 통장을 지키기 위해.. 어쩔 수 없이 사용자의 입력을 받을 수밖에 없었다. 

 

그래서 최대한 깔끔하게 공지사항을 전달하고 싶어서 버튼으로 제작했다. 버튼을 누르면 오늘의 공지사항을 확인할 수 있도록 했다. 


❓ 4. 왜 3개밖에 안 보내지지?

 

저 위의 모든 과정들을 마무리하고 챗봇을 테스트하는데 총 5개가 나와야 할 공지사항 중 3개만 전송되었다. 이유를 찾아보니 아래와 같았다.

그렇다.. 최대 3개까지가 한계였다.

 

케로셀 형태는 10개까지 가능하다니까 케로셀 형태로 코드를 수정해 다시 업로드했다. 캐로셀 형태란 아래와 같이 옆으로 넘어가는 형태의 메시지를 말한다.

 

케로셀 형태 예시


❓ 5. 이젠 중복 공지사항이 문제다!

 

우리 학교의 공지사항 글은 [공지]와 [일반]으로 나뉜다. 중요한 소식을 공지로 고정시켜 놓는 것인데 공지로 업로드하려면 일반으로도 올리고 공지로도 올려야 한다. 즉, [공지]로 올라오는 게시물은 [일반]에도 존재하기 때문에 내 챗봇에 두 번 전달되는 것..! 결론적으로 set를 이용해서 중복이 일어나지 않도록 했다. 


💻 결과물

 

 

아래 '오늘의 공지사항 알아보기' 버튼을 클릭하면 오늘 업로드된 공지사항을 확인할 수 있다. 

 

1. 공지사항이 있다면?

 - 케로셀 형태로 공지사항이 전달된다. 메시지의 '공지사항 보러가기' 버튼을 클릭하면 해당 공지사항 링크로 접속할 수 있다. 

 

2. 공지사항이 없다면?

 - '아직 [오늘 날짜] 공지사항이 업로드되지 않았습니다.'라는 메시지가 출력된다. 

 

만약 버튼을 누르지 않고 별도의 채팅을 입력하면 '현재 공지사항 전달 기능만을 제공하고 있습니다.'라는 폴백 메시지가 전송된다.


 

위 채팅방은 01.31 ~ 02.02 까지의 내역이다.

01.31 공지사항 5개
02.01 공지사항 0개
02.02 공지사항 1개

 


🎊 소감

 

사실 나는 매일 공지사항에 들어가 새롭게 올라온 글을 확인하는 편이다. 학교에는 좋은 비교과 프로그램들이 많고, 홍보가 부족한 경우가 많다. 근데 2월 첫째 주에 3박 4일 여행을 가게 되었다. 여행 중에 공지사항 홈페이지를 시도 때도 없이 방문하기란 어렵고.. 그렇다고 좋은 소식을 놓치고 싶지는 않고.. 그래서 여행 가기 전, 제작하게 되었다. 물론 앞으로도 훨씬 편하게 공지사항을 확인할 수 있으니 좋다. AWS 해커톤 다녀와서 강의에서 얻은 Lambda로 프로젝트를 진행하게 되어 너무 즐거웠다.

 

다음에 시간이 된다면 학식봇도 제작해보고 싶다. 이제 일주일 간 혼자서의 테스트 기간을 마쳤으니 에타에 조그마한 홍보를 해야겠다!

아래는 챗봇 깃허브 레포지토리이다. 리드미 파일에 파일 설명도 첨부해 두었다. 🙌

 

https://github.com/EvelynKimm/KNUNoticeBot

 

GitHub - EvelynKimm/KNUNoticeBot: 💻 KNU 공지사항을 전달해주는 카카오 챗봇

💻 KNU 공지사항을 전달해주는 카카오 챗봇. Contribute to EvelynKimm/KNUNoticeBot development by creating an account on GitHub.

github.com

 


🚨 24.02.08 타임아웃 오류

2월 8일 오후 22시에 Timeout 오류가 났다.

CloudWatch에서 확인한 에러 로그..🤦‍♀️

 

일단 타임아웃 오류에 대한 챗봇의 폴백 메시지가 없었기 때문에 예외를 후다닥 추가하고, 코드를 이것저것 봤다. '왜 오늘 낮까지도 잘 됐는데 갑자기 안 되는 거지?' 생각하며 원인을 분석하고 있었는데..

뭔가.. 바뀐것같다..?

 

학교가 입시 시즌을 맞아 서브도메인을 변경한 것이다. wwwk -> wwwn으로 변경되었다. 허무하지만 timeout 에러 해결 완료..!

해결 완료❗️

 


🚨 24.03.15 인증서(SSL) 오류

아래 링크를 통해 해결과정을 살펴볼 수 있습니다.

 

[버그 리포트] 인증서(SSL) 오류

🚨 24.03.15 인증서(SSL) 오류 AWS free tier Lambda가 제공하는 request가 1,000,000개 임을 알게 되었다. 초반에 홍보를 크게 하지 않아 사용자가 12명 정도였다. 2월 한 달간 내역을 확인하니, 총 request가 100

been-coding9.tistory.com

 


🚨 24.03.19 타임아웃 오류

아래 링크를 통해 해결과정을 살펴볼 수 있습니다.

 

[버그 리포트] 동기 작업의 성능 저하로 인한 타임아웃 오류

🚨 24.03.19 타임아웃 오류 ❓ 응답이 안 와요... 원래 처음 챗봇을 만들고 나서도 20번에 한 번 꼴로 버튼을 눌렀음에도 아무런 응답이 없는 오류가 있었다. 관리자 센터에 들어가 확인을 해봐도 JS

been-coding9.tistory.com