코딩

라즈베리파이에서 카카오톡 챗봇 서버운영 (feat. Node.js)

GriffinDouble 2019. 11. 1. 03:46

이 글의 경우 정리를 목적으로 하는 글이오니 참고만 할뿐 지나치게 의존하지 말아 주시기 바랍니다. 


라즈베리파이3를 이용한 카카오톡 챗봇서버 (feat. Node.js)

 

저의 글은 친절하게 사진을 첨부하며 알려드리지는 않습니다. 정리하는 개념으로 작성하는것이기 때문에 대부분 글로 이루어져있을 것입니다. 이점을 꼭 유의해주시기 바랍니다.

 

그럼 이제 시작하도록 하겠습니다...!

 

필자는 현재 '아주대인마상'이라는 카카오톡 챗봇을 운영중에 있다.

(사실 챗봇 서버를 만든지는 좀 되었다. 올해 4월?정도에 만들어서 비인기리에 운영중이었다...ㅎㅎ)

 

여튼, 각설하고 챗봇을 만들기까지는 꽤나 많은 우여곡절이 있었다. 그런것들은 뒤로 제끼고 오직 라즈베리 파이를 이용한 운영 방식에 대해서만 설명할 예정이다. 

 

처음 서버 운영의 경우 클라우드를 이용해서 운영을 시작하였었다. 사실 개편했다.... ㄹㅇ 클라우드 짱...!!!

하지만, 비루한 학생이므로 클라우드 사용기간이 끝나버렸다... 고로, 집에 남아있던 나의 작고 소중한 라즈베리파이를 이용하여 웹서버를 돌리겠다는 방대한 꿈을 가지고 항상 머릿속에 생각만 하고 있었다.

그러다가 어느덧 6개월에 가까운 시간이 지나고 바쁘던 일상도 어느정도 정리되어 실행에 옮겨야 겠다는 생각을 하고 실행에 옮겼다.

 

일단, 준비사항으로는 크게 4가지 정도가 필요하다.

라즈베리파이, 서버로 사용할 코드, 공유기(또는 랜선), 지치지 않는 열정...!

이정도만 있으면 누구나 쉽게 따라 할 수 있을 것으로 생각이 든다.

 

라즈베리파이의 경우 이전에 사비를 들여 사서 프로젝트때 사고 남은 그대로 있던걸 사용했다. 그때 당시 구글의 TTS를 사용하느라 Node.js를 깔았었다. 그러므로 Node.js의 경우 설치가 되어있는 상태였다. (시간이 있다면 구글의 TTS를 사용해 봐라 신기하다.)

 

Node.js의 경우 기존에 만들어 놓은 서버가 있으므로 그것을 사용하였다. 하지만, 약간 버그가 있어서 수정을 하였다.

(사실 포스팅도 이전에 올리려 했지만, 미루다가 수정을 하면서 수정한 부분도 작성하면 좋을 것 같아서 지금 작성한다.)

 

공유기(또는 랜선) 이라고 적었지만 사실 와이파이로 연결했기때문에 유선랜을 사용했을때는 어떻게 해야하는지 잘 모르겠다.

처음에는 와이파이보다는 유선랜이 안정적일 것이라고 생각들어서 랜선을 구해서 사용할까 했지만, 난 가난하니.. 돈을 아낀다... 고로, 와이파이로 하였다. 이때 포트포워딩을 사용했다.

 

마지막으로 열정, 가장 중요하다. 거의 내가 한 과정에 대해서 서술하겠지만 모든이가 나의 글을 보고 만족스러운 답변을 얻으리라는 생각하지 않는다. 그러므로, 문제가 발생하였을때 이 열정으로 헤쳐나가기를 기도하는 바이다.

 

우선, 라즈베리파이에는 기본적으로 라즈비안을 설치를 해야한다. 이후, node.js를 터미널을 이용하여 설치해준다. 이 두가지 과정은 다른 글들을 찾아보면 차고 넘치게 나올 것이다. 다른 분들의 글을 참고하길 바란다.

 

node.js가 설치가 되었다면 파일을 옮겨서 확인을 해봐야 할것이다. 필자는 이때 Filezilla라는 프로그램을 이용해서 파일을 옮겼다. 

하지만 그에 앞서 먼저 접속할 수 있게끔 해야한다. 이를 위해 라즈베리파이에서 ssh를 해제시켜야한다. 아마 기본 값으로는 사용하지 못하도록 되어있을 것이다. (해제하는 방법은 다른 분들이 친절하게 사진으로 올리셨다.)

 

그럼 이제 접속을 할 수 있을 것이다. 나의 경우 mac이기 때문에 ssh를 이용해서 터미널에서 바로 접속할 수 있지만, 윈도우 환경의 경우 Putty를 사용하여야 접속 할 수 있을 것이다.

mac의 경우 'ssh pi@ip주소' ex) ssh pi@123.123.123.123 이렇게 입력하면 바로 접속이 가능하다. 매우 간편하다.

그럼 아래와 같은 화면으로 접속이 될 것이다.

라즈베리파이 접속

이 처럼 앞에 raspberrypi라고 붙는다. 이러면 접속이 완료된 것이다. 라즈베리파이의 ip의 경우 라즈베리파이 터미널에서 보고 적으면 된다.

 

