[Spring] 카카오 API 나에게 메세지 보내기 - HttpClient

히똔 2022. 8. 12. 00:51
728x90
반응형

카카오 API 로 나에게 메세지 보내기를 검색해보면 Spring 예제가 잘 안나온다.. 
JS나 Python 예제는 많은데.. 그걸로 해도 되긴 하지만 백엔드 개발자로서 자존심이 상하자나?!
그래서 끝까지 찾아본 결과 해결법을 찾았다. 많은 사람들에게 도움이 되길.
참고로 shell script 로 보내려는 사람이 있다면 (설마 있겠어?) 시도하지 마라.
따옴표 이스케이프가 무슨 방법을 해도 안된다..ㅜㅠ

혹시라도 해결방법 찾으신 분이 계시다면 꼭 알려주시길..

어플리케이션 설정법과 access token을 받는 방법은 여러 블로그를 많이 거쳐오신 여러분들은 이미 지겹도록 봤을거다.
그래서 바로 본론으로 들어가 핵심 코드를 살펴보겠다.
(이 글 조회수가 많아지면 사전 준비 방법에 대해선 추후에 따로 글을 올려보겠다..!)

 

일단 내가 보내고 싶은 파라미터는 이거였다. 이걸 Spring으로 한번 보내보자.

'template_object={"object_type": "feed",
                    "content":
                    {
                        "title": "일주일전에 찍은 PhoRest 을 확인해보세요!",
                        "image_url": "$PATH",
                        "link":
                        { "mobile_web_url":
                        "https://my.site/community/$ID" }
                    }
}'

 

KakaoService

public String sendMessage(KakaoDTO kakaoDTO) throws IOException{
    String host="https://kapi.kakao.com/v2/api/talk/memo/default/send";
    HttpClient httpClient = HttpClientBuilder.create().build();
    try{
        HttpPost request = new HttpPost(host);

        String path = kakaoDTO.getPath();
        String access = kakaoDTO.getAccessToken();
        String id = kakaoDTO.getEncodedPostId();

        StringEntity params = new StringEntity(
                "template_object={\"object_type\": \"feed\",\"content\":{\"title\": \"일주일전에 찍은 PhoRest 을 확인해보세요!\",\"image_height\": \"1000\",\"image_width\": \"1500\",\"image_url\": \""+path+"\",\"link\":{ \"mobile_web_url\": \"https://my.site/community/"+id+"\" }}}"
        ,"UTF-8");

        request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        request.addHeader("Authorization", "Bearer "+access);
        request.setEntity(params);
        httpClient.execute(request);
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    return "hi";
}

HttpURLConnection 을 사용하지 않고, Apache HttpClient를 이용했다.
HttpPost 인스턴스를 생성한후 addHeader 메소드를 이용해서 헤더정보를 추가해주었고,
StringEntity 객체로 파라미터를 설정해주고 setEntity 메소드로 request를 만들어주었다.

본인은 다수의 사용자에게 보내주려고 했기 때문에 kakaoDTO를 따로 만들었다.

 

결과

 

주의할 점

1. 주의할 점은 StringEntity 인스턴스 생성시 한줄로 작성해야한다.
꼭 한줄띄기를 하고싶다 한다면 + 로 끊어서 작성해주면 된다.

2. template_object 파라미터를 구성하는 객체를 만들어주기 위해서는 따옴표가 필요한데,
이 따옴표를 이스케이프 시켜주기 위해서는 \(백슬래쉬)를 이용해야한다.

3. token이 잘못된다는 오류가 뜨면 access token의 상태를 다시 확인해보자.
access token 의 만료 시간은 6시간이다. refresh token으로 access token을 갱신해주자.

4. Android 에서는 HttpClient 보다는 HttpURLConnection 을 더 권장한다고 한다.
또한 HttpClient 가 무거워서 통신 시간이 많이 소요될 수도 있다.
특별한 경우가 아니라면 HttpURLConnection 이용을 추천한다.

728x90
반응형