본문 바로가기
Error

[Spring / Project / ERROR] - 카카오 로그인 Open API 동의 항목 선택 에러 (개인정보 제공동의로 인한 응답 에러)

by nam_ji 2024. 2. 20.

개인정보 제공동의 미선택으로 인한 NullPointerException 에러 발생

카카오 로그인 API 흐름

  • 로그인 회원가입 기능을 구현하고 추가로 카카오 로그인 Open API를 이용하여 카카오 로그인도 시도해보려고 했습니다.
  • 카카오 로그인의 흐름은
    이렇게 인증 코드를 요청하면 인증 코드를 반환 받고 반환 받은 인증 코드를 JWT 토큰에 담을 수 있게 재요청을 합니다.
    인증 코드를 토큰에 담아 반환 받으면 토큰을 통해 카카오 로그인을 하는 흐름입니다.

카카오 로그인 API 사용하면서 발생한 에러

  • 여기서 생겼던 문제의 에러는
    2024-02-21T01:08:40.954+09:00 ERROR 4528 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.NullPointerException: Cannot invoke "com.fasterxml.jackson.databind.JsonNode.asText()" because the return value of "com.fasterxml.jackson.databind.JsonNode.get(String)" is null] with root cause
    
    java.lang.NullPointerException: Cannot invoke "com.fasterxml.jackson.databind.JsonNode.asText()" because the return value of "com.fasterxml.jackson.databind.JsonNode.get(String)" is null
    	at com.sparta.myselectshop.service.KakaoService.getKakaoUserInfo(KakaoService.java:131) ~[main/:na]
    	at com.sparta.myselectshop.service.KakaoService.kakaoLogin(KakaoService.java:42) ~[main/:na]
    	at com.sparta.myselectshop.controller.UserController.kakaoLogin(UserController.java:88) ~[main/:na]
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:261) ~[spring-web-6.1.3.jar:6.1.3]
    	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:189) ~[spring-web-6.1.3.jar:6.1.3]
    	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.3.jar:6.1.3]
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:917) ~[spring-webmvc-6.1.3.jar:6.1.3]
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:829) ~[spring-webmvc-6.1.3.jar:6.1.3]
    	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.3.jar:6.1.3]
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.3.jar:6.1.3]
    	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.3.jar:6.1.3]
    	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.3.jar:6.1.3]
    	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.3.jar:6.1.3]​
     
    1. 이런 에러로 일단 NullPointerException을 보고 빈 값이 넘어와서 생기는 문제라고 추측했습니다.
    2. 에러를 더 살펴보고 KakaoService.java:131 이 부분과 KakaoService.java:42, UserController.java:88 이 부분을 먼저 살펴보기로 했습니다.
    3. KakaoService.java:131 이 위치를 찾아가보니 인증 코드를 요청하고 반환 받은 후 토큰 요청하고 반환 받는 부분의 이메일인 것을 알 수 있었습니다.
    4. 그래서 이메일 정보를 잘 받아오는지 확인하기 위해 콘솔에 정보를 조회해 봤습니다. (이메일 null 값 확인)
  • 이메일 null 값 확인하고 다른 값들도 혹시 몰라 콘솔에 조회해 봤지만 다른 값들의 정보는 잘 받고 있는 것을 확인하여 이메일 부분에 문제가 있을거라 생각하고 기능 구현 과정을 생각해봤습니다.
  • 처음 카카오 디벨로퍼에서 개인정보 동의항목을 선택했을 때 로그인 하려는 유저 닉네임과 이메일 정보를 받을 수 있게 선택하는 설정을 했습니다.
    이때 닉네임을 필수 선택으로 두고 이메일은 필수 선택이 아니게 설정해서 이메일은 정보제공 동의하지 않아도 로그인 요청을 할 수 있게 설정되었고,
    이로 인해 평소 선택 부분은 선택하지 않았던 습관이 여기서도 선택하지 않아 이메일 정보를 제공하지 않겠다라고 요청인 된 것을 알 수 있었습니다.
  • 그래서 혹시나 하는 마음에 카카오톡 연결된 서비스를 확인해보니 이미 제 프로젝트와 연결되어 있었고 이 연결된 설정값은 이메일 제공 동의를 하지 않는다는 설정을 갖고 있기 때문에 생기는 에러였습니다.
  • 로직상에서 이메일을 처리하는 부분을 없애도 되지만 이런 에러를 마주했을 때는 해결하는 방법을 찾는 것을 좋아하기 때문에 해결방법을 생각해 봤습니다.

해결 과정

  • 저장된 쿠키와 사용기록 등 모든 정보를 삭제해 봤습니다.
    설정 -> 보안 관련 카테고리 선택 -> 저장된 모든 정보를 삭제하기 위해 선택할 수 있는 선택란 전부 체크 후 삭제
  • 위 방법으로 해결되지 않아 카카오톡 계정을 확인해 봤습니다.
  • 카카오톡 -> 설정 -> 카카오계정 -> 로그인 관리
  • 위 과정을 거쳐 들어가 보니 제 프로젝트로 로그인된 기록이 있는 것을 확인하고 카카오에 내가 잘못 설정한 값이 저장되어 있어 생기는 에러라고 추측하고 여기서는 삭제되지 않아 다른 방법을 찾아봤습니다.
  • 카카오톡 -> 설정 -> 카카오계정 -> 연결된 서비스 관리 -> 내 프로젝트 -> 연결 끊기
  • 위 방법을 통해서 연결을 끊고 다시 로그인 시도를 해보니 개인정보 제공동의 항목을 출력되고 모두 선택 후 로그인 해보니 제대로 로그인된 것을 확인할 수 있었습니다.

회고

  • 항상 에러를 마주하면 시간을 엄청 오래 썼지만 요즘은 에러를 마주해도 비슷한 에러들을 많이 마주해서 빠르게 해결할 수 있었습니다.
    하지만 이번 에러는 문제의 원인은 빠르게 추측할 수 있었지만 어디서 어떻게 해결해야 할지 막막한 부분이 있어 시간을 좀 많이 사용해서 해결했습니다.
    그래서 처음부터 기능 구현하면서 테스트 해보고 성공하면 다음 기능 구현해보고 하는 과정들을 생각하며 로직을 따라가보면 에러와 가까워질 수 있다는 것을 알게되는 시간이었습니다.
    또 새로운 에러를 마주하게 된다면 내가 기능 구현했던 과정을 생각하며 에러를 잡으려고 할 것 같습니다.