하지만 우리는 웹서버로 사용할 것이기 때문에 단순히 라즈베리파이의 ip로 접속하면 안된다. 이럴경우는 어떻게 해야하면, 포트포워딩을 이용해야한다.

포트포워딩이란 간단히 설명 하자면, 외부에서 공유기의 특정포트로 접속하면 공유기에 연결되어 있는 기기의 어떤 포트로 접속하도록 해주는 것이라고 생각하면 된다. 즉, 외부에서 공유기 ip의 특정포트로 들어오면 포트포워딩으로 미리 설정한 포트를 타고 라즈베리파이로 접속하게 해주는 것이다. 필자는 이를 위해 공유기에서 포트포워딩을 설정했다.

 

iptime공유기의 경우 192.168.0.1 을 주소창에 치고 들어가서 로그인을 한다. (초기의 경우 id : admin, pwd : admin) 이렇게 로그인을 하고 들어가면 관리도구에 들어간다. 관리도구 -> 고급설정 -> NAT/라우터관리 -> 포트포워드설정 이런식으로 들어가면 된다. 들어가서 외부포트에다가는 공유기 ip에서 들어갈 포트번호를 적고 내부포트에는 라즈베리파이의 포트번호를 적으면 된다. ssh 접속 같은 경우는 라즈베리파이에서 22번 포트를 이용해서 접속한다. 고로 저기 스샷을 보면 -p11055라고 적혀있는데 이것이 내가 설정한 외부 포트이다.

간단히 말해 '내가 공유기 ip의 11055포트로 들어갈게~ 나를 라즈베리파이 22번 포트로 연결해줘~' 라는 의미와 같다.

그래서 저기 보면 ssh pi@123.123.123.123 -p11055 라고 적혀있는 것이다. 외부포트번호는 굳이 11055로 설정할 필요는 없다. 하지만 이미 지정되어있는 포트번호들이 존재하므로 겹치지 않게 설정하도록 하여야 한다. 이때, Node.js에서 이용할 3000번 포트도 미리 뚫어 놓자!

 

그럼 이제 웹서버 동작까지 70%를 끝낸 것이다. 

소스파일을 라즈베리파이로 보내보자.

원래 github을 이용할까 했지만, github에 상세히 서버 코드까지는 올리지 않았으므로 Filezilla를 이용하여 전송하였다. 전송하기 위해서는 연결이 필요한데, 이 방법의 경우 다른 분들의 글을 참고하길 바란다. 이것도 ssh를 이용해서 접속한것으로 기억한다(전송되는 것을 보고 있노라면 인터넷의 위대함을 다시한번 느낀다.). 여튼, 여기까지 하면 파일도 전송이 완료 되었다. 이제 서버를 실행만 하면 된다.

 

필자의 경우 node.js에서 express를 사용하였다. 고로 npm start를 이용해서 서버를 동작시켰다. 하지만 오늘 버그를 수정하는 과정에서 다른 npm을 추가로 사용하여서 더 편리하게 만들었다. 바로 nodemon이다. 미리 사용했으면 편했을 텐데 까먹었다. 그래서 수정하고 다시 키느라 귀찮았다... nodmon의 경우 코드가 수정되면 자동적으로 서버를 재실행 시켜준다. 즉, 코드를 수정하고 내가 Node.js 서버를 껐다가 다시 킬 필요가 없다. 혼자 드르륵 거리면서 다시 켜진다. 개꿀이다. ㄹㅇ 만든사람 천재임... 

 

nodemon을 설치하고 nodemon app.js 하면 오류가 발생한다. 그 이유는 express의 경우 node app.js가 아닌 npm start로 실행하기 때문인데, 이를 위해서 설정파일을 package.lock 파일을 수정해주어야한다. 그곳에 들어가면 start 부분에 node ./bin/www로 되어있을 것이다. 이부분의 node를 아래 사진처럼 nodemon으로 변경하여 주어야 한다. 그럼 npm start를 적었을때 자동적으로 node가 아닌 nodemon으로 작업을 수행한다.

 

nodemon express 실행

 

이제 npm start를 적어보자. 무사히 수행된다면 웹서버가 완성된 것이다. 하지만 마지막으로 중요한 일이 있다. 바로 test를 해보는 것이다. 필자의 경우 postman을 아주 좋아한다. postman을 이용해서 "http://ip주소:포트번호" 이렇게 적고 test를 해본다. 원하는 값이 무사히 나온다면 완료 된 것이다. 포트번호는 3000번이 아닌 공유기에서 3000번과 설정한 외부포트번호를 적어야한다. ip주소 역시 당연히 공유기 ip주소를 적어야한다.

 

이로써 라즈베리파이에서 Node.js를 이용한 웹서버가 완성 되었다. 막상 적고보니 카카오톡 챗봇과 관련성이 1도 없어 보인다... 카카오톡 챗봇을 만드는 과정이 최근에 바뀌었는데 포스팅 된 글이 거의 없어서 만들때 헤맸던 기억이 난다. 시간이 된다면 나중에 그것에 관련된 포스팅을 해보도록 하겠다.

 

모두 긴 글 읽느라 수고하셨습니다.