일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Python3
- 인프런
- 인프런오리지널
- SwiftUI
- 인프런파이썬
- 유학토플
- 웹크롤링
- 파이썬중급강의
- 우리를위한프로그래밍
- 파이썬
- 파이썬웹크롤링
- 카카오톡채팅봇
- 자바스크립트
- 교환학생토플
- IOS프로그래밍
- 노드JS
- 인프런파이썬강의
- JS
- 스위프트
- 인프런강의
- rxswift
- swift
- nodeJS
- IOS
- 리프2기
- 토플공부수기
- uikit
- 파이썬중급
- 토플
- 프로그래머스
- Today
- Total
먹고 기도하고 코딩하라
덕성여대 카카오톡 학식봇 개발 1년맞이 회고 본문
발단 (챗봇 강의 수강)
발단은 작년 1학기 종강 직후인 6월 말쯤 한 고등학생 개발자 분의 카톡 플러스친구 채팅봇 만들기 강의였다.
주말 알바 하루를 빼고 다른 학교에 다니는 친구랑 같이 그 강의를 들으러 갔다. 그 분은 php를 주력 언어로 사용해서 카카오톡 챗봇을 개발했고 닷홈으로 서버 호스팅을 하고 계셨다. php는 한 번도 써본 적 없었지만 부지런히 강의 자료를 보며 챗봇을 만들었다. 하지만 닷홈에서 뭔가 막아놔서 실제로 써볼 수는 없었던 걸로 기억한다(확실하진 않다).
여튼 그 날 강의를 다 듣고 친구와 저녁을 먹고 헤어진 다음 집에 돌아와서 자료를 더 찾아봤다. 제일 기본적인 건 카카오 github 문서에 남아있어서 찾아볼 수 있었고 학식봇 아니더라도 다른 자동응답 채팅봇을 구현하신 분들의 글을 보며 이렇게 하는거구먼 싶었다.
마침 우리 학교에는 카카오톡 학식 채팅봇이 없었으며 처음 시도하기에는 이게 사용자 수 면에서나 활용도 면에서나 좋다고 생각해서 개발을 시작했다.
전개 (언어와 웹 프레임워크 선택, 서버 구현 단계)
일단 카카오 플러스친구를 만들어야 한다.
문제는 내가 챗봇을 처음 개발하던 2018년 7월 당시에는 플러스친구를 만드는 데에 아무 제약이 없었지만 지금은 막혔다는 사실이다. i챗봇인가 뭔가로 바뀐다는데 나는 아직 안 바꾸고 그대로 하던 대로 챗봇을 돌리고 있다. 그나마 있던 API를 이용한 챗봇도 올해 12월 31일로 종료된다. 이 글의 메시지는 "여러분도 만들어보세요"보다는 "내가 이렇게 했었다"가 더 알맞다는 고백을 미리 해야겠다. 그래도 누군가는 예전에 만들어두고 묵혀둔 플러스친구로 실습을 해볼 수도 있다는 생각이 들어 고생한 경험을 곁들여 글을 쓰겠다.
(+ 2020. 04. 26 추가 : 파이썬 장고로 카카오 i 오픈빌더 챗봇을 만드는 튜토리얼을 포스팅했습니다. 이 시리즈를 참고하시면 됩니다.)
뭔가 나도 할 수 있을 것 같다는 근자감이 들었지만 php를 써보지 않았기 때문에 조금이라도 익숙한 언어를 사용해서 채팅봇 서버를 구현하고 싶었다. 마침 1학기에 python(이하 파이썬) 프로그래밍을 수강했기 때문에 파이썬으로 해보기로 했다.
파이썬을 이용해 서버 쪽을 꾸리려면 2가지 웹 프레임워크(Flask와 Django) 중 하나를 사용할 수 있다. 둘의 장단점은 잘 몰랐지만 방학이 끝나고 의욕에 가득 차서 그 당시 보면서 공부하던 게 AskDjango님의 장고걸스 튜토리얼이었다. 조금이라도 더 잘 아는 걸 쓰는 게 좋겠다는 생각에 Django를 쓰기로 결심했다.
기본적으로 서버-클라이언트 구조에서 서버 컴퓨터는 언제나 대기하고 있어야 한다. 내일 먹을 밥은 언제든지 궁금해질 수 있기 때문에 사용자가 언제 요청하더라도 답변할 수 있도록 서버가 항상 켜져 있어야 한다. 방법은 포트포워딩(참고)이나 서버를 대여하거나 사서 쓰는 방법(닷홈, Amazon EC2, Azure 등)이 있다. 이 중 나는 아마존 웹서비스(AWS)를 이용하기로 했는데 이유는 1년 동안 무료로 사용할 수 있는 모델(t2.micro)이 있으며 비교적 쉽게 서버 구현이 가능하기 때문이다. 그리고 튜토리얼 자료도 많아 따라하기 쉬웠다.
학식 봇을 만들면서 처음 AWS를 이용해봤는데 이 블로그가 아주 큰 도움이 되었다. 이 분의 다른 글(2편)도 아주 도움이 되므로 읽어보시면 좋겠다. 1편에서 시키는대로만 하면 안전하게 인스턴스를 만들 수 있다.
[!]처음에 윈도우 인스턴스를 만들었다가 큰 삽질을 했다. 안 되는 건 아니지만 어차피 서버는 리눅스를 쓰는 게 제일 좋겠다.
CentOS, Debian, RedHat 등을 쓰실 줄 아신다면 쓰실 줄 아는 걸 고르시고 아니면 그냥 Ubuntu를 쓰는 게 좋다. Ubuntu도 18.04 LTS 버전이 있고 16.04 LTS 버전이 있는데 내 서버는 16.04이다. 난 당시 학교에 있는 UNIX 서버에 접근해본 게 CLI 환경에서 접근한 경험의 전부였으므로 약간 쫄렸지만 어차피 pwd, cd, mkdir, vi, cp, mv, rm 등의 간단한 명령어와 vi 편집기의 문법 조금만 알면 쓰기 편리하다.
모르는 건 그때그때 찾아보면 된다. 어차피 이 단계에서 그렇게 고급(?) 관리는 필요하지 않다(하지만 고급스럽고 안전하게 하려면 얼마든지 어렵게 할 수 있는 게 서버 관리라고 생각한다).
나는 집에 윈도우 데스크탑이 있고 2012년 mid 맥북 프로와 asus 비보북(윈도우)이 하나 있다. 데스크탑에서 작업할 때는 putty를 설치해 AWS에서 대여한 서버의 IP 주소를 받아 접근할 수 있지만 맥에서는 터미널에서 그냥 ssh로 접근할 수 있다. 보통 윈도우를 많이들 쓰시니 putty를 설치해서 쓰시면 된다. putty 사용 방법도 위의 블로그에 적혀 있다.
Windows 10에서는 마이크로소프트 샵에서 Ubuntu를 설치할 수 있게 되어 있다. 말인즉슨 putty를 사용하지 않아도 ssh로 접근이 가능하다는 뜻이다. 하지만 ssh 접근 하나 하자고 Ubuntu를 깔긴 좀 그렇고 리눅스 환경에서 작업할 일이 있으면 깔고 없으면 putty 설치해서 쓰는 게 더 편리하다.
putty에서 첫 접속에 성공하고 나면 그 설정을 save해두는 게 쉽게 접근하기 편하다. 뭐 이건 너무 당연한 얘기고 패스워드를 물어보는데 초기 패스워드는 ubuntu이다. 그러고 나면 진짜 접속을 하게 된다.
여기서 이 블로그를 다시 한 번 참고하게 된다. 서버 설정도 거의 이대로 하면 된다. 문제가 생긴다면 다시 이 글로 돌아와서 [!]가 붙은 문장들 중 동일한 문제를 다루는 것이 있는지 찾아보고 없으면 에러 메시지를 긁어서 구글에 검색하자.
참고로 서울 리전 된다. 나는 서울 리전에서 받아서 썼고 문제를 일으킨 적은 없다.
1. Python3를 설치한다(python3이 있어도 구 버전일 수 있으니 pip 업데이트 권장. 사실 python2만 아니면 됨).
2. 가상환경(virtualenv)를 설치한다. 그리고 앞으로 서버에 접속할 때는 설치가 됐든 뭐가 됐든 가상환경을 꼭 activate한 상태에서 하도록 한다. 가상환경은 여러 가지 설정을 저장해둔다.
3. Django를 설치한다(이 때 2.0 이상으로 설치할 것)
pip install django~=2.0.0
4. Apache2와 mod_wsgi를 설치한다.
5. Django 프로젝트, 앱을 생성한다.
(?)settings.py 에서 LANGUAGE_CODE = 'ko-kr'로 맞춰줘도 괜찮다. 기본은 'en-us'인데, 사실 어차피 한글 쓸 일 없으니 바꿀 필요 없지만 뭐 바꿔도 상관은 없다.
[!]wsgi.py와 000-default.conf 파일을 수정하는 것은 조금 복잡하고 주의력을 요구한다. 실제로 나는 처음에 문서를 열 수조차 없었고(000-default.conf) 겨우 찾아 열어 수정하고 나서는 It worked!를 볼 수 없었다. 이것 때문에 아주 골머리를 썩었다.
[!] apache 부분 설정 경로(000-default.conf 수정)는 다음과 같다.
/etc/apache2/sites-available/000-default.conf
글에서는 site-available 이라고 써 있지만 이렇게 쓰면 없는 경로라 파일에 접근할 수 없다. sites-available이 맞다. 직접 파일을 확인하고 싶다면 cd 명령어로 제일 루트 디렉토리까지 이동한 후 차근차근 하위로 접근해보길 바란다.
[!] 000-default.conf 수정할 때 2번 라인(첫 문장)을 다음과 같이 써야 한다. (한 줄임)
WSGIDaemonProcess project_name python-home=/home/ubuntu/mkdir_name/venv_name python-path=/home/ubuntu/mkdir_name/project_name
진하게 칠한 부분을 자기가 만든 폴더와 프로젝트, virtual env 이름으로 바꿔주면 된다. 예를 들면 mkdir_name의 경우 위의 블로거의 경우는 Django이고 project_name은 bot, venv_name은 myvenv이다.
[!]가끔 테스트를 해봤을 때 "해당 프로필의 자동응답 시스템이..." 하며 서버에 문제가 있다는 식으로(주로 500 코드와 함께) 에러 메시지를 뱉으며 구동이 안 될 때가 있다. 이 문제는 주로 views.py에 문제가 있는 것이다. (indent나 괄호 짝이 안 맞거나, 문법을 틀렸거나 없는 변수를 쓰는 등 사소해서 더 잡기 힘든 그런 문제들일 수 있음)
indent나 괄호 짝이 안 맞는 문제라면 차라리 편하다. views.py도 결국 파이썬 파일이기 때문에 output으로 어떤 파일을 만든다거나 하지는 않지만 python3 동작이 가능하다. 그러므로 원인모를 에러가 생긴다면 일단 python3 views.py를 해보자. 문법 에러는 여기서 잡을 수 있다.
일단 처음부터 크롤링 코드를 구현하지 말고 github 문서나 블로그의 1, 2 버튼 예제들 같은 가볍고 쉬운 것을 따라해서 작동 여부를 확인해서 정상 작동하면 그 때부터 구현할 것을 권한다. 크롤링은 최대한 따로 함수를 만들던가 어쨌든 모듈화를 해서 호출할 수 있는 형태로 구현하는 것이 좋다(def로 함수 구현!).
[!] 서버에 문제가 없고, 뭔가 변경하지도 않았는데 갑자기 서버 컴퓨터가 이상해져서 응답에 시간이 아주 오래 걸릴 때가 있다. 그럴 때는 우리가 늘 하는 말이 있다.
껐다 켜보세요
컴퓨터(와 어떤 영화 시리즈)를 구제할 수 있는 가장 쉬운 방법은 리부트다. 참고로 명령어는 'sudo reboot'이다.
(?) 뭔가 에러 메시지를 뱉으며 안 된다고 거부한다면, 오류 메시지를 복사해서 구글에 검색해보자. 아니면 앞에 'sudo'를 붙여 다시 해보자. 생각보다 많은 명령어가 sudo 권한 없이 안 된다.
sudo eat!
위기(순한맛) (자동응답 API에 맞게 구현, 크롤링하기)
카카오톡에서 제공하는 챗봇 구현에 필요한 API 문서는 여기에 있다. 다른 건 휙휙 넘기며 봐도 괜찮고, 5~6번을 주목해서 보면 된다. JSON 형식으로 구현하면 된다. 내가 설명하는 것보다 먼저 하신 다른 분들의 글을 보시는 게 더 좋을 것 같다.
그리고 이제 크롤링은 알아서 해결해야 할 몫인데... 솔직히 나의 많은 위기는 초기 서버 구현에서 맞았기 때문에 크롤링은 딱히 문제가 되지 않았다. 게다가 크롤링도 아주 기초적인 문법만 알면 홈페이지에서 원하는 데이터만 긁어올 수 있었기 때문에 편리했다.
selenium과 beautifulsoup4 중 하나를 쓸 수 있었는데, 당시 보던 책은 beautifulsoup4를 주로 다룬 책이었기 때문에 또 beautifulsoup4를 사용했다. 물론 언제나 같은 답을 하는 봇이라면 크롤링이 필요하지 않다. (오늘 기분 어때?-좋아! 오늘 기분 어때?-좋아! 오늘 기분 어때?-좋아!) 하지만 학식은 1주에 한 번씩 바뀌고 그 때마다 그 내용을 일일이 복사하는 것은 아주 귀찮은 일이며 '자동'이라는 타이틀이 아주 조금 민망해질 수도 있을 것이다.
beautifulsoup4를 사용한 크롤링 방법은 다른 포스팅에서 다시 적도록 하겠다. 일단은 내가 첫 시도에서 beautifulsoup4를 썼고 크롤링에 성공했다(3월에 홈페이지가 개편되면서 나는 selenium을 써야 하는 처지가 되었지만 어쨌든...). 나중에 크롤링 관련해서 내가 쓴 간단한 방법들을 따로 소개하겠다.
결말 (해피한 챗봇 구동)
그렇게 해서 나는 이틀에 걸쳐 크롤링까지 개발을 끝냈다. 그게 아마 7월 둘째 주인가 그쯤의 일이었다. 실제로 학식 봇을 처음 커뮤니티에 홍보한 것은 개강 1주일 전이었던 8월 셋째 주쯤이었다. 홍보를 한 번 돌리고 개강 전까지 300명 정도의 사용자가 있었고, 2학기 종강쯤엔 2000명 정도로 사용자가 늘었으며 지금은 약 3000명 정도 된다. 참 신기한 일이다.
하지만 3월에 홈페이지 개편으로 기존에 크롤링하던 코드에서 완전히 갈아엎히면서 크롤링 코드를 다시 짜야 하는 불편함이 있었고 또 카카오톡의 정책 변경으로 인해 i챗봇으로 곧 옮겨야 하는 어려움이 있다. 한창 방학이고 개인 공부 빼고는 그리 바쁘지 않은 때이니... 지금 미리미리 해놓는 게 좋을 것 같다는 생각이 든다.
챗봇 프로젝트는 내가 처음으로 한 개발다운 개발이었다. 이렇게 개발하고 보니 책으로 일단 달달 외우며 공부하거나 끝까지 보는 것도 좋지만, 일단 뛰어들고 보는 것도 아주 좋다는 생각이 들었다. 그 동안 개발 일지를 써야지 써야지 하다가 일기를 써둔 걸 바탕으로 짧은 회고록을 써봤다.
+추가
옮기는 오늘은 2019년 12월 17일이고 이 글을 최초 작성한 날은 2019년 9월 2일이다. 약 100일이 지났는데 딱히 진척이 없으며 i Developers를 신청하려면 기존의 API형 서비스를 종료해야 했기 때문에 학기중 개발이 불가능했다. 게다가 나도 토플 때문에 바쁘기도 했고 이러저러한 이유로 다시 짜는 걸 미뤄왔는데 어느덧 크리스마스를 앞둔 종강 시즌이다. 이번 주 지나면 i Developers 신청하고 승인되면 그때부터 다시 시작이다!
파이썬 Django로 카카오 i 오픈빌더 채팅봇 만들기 튜토리얼
Reference
카카오톡 자동응답 API 사용후기(1) - 옐로아이디 신청 및 AWS 서버 등록, 접속
카카오톡 자동응답 API 사용후기(2) - Django 및 apache 설치 및 연동, 자동응답 API 사용
플러스친구 github 플러스친구 자동응답 API README 문서
'개발일지' 카테고리의 다른 글
파이썬 장고로 카카오 i 오픈빌더 챗봇 만들기 (4) - 카카오 오픈빌더와 챗봇 서버 연동하기 (2) | 2020.03.01 |
---|---|
파이썬 장고로 카카오 i 오픈빌더 챗봇 만들기 (3) - 챗봇 자동답변 구현 (4) | 2020.02.25 |
파이썬 장고로 카카오 i 오픈빌더 챗봇 만들기 (2) - 프로젝트 셋팅: Apache2 + mod-wsgi로 Django 앱 배포 준비 (3) | 2020.02.24 |
파이썬 장고로 카카오 i 오픈빌더 챗봇 만들기 (1) - 가상환경 설정, Django 프로젝트와 앱 만들기 (11) | 2020.02.23 |
파이썬 장고 기반 카카오톡 API 챗봇 -> i 오픈빌더 챗봇으로 변경하기 (0) | 2020.02.21 |