ChatBot 2018. 2. 5. 14:37

Spring프레임워크를 이용한 챗봇


이제 카카오톡 이전 자동응답 시스템은 deprecated 될 예정입니다. 현재 신규 사용도 불가하구요. 추후에 현재나온 카카오톡 챗봇 빌더를 이용하여 챗봇 개발하는 글을 올릴 예정이니 그때 다시 확인해주시면 감사하겠습니다. - 여성게 20190729


1.시작전



코딩 초보인 저자가 무엇을 만들까 생각 해보다가 생각한 것이 챗봇이었습니다. 초보인 제가 하루종일 헤매다가 만들 챗봇을 저처럼 코딩에 익숙치 않으신 분들도 쉽게 만들어 볼 수 있도록 글을 작성해보았습니다.(틀린부분 지적질좀 부탁드려요...)






2.개발환경



1.구름IDE(구름을 사용하는 이유는 서버를 단 몇번의 클릭으로 생성 할 수 있다. 편한만큼 불편한 점도 많다. 단순히 테스트용으로 사용하길..)

2.eclipse

3.Spring Framework 4.3.3








3.Jackson2 라이브러리 추가






4./keyboard 구현하기


/keyboard 에 매칭되는 기능입니다. 이용자가 최초로 채팅방에 들어 올때 기본으로 키보드 영역에 표시될 메뉴들을 설정하기 위함입니다.

카카오톡 관리자 홈페이지에서 API형 URL을 등록 할때 초기 테스트로 꼭 필요한 기능이니 꼭 구현해주셔야합니다.

키보드 응답구조입니다.

위 구조와 같이 플러스친구와 1:1대화 누르면 나오는 첫화면인 /keyboard 와 매칭되는 JSON 객체의 구조입니다.

type은 buttons형과 text형이 있지만 저자는 buttons형이 편했음으로..




KeyboardDTO 구현


json-simple 라이브러리를 받아 아예 컨트롤러 안에서 keyboard 객체를 json object 형태로 리턴해주어도 되지만 객체지향인만큼 keyboard객체를 선언해서 keyboard 객체를 리턴해주면 조금더 깔끔할 것 같기에... 여기 하나더 보아야 할것.. DTO의 변수와 JSON 구조에서의 변수명이 같은 것을 주목해주세요! (같아야 나중에 어노테이션으로 인한 자동매핑이 가능합니다.)



controller 구현


컨트롤러 구현 이전에 스프링 설정파일에 설정 해 놓아야할 것이 있다.


스프링설정파일 설정


위에 보듯이 컨트롤러에서 선언한 어노테이션을 인식하기 위한 설정들이다. 빈생성 및 json을 위한 어노테이션 인식을 위함이다.(자세한 것은 구글링...)


Controller-/keyboard 


위에서 주목해야 할 어노테이션은 @RestController 이다. @RestController=@Controller + @ResponseBody 라는 뜻이다. 즉, 모든 메소드에서 @ResponseBody를 추가 해줄 필요가 없다는 것이다. (여기서 @Controller가 붙은 클래스는 컨테이너에 의해서 컨트롤러로 인식됨과 동시에 객체를 자동 생성해주는 어노테이션이고, @ResponseBody는 리턴 값을 자동으로 JSON 객체로 변환해서 리턴해주는 기능의 어노테이션이다.!)




이제 /keyboard url이 요청되었을 때, 카카오톡이 아닌 웹에서의 결과를 보면, json 형태로 결과값들이 리턴되는 것을 볼수 있다.("여보 이거 눌러봐 !"는 여자친구를 위해...저것을 눌렀을 때, 사랑해라는 대답을 응답 하기위해...해놓은 소소한 이벤트였다.. 애교로 봐주시길..)




여러분들이 직접만든 플러스친구에게 1:1대화를 신청하면 첫 화면에서 이렇게 keyboard가 생성 된 것을 볼 수 있다.

