자바 스프링 어플리케이션에서 카카오톡 알람 보내기 Part 1. 토큰 발급

Adam·2022년 6월 9일
2

트러블슈팅

목록 보기
1/4

새로운 회사에 와서 가장 먼저 받은 작업은 수동으로 보내고 있는 카톡을 특정 조건이 맞을 경우 자동으로 보내는 것을 개발하는 것이었다.
새 회사에서 개발하는 것은 보다 대중적으로 많이 활용되는 스프링이고, 개발을 하면서 문제를 겪었던 것에 대해서 기록을 하는 것이 많은 도움이 될 것 같아서 시간이 남을 경우 해당 내용을 기록을 해보려고 한다.

현재 회사에서 사용하는 카카오톡 전송 서비스는 알리고라는 서비스다.
시작부터 문제가 있었다.
홈페이지에 API 스펙은 잘 정리되어 있지만, 예제 코드를 본다면 PHP, Node, C#, Python에 해당하는 예제코드는 작성이 되어있지만, 자바를 위한 코드는 없었다.

스프링 공화국이라 불리는 우리나라에서 자바 코드를 왜 제공하지 않는지 전혀 이해가 되지 않지만, API 문서를 읽어보면서 직접 구현해 보기로 했다.

우선 가장 먼저할거는 당연히 토큰을 발급 받는 과정이었다.
알리고의 토큰 발급 API 문서를 본다면 설명은 나름 친절하게 잘 되어있었다.
웹사이트에 제공된 url("https://kakaoapi.aligo.in/akv10/token/create/30/s/")에 마이페이지에서 발급 받을 수 있는 apikey와 내 userid를 request body에 담아 POST 요청을 보내면 됐다.

트러블 슈팅

해당 문제를 생각보다 간단하게 해결할 수 있을 것이라고 생각했으나, 해당 토큰을 발급 받는 과정부터 많은 문제를 겪었다.

  1. 고정 ip 사용
    현재 공유 오피스에서 일하고 있었기에 별 생각 없이 공유 오피스의 와이파이를 잡은 상태로 작업을 진행하였다.
    우선 포스트맨에 발급 받은 apikey와 userid를 body에 담고 요청을 보냈으나 허가되지 않은 IP라는 오류를 반환했다.
    해당 부분에 대한 설명은 홈페이지나 문서에 찾아볼 수 없어서 상담원에게 상담 요청을 했다.

    꽤나 친절하고 신속하게 해당 문제에 대한 알람을 받을 수 있었고, 답변에 나온대로 고정 IP를 받기 위해서 공유 오피스의 기술 지원팀에 문의를 하였다.

이번에도 거의 즉각적으로 해당 문제에 대한 피드백을 받았고 고정 IP를 받았지만, 해당 IP로 인터넷에 접속이 되질 않는 오류를 겪었다.
어쩔 수 없이 기술 지원팀에게 상담을 요청하였고, 기술 지원팀에서도 보내드린 스크린샷에서는 특이점을 찾지 못하였다고 하였고, 직접 와서 봐주신다 하였다.

결국 기술 지원팀 직원분이 말씀한대로 내가 잘못 입력을 하고 있는 것이 아니라, 랜선에 이상이 있었던 것이 확인됐다.
랜선을 새것으로 교체하니 바로 고정 IP로 인터넷에 접속할 수 있었고, 포스트맨을 통해 요청 역시 정상적으로 가는 것이 확인됐다.

  1. 자바에서 해당 토큰 발급 받기
    IP와 하드웨어적인 문제를 해결하였고, 포스트맨에서 정상적으로 토큰을 발급 받을 수 있다는 것을 확인했기 때문에 자바에서 토큰을 발급 받는 것은 어렵지 않을 것이라고 생각했으나, 생각보다 문제를 많이 겪었다.
    예시로 제공 된 파이썬 코드는 생각보다 간단하였다.

a) httpClient 생성
우선 파이썬 코드를 가장 유사하게 따라할 방법을 생각했었고, 해당 방법은 자바에서 클라이언트를 직접 생성하여 json 객체를 만들어 apikey와 userid를 담아 보내는 방법이었다.
클라이언트는 아래 코드로 생성하였다.

HttpClient httpClient = HttpClientBuilder.create().build();

하지만 계속 계정아이디 파라미터가 전달되지 않았다는 오류를 받았는데, 오류 메세지 때문에 당연히 보내고 있는 json에 문제가 있다고 생각을했다.
자바에는 json을 다루는 라이브러리가 많이 있는데, 해당 오류를 해결하기 위해 정말 다양하게 많이 써봤지만 계속 같은 오류에 직면했다.

b) Java runtime으로 curl 커맨드 실행
API 문서를 봤을때 curl command를 통해서 호출하는 것에 대한 안내도 있었다.

curl -X POST "https://kakaoapi.aligo.in/akv10/token/create/30/s/" \
  --data-urlencode "apikey=xxxxx" \
  --data-urlencode "userid=xxxxx"

해당 커맨드를 터미널에 직접 입력하였을때 정상적으로 토큰이 발급이 되었는데, 이를 Java의 runtime을 활용해 출력하면 되겠다고 판단하여 다음과 같이 코드를 작성하였다.

String command =
                "curl -X POST \"https://kakaoapi.aligo.in/akv10/token/create/30/s/\" \\\n" +
                        "\t--data-urlencode \"apikey=xxxxx\" \\\n" +
                        "\t--data-urlencode \"userid=xxxxx\"";
        Process pr = Runtime.getRuntime().exec(command);
        String result = new BufferedReader(
                new InputStreamReader(pr.getInputStream()))
                .lines()
                .collect(Collectors.joining("\n"));
        log.info(result);

하지만 result값이 0으로 출력이 되었다.
결국 스택오버플로우의 도움을 받기로 하였다.

c) Unirest library 사용
스택오버플로우의 친절한 개발자가 unirest library를 사용하면 보다 쉽게 해결 될 것이라고 조언을 했다.
조언대로 해당 라이브러리를 사용해봤다.

HttpResponse<String> response = Unirest.post("https://kakaoapi.aligo.in/akv10/token/create/30/s/?apikey=xxxxx&userid=xxxxx")
  .asString();
log.info(response.getBody().toString());

해당 방식으로 토큰을 정상적으로 발급 받을 수 있었다.

회고

아직까지 처음 실행했던 두 방식에 어떤 문제가 있는지 찾지 못하였다.
혹시나 이 글을 보는 사람 중 무슨 문제가 있는지 알고 있는 사람은 답글을 달아 주실 수 있으면 감사하겠습니다.

profile
Keep going하는 개발자

1개의 댓글

comment-user-thumbnail
2023년 12월 28일

안녕하세요. 저도 같은임무를 받았는데 도움을 구할수있을까요 ??
9078807@naver.com 메일주시면 감사하겠습니다..

답글 달기