본문 바로가기

개발/Java & Spring

[Spring , 카카오 플러스친구] 스프링으로 챗봇을 개발하자! - 개발일기C[1]



유일하게 하는 대외활동이 드디어 개발을 시작했다.

어떻게 하다 팀장을 맡게 되어서 어찌된게 문서 작업을 더 많이 하는 것 같지만 ㅠ_________ㅠ 피가되고 살이되겠죠 ,, 




챗봇을 구축하고, 지하철 공공 데이터를 받아와 전달해주려고 한다.

우선 챗봇 레퍼런스를 확인해보자.


여기서 자세한 레퍼런스를 볼 수 있다 -> https://github.com/plusfriend/auto_reply



당장 필요한 경로는 /keyboard , /message 가 있다. 추가로 /delete도 있지만 일단 생략한다.


/keyboard 는 사용자가 플러스친구 채팅방을 처음 들어갔을 때 보이는 화면을 설정한다.


    • Method : GET
    • URL : http(s)://:your_server_url/keyboard
    • Content-Type : application/json; charset=utf-8


    • Response: Keyboard
    필드명타입필수여부설명
    typeStringRequiredbuttons: 객관식 응답의 목록을 구성할 수 있음 
    text: 주관식 응답을 입력받을 수 있음
    buttonsArray[String]Optional객관식 응답 내용의 목록 
    (최대 100개)
    {
        "type" : "buttons",
        "buttons" : ["선택 1", "선택 2", "선택 3"]
    }
    


    keyboard는 간단하다.

    필드는 type, buttons로 구성되어있고 type은 buttons또는 text,

    type이 buttons일 경우 그 버튼 리스트는 buttons 필드에 보관한다.


    text로 설정하면 그냥 바로 채팅방화면이 뜨고, buttons를 선택하면 선택할 수 있는 버튼 리스트가 나온다.

    나는 일단 간단히 구축만 한거니까 text로 해주었고 코드는 다음과 같다.


    KeyboardVO.java

    import lombok.Data;
    
    @Data
    public class KeyboardVO
    {
    	private String type;
    	private String[] buttons;
    }
    

    * lombok이 없다면 알아서 getter, setter를 생성하도록한다. 스프링을 쓴다면 lombox을 강추하지만 ,,



    Controller.java

    @RequestMapping(value = "/keyboard", method = RequestMethod.GET, produces="application/json; charset=UTF-8")
    public KeyboardVO keyboard()
    {
    	KeyboardVO keyboard=new KeyboardVO();
    	keyboard.setType("text");
    	return keyboard;
    }
    


    이러면 첫 화면 세팅은 끝났다.

    만약 버튼을 출력하고 싶다면

    setType("buttons")를 하고,

    setButtons(buttonList)를 하면 될 것이다.




    다음 /message 는 사용자가 채팅방에 무언가를 보냈을 때 하는 반응을 설정한다.


    • Method : POST
    • URL : http(s)://:your_server_url/message
    • Content-Type : application/json; charset=utf-8
    • Parameters 

    아래 필드들이 Request를 구성하는 것이다. 우리는 여기서 type과 content만 꺼내쓸 것이다.

    필드명타입필수여부설명
    user_keyStringRequired메시지를 발송한 유저 식별 키
    typeStringRequiredtext, photo
    contentStringRequired자동응답 명령어의 메시지 텍스트 혹은 미디어 파일 uri

    type은 text아니면 Photo이다. 아직 사진을 처리하긴 무리가 있을 것 같아 여기 예외처리를 걸어줄 계획이다.

    content는 말그대로 사용자가 보내는 내용이 된다. 역시나 사진 url이 들어올 일은 없을 것이다.


    Response


    필드명타입필수여부설명
    messageMessageRequired자동응답 명령어에 대한 응답 메시지의 내용. 6.2에서 상세 기술
    keyboardKeyboardOptional키보드 영역에 표현될 명령어 버튼에 대한 정보. 생략시 text 타입(주관식 답변 키보드)이 선택된다. 6.1에서 상세 기술


    Keyboard는 KeyboardVO가 될것이고, Message는 뭔가 살펴보니


    필드명타입필수여부설명
    textStringOptional사용자에게 발송될 메시지 텍스트(최대 1000자)
    photoPhotoOptional말풍선에 들어갈 이미지 정보. 1장 제한, JPEG/PNG 포맷. 6.3에서 상세 기술
    message_buttonMessageButtonOptional말풍선에 붙는 링크버튼 정보. 6.2.1에서 상세 기술

    이거다.

    세개다 optional이고, 여기서는 text만 쓸 것이니까 text만 만들어두겠다.


    MessageVO.java

    import lombok.Data;
    
    @Data
    public class MessageVO
    {
    	//사용자에게 발송될 텍스트("최대 100자")
    	private String text;
    }
    



    RequstMessageVO.java

    import lombok.Data;
    @Data
    public class RequestMessageVO
    {
    	//메시지를 발송한 유저 식별 
    	private String user_key;
    	//text, photo
    	private String type;
    	//자동 응답 명령어의 메시지 또는 미디어 파일 url
    	private String content;
    	
    }
    


    ResponseMessagVO.java

    import lombok.Data;
    
    @Data
    public class ResponseMessageVO
    {
    	private MessageVO message;
    	private KeyboardVO keyboard;
    }
    


    Controller.java

    @RequestMapping(value = "/message", method = RequestMethod.POST, produces="application/json; charset=UTF-8")
    @ResponseBody
    public ResponseMessageVO message(@RequestBody RequestMessageVO vo) throws JsonParseException, JsonMappingException, IOException
    {
      ResponseMessageVO res_vo=new ResponseMessageVO();
      MessageVO mes_vo=new MessageVO();
      KeyboardVO keyboard=new KeyboardVO();
      keyboard.setType("text");
      res_vo.setKeyboard(keyboard);
      if(!vo.getType().equals("text"))
      {
      //텍스트 타입만 허용할 것이기 때문에
      mes_vo.setText("텍스트 타입만 허용하고 있습니다");
      res_vo.setMessage(mes_vo);
      return res_vo;
    
      mes_vo.setText(vo.getContent());
      res_vo.setMessage(mes_vo);
      return res_vo;
    


    이렇게 하면 간단한 에코 챗봇이 구현된다.

    서버에 배포하고 해당 주소를 등록하면 정상적으로 서비스 될 것이다.


    프로젝트를 좀 더 진행하고, 챗봇으 ㅣ다른 기능들을 만져봐야겠다.