하지만 이 버튼들중 무엇을 눌러도 에러가 발생 할 것이다. 왜냐? 버튼을 눌러 플러스친구에게 메시지를 보내면 그 메시지에 대한 응답을 할 메소드를 만들지 않았기 때문...




사용자 요청 구조 


이것은 이용자가 보낸 메시지가 서버에 저런 json 구조로 값이 들어 온다는 겁니다.

사용자 요청에 따른 챗봇의 응답구조



이것은 서버측에서 이용자가 보낸 메시지를 토대로 응답을 보낼때의 json의 구조입니다. 보시면 json객체 안에서 message & keyboard 객체가 또 message 객체 안에 여러 객체가 들어가 있는 것이 보입니다. 반드시 이 객체들을 모두 구현 할 필요는 없습니다. 예를 들어 텍스트로만 응답을 보내고 싶으면 message 객체안의 text라는 것만 객체에 담아서 보내도 됩니다. 그 예는 조금 있다 보실수 있습니다.




MessageButtonDTO,MessageDTO,PhotoDTO,RequestMessageDTO,ResponseMessageDTO구현





여기서 RequestMessageDTO 객체는 사용자로부터 들어오는 요청에 대한 DTO이고(위 구조 참고), ResponseMessageDTO는 사용자의 요청에 대한 응답을 담아서 보낼 DTO 객체입니다. 그 외의 DTO들은 ResponseMessageDTO에 담길 객체들입니다.(이것 또한 위의 구조참고) 이것들을 활용한 controller의 구현입니다.




Controller-/message



여기서 주목해야 할것은 /message 요청이 들어왔을 때, 수행되는 메소드의 매개변수 입니다. @RequestBody 어노테이션을 이용해 json객체 형태의 사용자의 요청을 RequestMessageDTO 객체에 매핑을 시켜주는 겁니다. 그래서 위에서 설명했듯이 JSON 구조와 DTO 객체의 인스턴스 변수명을 똑같이 맞춰주는 겁니다. 그래야 자동으로 JSON객체를 RequstMesaageDTO 객체의 형태로 자동으로 바꿔줘서 매개변수에 들어오는 겁니다. 그리고 if 문 안의 dto.getContent() 메소드는 요청에 담긴 사용자의 String 형태의 채팅내용을 가져오는 겁니다.(위 요청 구조에서 content라는 것이 있었던 거 기억하죠?)

이런식으로 사용자가 한 채팅내용에 따라 적절히 분기 시켜 각각의 응답을 결정합니다....(원래 진정한 챗봇은 이런 구조를 갖지 않겠죠..? 자연어 처리가 들어가야하는데 필자는 그정도의 능력이 안되 간단히 단어만 추출해 답변을 정하는 정도..)

마지막으로 어떠한 조건문에 걸려 응답에 대한 객체들을 적당히 만들어주고 마지막에 ResponseMessageDTO 객체에 담아서 리턴해주면 JSON 형태로 응답이 가게 됩니다.(위에 보면 응답구조에 따른 모든 json객체를 다 포함해서 리턴하지 않습니다. 자신이 텍스트만 보내고 싶으면 텍스트만 리턴해주면 되고 사진도 보내고 싶으면 사진 객체도 포함시키고 개발자의 마음입니다.)





마치며.. 




필자는 코딩을 잘하지 않습니다.. 다만 제가 개발하면서 정말 헤매었던 부분, 어려웠던 부분을 위주로 저와같은 초보도 알아 듣기 쉽게 하기 위해 노력했습니다... 잘못된 부분은 지적해주시면 감사합니다. 부족한 필자의 글을 보고 아주 조금이나마 도움이 되셨다면 좋겠습니다...


혹시나 코드가 필요하신분들이 있다면 말씀해주세요~!





'ChatBot' 카테고리의 다른 글

Chatbot - 1.개요_ 우리말 한글 챗봇 구성요소  (1) 2019.07.06
posted by 여성게
: