일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Visitor pattern
- line messaging api
- mapping
- annotation
- Modelmapper
- springboot
- DtoToEntity
- ngrok
- Dynamic dispatch
- getOrCreate
- webhook
- NullPointerException
- Controller
- linebot
- static dispatch
- 챗봇
- 토비의 봄
- Optional
- spring
- java
- double dispatch
- reflection
- visitor proxy pattern
- EntityToDto
- enum
- Today
- Total
database by narae :p
LINE Messaging API를 활용한 챗봇 만들기 본문
현재 프로젝트를 진행하며 백엔드는 스프링 부트로 개발하고 실제 보이는 플랫폼은 라인봇을 사용하게 되었습니다.
이 글에서는
1. 라인봇 채널 생성
2. 샘플봇(line-bot-sdk-java) 사용하기
3. ngrok을 이용한 로컬 네트워크 터널링
4. 샘플봇이 잘 동작하는지 확인
5. 개인 프로젝트에 적용하기 (Spring Boot)
다섯 단계에 대한 내용을 다룰 것입니다.
1. 라인봇 채널 생성
1.1. Line Developer 계정 및 Provider 생성
https://developers.line.biz 에서 Line Developer 계정을 생성하고 로그인을 하면, 다음과 같이 Provider를 생성하는 화면이 나타납니다.
[ Create New Provider ] 버튼을 클릭하여 Provider를 생성합니다.
" The provider is the entity (individual or company) that offers the app. "
Provider란 우리가 만드는 app을 제공하는 개체입니다. 따라서 저희는 챗봇을 위한 채널을 생성할 수 있는 Provider를 먼저 생성해야 합니다.
1.2. 채널 생성
생성한 provider로 들어가면 다음과 같이 채널을 생성할 수 있는 화면이 나타납니다.
[ Create new Channel ] 버튼을 클릭하면 다음과 같이 세 개의 채널이 있습니다.
저희는 챗봇을 만들 것이기 때문에 Messaging API를 선택합니다. 그리고 간단하게 앱 이름, 설명 등의 정보를 기입한 후 채널을 생성합니다.
채널을 생성하면, 채널 정보를 확인하고 수정할 수 있는 화면이 나타납니다.
이 화면을 쭉 내려보면 [ Bot information ] 의 QR 코드가 있을 것입니다. 라인 메신저를 켜서 해당 QR 코드를 이용해 생성한 채널을 친구로 등록합니다.
친구로 등록하면 자동 응답 메시지가 올 수 있는데, Using LIne@ features 탭의 Auto-reply messages, Greeting messages를 disabled로 설정하면 자동 응답 메시지는 오지 않습니다. 저는 개발 중에 방해가 될 수 있을 것 같아 일단 disabled로 설정하였습니다.
이 화면에서 기억해두어야 할 것은 Channel Secret과 Channel Access Token입니다.
[ Basic Information - Channel Secret ] : 채널에 부여된 고유 secret
[ Messaging Settings - Channel Access Token ] : issue 버튼을 클릭해 새로 생성합니다.
두 개의 값은 추후 챗봇 설정에 필요하므로 알아두어야 합니다.
그리고 Messaging settings 탭의 webhook도 샘플봇 설정 시 필요하기 때문에, 일단 [ Messaging settings - Use Webhooks ] 를 enabled로 변경합니다. webhook에 관련된 내용은 밑에서 자세히 설명하도록 하겠습니다.
2. 샘플봇 사용하기
제 프로젝트에 적용하기 전에 라인에서 제공하는 샘플봇을 사용해 보았습니다. 부끄럽게도 지금까지 서비스를 배포해본 경험 없이 로컬에서만 개발하다 보니 이런 환경이 익숙하지 않아 차근차근 시작했습니다.
https://engineering.linecorp.com/ko/blog/line-messaging-api-samplebot
저는 Line Engineering의 'Line Messaging API 사용해보기'라는 글을 참고하여 따라해 보니, 정말 쉽고 간단하게 샘플봇이 실행되었습니다. 사실 위에 'Line Developer 채널 생성' 부분은 위 글을 요약한 내용입니다. 이 두 번째 내용도 위 글을 요약해보겠습니다.
일단 샘플봇을 사용하기 전에, 원하는 디렉토리에서 터미널을 열어 샘플봇(line-bot-sdk-java)을 복사해옵니다.
$ git clone https://github.com/line/line-bot-sdk-java.git
clone을 완료하면, 해당 디렉토리에 들어가 몇 가지 변경을 하겠습니다.
1) [ line-bot-sdk-java ] 디렉토리의 Procfile 파일의 내용을 지우고 다음과 같이 변경합니다.
web: java $JAVA_OPTS -jar sample-spring-boot-kitchensink/build/libs/sample-spring-boot-kitchensink-*.jar --server.port=$PORT
2) 디렉토리 내의 [ sample-spring-boot-kitchensink/src/main/resources ] 에서 application-template.yml 파일의 이름을 application.yml로 변경하고 파일 내용 중 다음 내용을 변경합니다.
- 위 두 줄을 주석 처리 혹은 지웁니다. (저는 주석 처리 했습니다)
- 그리고 아까 Line Developers에서 생성한 채널 정보에서 확인했던 channel-token과 channel-secret을 작은 따옴표 안에 복사해 넣습니다.
- handler.path는 default로 /callback이라고 되어있지만, 원하는대로 지정하셔도 됩니다. 단, 밑에서 webhook URL을 설정할 때 자신이 지정한 path명으로 입력하면 됩니다.
샘플봇 설정은 마쳤습니다. 다음은 ngrok을 이용한 로컬 네트워크 터널링에 관한 내용입니다. 지금까지 참고한 Line Engineering의 글에서는 Heroku라는 PaaS 클라우드를 이용하여 쉽게 배포할 수 있습니다. 하지만 저는 아직 개발 단계이기 때문에, 테스트할 때마다 매번 Heroku에 프로젝트를 올려야 한다는 점이 불편해서 ngrok을 사용했습니다. 아마 개발이 완료되고 배포 단계라면 사용해도 좋을 것 같습니다.
3. ngrok을 이용한 로컬 네트워크 터널링
ngrok을 사용하기 전에 간단하게 개념을 짚고 가겠습니다.
webhook이란?
Line Developers 채널 정보를 확인하는 페이지에서 Webhook 관련 설정이 있었습니다.
webhook은 Hooking을 웹 환경에서 제공하는 것으로, Hooking이란 발생한 특정 event의 앞뒤에 추가로 정해진 일을 하는 것을 말합니다. webhook을 구현한 웹 애플리케이션은, 특정 작업이 수행될 때 URL에 대해 HTTP POST 방식으로 요청을 생성합니다. 이러한 기능을 수행하는 URL인 webhookURL을 등록하여 webhook을 사용합니다.
이해가 잘 가지 않지만, LINE Messenger로 예를 들어 설명하겠습니다. 사용자가 챗봇에 특정 메시지(event)를 보내면 서버는 그 메시지에 따라 기능을 수행하거나 응답을 만들어주어야(Hooking) 합니다. 그리고 이 서버는 저희가 만드는 웹 서버입니다. (라인 샘플봇에서는 sample-spring-boot-kitchensink)
이러한 webhookURL은 공개적으로 사용할 수 있는 주소를 등록해야 합니다. 즉, 로컬 주소를 사용할 수 없습니다. 하지만 ngrok을 이용한다면 로컬 네트워크 터널을 열어 외부에서 로컬에 접속 가능할 수 있도록 할 수 있습니다.
외부로부터 로컬 네트워크를 보호해주는 NAT와 방화벽 덕분에 안전한 네트워크 환경을 보장 받지만, 이로 인해 외부에서 로컬 네트워크로 바로 접속할 수 없습니다. 하지만 ngrok은 포트 포워딩과 같은 네트어크 환경 설정 변경 없이 로컬 서버를 안전한 터널을 통해 외부에서 접근할 수 있도록 돕습니다.
3.1. ngrok 설치
https://ngrok.com에 로그인하여 ngrok을 설치합니다. 설치에 딱히 어려운 점은 없습니다.
3.2. ngrok 사용
터미널을 열어 다음 명령을 실행하면, HTTP 서버를 ngrok 도메인과 연결하여 외부로 터널을 열어줍니다.
./ngrok http '포트 번호'
명령을 실행하면 다음과 같이 터미널 창이 바뀌며, 이 연결된 ngrok 도메인을 사용하면 됩니다.
이 때, ngrok의 Session Expire 문제로 세션이 8시간만 유지되어 8시간 후에는 다시 실행해야 하며, 다시 실행하면 도메인 주소 또한 변경됩니다. ngrok 대시보드의 Auth 탭에 들어가면 'Your Tunnel Authtoken'로 개인 Authtoken을 알려줍니다. 이 Authtoken과 함께 다음 명령을 실행하면 됩니다.
./ngrok http '포트번호' --authtoken={Authtoken}
4. 라인 샘플봇 동작 확인
4.1. webhookURL 등록
여기까지 마쳤다면, 이제 ngrok 도메인과 샘플봇의 application.yml에서 설정한 handler.path를 가지고 webhookURL을 등록할 것입니다. LINE Developers의 채널 정보 수정 화면으로 돌아가 [ Messaging Settings ] 탭의 webhookURL을 등록합니다.
URL은 'ngrok도메인/handler.path'입니다. 입력하고, verify버튼을 클릭하여 Success 표시로 바뀌면 됩니다.
4.2. 샘플봇 실행
line-bot-sdk-java 디렉토리의 [ sample-spring-boot-kitchensink ] 디렉토리에서 터미널을 열어 다음 명령을 통해 실행합니다.
../gradlew bootRun
4.3. 실행 확인
친구로 등록한 챗봇과 대화창을 열고, sample-spring-boot-kitchensink에 있는 controller에서 등록된 메시지(ex : profile, buttons, bye,...)를 입력하면 샘플봇이 지정한 event에 대해 맞게 챗봇이 응답을 만들어 줍니다.
샘플봇이 잘 동작하는 것을 확인했다면, 이제 개인 프로젝트에 적용해보겠습니다.
5. Spring boot 프로젝트에 적용하기
5.1. LINE Messaging API 사용을 위한 의존성 추가
LINE Messaging API를 사용하기 위해서 gradle에 의존성을 추가합니다. 저는 gradle을 사용하지만, 메이븐 등 다른 빌드 도구를 사용하시는 분은 다음 링크를 통해 의존성을 추가하시면 됩니다.
implementation 'com.linecorp.bot:line-bot-spring-boot:2.4.0'
https://mvnrepository.com/artifact/com.linecorp.bot/line-bot-spring-boot
5.2. application.properties에 설정 추가
샘플봇을 설정할 때 application.yml에 Channel token과 channel secret, handler-path를 설정한 것 처럼 프로젝트의 application.properties 파일에 괄호를 제외하고 설정을 추가합니다.
line.bot.channel-token={Channel-Token}
line.bot.channel-secret={Channel-Secret}
line.bot.handler.path=/{path}
5.3. MessageHandler 등록
빌드가 완료되면 LINE Messaging API에서 제공하는 어노테이션 등 라인 메신저와 관련된 다양한 기능을 사용할 수 있습니다.
일단 사용자가 보낸 메시지를 받아오는 MessageHandler를 작성해야 합니다.
MessageHandler 클래스를 생성하여, 다음과 같이 @LineMessageHandler 어노테이션을 선언합니다.
그리고 클라이언트의 정보를 받아오거나, 답장 등의 기능을 수행하기 위하여 LineMessagingClient도 준비합니다.
handleTextMessageEvent에 브레이크 포인트를 걸어 디버깅 모드로 실행하면, 사용자가 메시지를 보냈을 때 메시지가 들어오는 것을 확인할 수 있습니다.
하지만 저희는 메시지만 받는 것이 아니라, 특정 메시지에 맞게 기능을 수행하거나 응답을 만들어 주어야 하기 때문에 reply 메서드를 작성합니다. 이 메서드는 위의 샘플봇으로 사용한 line-bot-sdk-java 에서 참고하였습니다.
위에 작성한 reply 메서드를 이용하여, 사용자가 보낸 메시지가 들어오면 switch문을 통해 각 입력에 대해 각자 수행할 기능 처리를 하시면 됩니다. 필요에 따라 controller, service, repository 등을 호출하여 로직을 실행할 수 있습니다.
기존 프로젝트에 어제부터 챗봇을 붙이기 시작한거라 잘 모르는 부분이 많아서 정리하면서 공부하는 것을 목적으로 글을 작성했습니다. 가끔 필요한 기능이 있으면, line messaging api refernce나 샘플봇 코드를 참고하면서 기능을 확장해 나가고 있습니다.
https://developers.line.biz/en/reference/messaging-api/
아직 갈 길이 멀지만 생각보다 쉽게 적용할 수 있었던 챗봇 첫 도전이었기 때문에, 다른 분들도 쉽게 적용해보길 바랍니다. 부족한 글이지만 피드백이나 궁금한 점은 언제나 환영입니다 !
'개발 노트' 카테고리의 다른 글
user level lock (0) | 2019.06.12 |
---|---|
JPA 정리하기 (0) | 2019.06.07 |
Annotation과 Reflection을 이용한 챗봇 컨트롤러 만들기 (0) | 2019.06.07 |
Entity to DTO, DTO to Entity 그리고 ModelMapper (10) | 2019.05.16 |
Optional 클래스 사용하기 (1) | 2019.05.16 |