본문 바로가기
언어, 환경별 예제 코드

[rest api 예제] java (spring boot) - 카카오 로그인, 카카오 친구목록 조회, 나에게 메시지 발송

by kakao-TAM 2021. 8. 6.

JAVA (Spring Boot)로 “카카오 로그인, 카카오 카카오 친구목록 조회, 나에게 메시지 발송” 테스트 해볼 수 있는 간단한 예제입니다.

kakao_rest_api_example_java.zip (112.0 KB)

[실행방법]

  1. STS4를 받아 설치합니다. https://spring.io/tools
  2. kakao_rest_api_example.java.zip 파일을 받아 압축을 푼 후, STS에서 import 합니다. "File > Import > Gradle(Existing Gradle Project) " 예제 폴더 설정
  3. 내 애플리케이션 > 앱 설정 > 요약 정보 > "REST API 키"를 복사해서 application.properties 파일 rest-api-key 항목에 설정합니다.
  4. 내 애플리케이션>제품 설정>카카오 로그인 > Redirect URI에 http://localhost:8080/login-callback 주소를 설정합니다.
  5. gradle refresh 후, Run As > Spring Boot App 실행
  6. http://localhost:8080/index.html 에 접속합니다.

[실행결과]

HttpCallService

@Service
public class HttpCallService {

    public String Call(String method, String reqURL, String header, String param) {
        String result = "";
        try {
            String response = "";
            URL url = new URL(reqURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod(method);
            conn.setRequestProperty("Authorization", header);
            if(param != null) {
                System.out.println("param : " + param);
                conn.setDoOutput(true);
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
                bw.write(param);
                bw.flush();                

            }
            int responseCode = conn.getResponseCode();
            System.out.println("responseCode : " + responseCode);

            System.out.println("reqURL : " + reqURL);
            System.out.println("method : " + method);
            System.out.println("Authorization : " + header);            
            InputStream stream = conn.getErrorStream();
            if (stream != null) {
                try (Scanner scanner = new Scanner(stream)) {
                    scanner.useDelimiter("\\Z");
                    response = scanner.next();
                }            
                System.out.println("error response : " + response);
            }
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = "";
            while ((line = br.readLine()) != null) {
                result += line;
            }
            System.out.println("response body : " + result);

            br.close();
        } catch (IOException e) {
            return e.getMessage();
        }
        return result;
    }    

    public String CallwithToken(String method, String reqURL, String access_Token) {
        return CallwithToken(method, reqURL, access_Token, null);
    }    

    public String CallwithToken(String method, String reqURL, String access_Token, String param) {
        String header = "Bearer " + access_Token;
        return Call(method, reqURL, header, param);
    }        
}

KakaoService

@RequiredArgsConstructor
@Service
public class KakaoService {

    private final HttpSession httpSession;    

    @Autowired
    public HttpCallService httpCallService;


    @Value("${rest-api-key}")
    private String REST_API_KEY;

    @Value("${redirect-uri}")
    private String REDIRECT_URI;    

    @Value("${authorize-uri}")
    private String AUTHORIZE_URI;        

    @Value("${token-uri}")
    public String TOKEN_URI;            

    @Value("${client-secret}")
    private String CLIENT_SECRET;    

    @Value("${kakao-api-host}")
    private String KAKAO_API_HOST;    


    public RedirectView goKakaoOAuth() {
       return goKakaoOAuth("");
    }

    public RedirectView goKakaoOAuth(String scope) {

       String uri = AUTHORIZE_URI+"?redirect_uri="+REDIRECT_URI+"&response_type=code&client_id="+REST_API_KEY;
       if(!scope.isEmpty()) uri += "&scope="+scope;

       return new RedirectView(uri);
    }    

    public RedirectView loginCallback(String code) {    
        String param = "grant_type=authorization_code&client_id="+REST_API_KEY+"&redirect_uri="+REDIRECT_URI+"&client_secret="+CLIENT_SECRET+"&code="+code;
        String rtn = httpCallService.Call(Const.POST, TOKEN_URI, Const.EMPTY, param);
        httpSession.setAttribute("token", Trans.token(rtn, new JsonParser()));             
        return new RedirectView("/index.html");
    }

    public String getProfile() {    
        String uri = KAKAO_API_HOST + "/v2/user/me";
        return httpCallService.CallwithToken(Const.GET, uri, httpSession.getAttribute("token").toString());
    }

    public String getFriends() {    
        String uri = KAKAO_API_HOST + "/v1/api/talk/friends";
        return httpCallService.CallwithToken(Const.GET, uri, httpSession.getAttribute("token").toString());
    }    

    public String message() {    
        String uri = KAKAO_API_HOST + "/v2/api/talk/memo/default/send";
        return httpCallService.CallwithToken(Const.POST, uri, httpSession.getAttribute("token").toString(), Trans.default_msg_param);
    }        
}

로그인에 관한 가이드 : https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
친구목록 관한 가이드 : https://developers.kakao.com/docs/latest/ko/kakaotalk-social/rest-api#get-friends
메시지에 관한 가이드 : https://developers.kakao.com/docs/latest/ko/message/rest-api

KOE006 에러 : https://devtalk.kakao.com/t/koe006/114778
친구목록, 메시지 API 자주 겪는 에러 : https://devtalk.kakao.com/t/faq-api-api/82152?source_topic_id=109558
메시지 API 권한 신청 방법 : https://devtalk.kakao.com/t/api-how-to-request-permission-for-messaging-api/80421?source_topic_id=115052

댓글