새로운 회사에 와서 가장 먼저 받은 작업은 수동으로 보내고 있는 카톡을 특정 조건이 맞을 경우 자동으로 보내는 것을 개발하는 것이었다.
새 회사에서 개발하는 것은 보다 대중적으로 많이 활용되는 스프링이고, 개발을 하면서 문제를 겪었던 것에 대해서 기록을 하는 것이 많은 도움이 될 것 같아서 시간이 남을 경우 해당 내용을 기록을 해보려고 한다.
현재 회사에서 사용하는 카카오톡 전송 서비스는 알리고라는 서비스다.
시작부터 문제가 있었다.
홈페이지에 API 스펙은 잘 정리되어 있지만, 예제 코드를 본다면 PHP, Node, C#, Python에 해당하는 예제코드는 작성이 되어있지만, 자바를 위한 코드는 없었다.
스프링 공화국이라 불리는 우리나라에서 자바 코드를 왜 제공하지 않는지 전혀 이해가 되지 않지만, API 문서를 읽어보면서 직접 구현해 보기로 했다.
우선 가장 먼저할거는 당연히 토큰을 발급 받는 과정이었다.
알리고의 토큰 발급 API 문서를 본다면 설명은 나름 친절하게 잘 되어있었다.
웹사이트에 제공된 url("https://kakaoapi.aligo.in/akv10/token/create/30/s/")에 마이페이지에서 발급 받을 수 있는 apikey와 내 userid를 request body에 담아 POST 요청을 보내면 됐다.
해당 문제를 생각보다 간단하게 해결할 수 있을 것이라고 생각했으나, 해당 토큰을 발급 받는 과정부터 많은 문제를 겪었다.
이번에도 거의 즉각적으로 해당 문제에 대한 피드백을 받았고 고정 IP를 받았지만, 해당 IP로 인터넷에 접속이 되질 않는 오류를 겪었다.
어쩔 수 없이 기술 지원팀에게 상담을 요청하였고, 기술 지원팀에서도 보내드린 스크린샷에서는 특이점을 찾지 못하였다고 하였고, 직접 와서 봐주신다 하였다.
결국 기술 지원팀 직원분이 말씀한대로 내가 잘못 입력을 하고 있는 것이 아니라, 랜선에 이상이 있었던 것이 확인됐다.
랜선을 새것으로 교체하니 바로 고정 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());
해당 방식으로 토큰을 정상적으로 발급 받을 수 있었다.
아직까지 처음 실행했던 두 방식에 어떤 문제가 있는지 찾지 못하였다.
혹시나 이 글을 보는 사람 중 무슨 문제가 있는지 알고 있는 사람은 답글을 달아 주실 수 있으면 감사하겠습니다.
안녕하세요. 저도 같은임무를 받았는데 도움을 구할수있을까요 ??
9078807@naver.com 메일주시면 감사하겠습니다..