라이언봇 개발일지[1편]

나는 어쩌다가 이런걸 만들게 되었는가…

강병욱
6 min readMar 4, 2017
이 글을 보는 시점에는 친구수가 더 늘어나있길 바라며….

작년 11월 쯤이었을거다. 우연한 계기로 예전에 함께 스타트업에서 일했던 직원을 오랜만에 만날 수 있었다. 서로 이야기를 나누던 중 카카오 플러스친구 자동응답 API에 대해 알게 되었는데, 그 분은 카카오 플러스친구 API를 이용하여 외국인들을 위한 병원 안내 서비스를 개발하고 있었다. 별도의 앱 설치 없이 카카오톡 친구추가로 바로 쓸 수 있다는 점, 그리고 빛의 속도로 바로바로 적절한 응답을 보여주는 게 너무 신기한 나머지 가슴이 뛸 지경이었다.(심지어 24시간 연중무휴다!) 운좋게도 그 분도 나와 같은 루비온레일즈 개발자였기에 여러모로 개발하는 데 도움을 많이 받을 수 있었다.

왜인지는 모르겠지만 우리학교 공식어플에는 학생식당 메뉴를 보여주는 기능이 없다. 브라우저를 통해 학교 홈페이지에 들어가거나 커뮤니티에 들어가야 겨우 볼 수 있다. 이럴수가, 학생증 바코드보다 더 중요한 학식메뉴가 없다니..! 나와 같은 생각을 하고 있을 학우들의 아우성이 들리는 듯 했다. 단순히 그날그날의 학생식당 메뉴를 보여주는 자동응답 챗봇을 만들어서 주변 친구들이 유용하게 써준다면 그것만으로 족할 것 같았다. 기말고사 시험기간이 다가오기 전에 빠르게 만들어야 했다. 바로 노트북을 켜고 플러스친구 API 도큐먼트를 살펴보았다.

카카오톡 플러스친구 API Github 페이지

플러스친구 API는 JSON을 이용해 요청과 응답이 이루어지므로 어떤 언어로든 개발이 가능하다. Node.js나 Flask, Django 등 이것저것 건드려 본 건 많지만 무엇보다도 나에게 친숙하고 경험이 많은 Ruby on rails(이하 레일즈)를 이용하여 개발을 시작했다. 필자가 멋쟁이사자처럼을 통해 레일즈로 웹개발을 시작했을 뿐만 아니라 레일즈만큼 쉽고 빠르게 웹 어플리케이션을 개발할 수 있는게 없기 때문이다. 웹개발을 처음 시작하는 분이라면 레일즈를 통해 웹 어플리케이션의 구조를 파악하고 다른 프레임워크에 도전해보는 것을 추천한다. 웹 서버는 아마존 EC2를, 데이터베이스는 MySQL을 이용하여 구축했다.

만들다 보니 욕심이 생겼다

학식 메뉴만 보여주는 건 구현하기 쉽고 간단하지만 사용자 입장에서 별로 재미가 없을 것 같았다. 방학만 되면 학교가 휑해지는 마당에 학기 중 말고는 별로 사용할 유인이 없었다. 실제로 사용 패턴을 확인해보니 평일 점심 저녁 시간에만 집중적으로 몰려있었고(그래봤자 사용자 50명도 안됬음…) 주말에는 아예 쓰지도 않았다. 어떻게하면 사용자가 꾸준히 사용할 수 있을지 고민에 고민을 거듭한 끝에 말을 걸면 어떤 말이라도 응답해줄 수 있는 챗봇을 만들어보기로 결심했다. 어떤 말이 되었건 간에 아무 의미 없는 말이나 욕을 해도 뭐라도 대답이 나오는 그런 챗봇.

그래 결심했어! 한국형 K-자비스를 만드는거야!

그래 챗봇을 만들기로 했다 치자. 어떻게 만들지? 우선 사용자의 발화의도를 파악하는 알고리즘을 짜야하고 형태소 분석, 머신러닝, 딥러닝 등 갖가지 최첨단 기술을 다 동원해야 할 것이다. 그리고 무엇보다도 내가 가진게 있어야 줄 수도 있는 건데 일단 텍스트 데이터가 하나도 없었다. 그리고 그 텍스트는 그냥 일반적인 텍스트가 아니라 질문-답변이 쌍으로 이루어져 있는 데이터여야 할 것이다. 갈 길이 멀지만 일단 뭐라도 텍스트 데이터를 쌓는 것을 최우선 목표로 삼았다.

가설1. 게시글의 제목과 댓글을 질문-답변 쌍으로 볼 수 있지 않을까?

커뮤니티 글을 보면 게시물 제목은 해당 게시물 내용이 한줄로 요약된 문장이고 거기에 달려있는 댓글은 그에 대한 반응이라고 볼 수 있다. 모든 경우에 다 적용할 수 있는 건 아니지만 그럴 가능성이 높아보였다.

보통 커뮤니티 글의 제목은 질문 형식을 띠는 경우가 많다
그리고 그에 대한 반응. 익명 반말 게시판인 만큼 다소 과격하다…

가설2. 학교 커뮤니티만큼 대학생의 언어를 배우기 좋은 곳은 없을 것이다

대학생들이 사용하는 공간인 만큼 관심사나 말투가 대학생과 가장 유사할 것이라 생각했다. 생각해보면 대학생 말투라는 게 따로 있나 싶기도 하지만 그때 당시에는 나름 고민을 많이 한 결과 도출해 낸 가설이었다. 대학생이 타겟이었던 만큼 최대한 대학생과 가장 닮은 텍스트를 얻고 싶었다. 그것도 아주 많이.

레일즈 개발자라면 한번쯤은 들어봤을 웹 크롤러 Nokogiri라는 것이 있다. 어떤 웹페이지라도 브라우저로 로딩할 수 있으면 원하는 위치의 내용을 다 파싱해올 수 있는 도구이다. 사이트마다 url 규칙이 있기 때문에 주소를 이용해 컨텐츠 페이지를 넘나들며 파싱해오는 것은 식은 죽 먹기다. 로그인을 하지 않으면 내용 자체를 볼 수가 없는 경우에는 세션을 유지한 채로 컨텐츠를 파싱할 수 있는 Capybara를 이용하면 된다.

가설을 통한 결론 :: 우리학교 커뮤니티를 털자!

그리하여 우리학교 커뮤니티의 게시물과 댓글을 전부다 가져오리라는 원대한 결심을 하기에 이르렀다. AWS 클라우드 서버를 구축하고 커뮤니티의 글을 가져오는 코드를 24시간 쉬지않고 돌렸다. 나의 데이터베이스에 소중한 텍스트들이 하나씩 쌓이는 걸 보니 이미 자비스라도 개발해 낸 기분이었다. 아직 본격적으로 시작도 안했는데 말이다.

익명 커뮤니티 텍스트 파싱은 합법일까? 불법일까?

하지만 이때까지만 해도 그것이 양날의 검이었다는 것을 깨닫지 못했다. 한편으로는 정말 정신나간 짓이었으며 또 한편으로는 라이언봇이 학교 안에서 유명해질 수 있었던 계기가 되었다. 500명이 넘는 유저들에게 공개 사과문을 보내게 될 줄은 꿈에도 몰랐다.

글을 마무리하며 (엥 벌써..?)

라이언봇이 페이스북 커뮤니티에 소개되면서 많은 피드백이 왔는데 그 중 하나가 개발일지 같은 것을 작성해달라는 것이었다. 글을 읽는 것만 좋아하고 실제로 써본 경험은 연애 편지와 레포트 작성이 전부였던 나로썬 다소 부담이 되지 않을까 싶었다. 하지만 펜은 기억보다 강하기에 글로 남겨도 좋겠다는 생각이 들어 낯설지만 글을 써보기 시작했다.

최대한 기술적인 부분은 제외하고 스토리 위주로 작성하려고 한다. 그리 대단한 기술이 사용된 것도 아닐 뿐더러 일단 뭐라도 만들고 부딪혀 보면 소소한 성과를 얻을 수 있다는 교훈을 공유하고 싶었을 뿐이다. 심지어 필자는 비전공자 출신이다. 특히 프로그래밍을 시작하려는 비전공자에게 희망이 되었으면 한다.

다음 편에서는 커뮤니티 컨텐츠 무단 도용으로 인한 해프닝, 그리고 아무것도 안하고 기말고사 공부하고 있었는데 플러스 친구가 일주일 만에 500명으로 늘어난 이야기를 써보려고 한다.

P.S: 라이언봇을 바로 사용해보고 싶으신 분은 라이언봇 친구추가 링크를 클릭해주세요. 별도의 앱 설치 없이 카톡으로 바로 이용 가능합니다.

--

--