[Spring / Project / ERROR] - 카카오 로그인 Open API 동의 항목 선택 에러 (개인정보 제공동의로 인한 응답 에러)
by nam_ji2024. 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]
이런 에러로 일단 NullPointerException을 보고 빈 값이 넘어와서 생기는 문제라고 추측했습니다.
에러를 더 살펴보고 KakaoService.java:131 이 부분과 KakaoService.java:42, UserController.java:88 이 부분을 먼저 살펴보기로 했습니다.
KakaoService.java:131 이 위치를 찾아가보니 인증 코드를 요청하고 반환 받은 후 토큰 요청하고 반환 받는 부분의 이메일인 것을 알 수 있었습니다.
그래서 이메일 정보를 잘 받아오는지 확인하기 위해 콘솔에 정보를 조회해 봤습니다. (이메일 null 값 확인)
이메일 null 값 확인하고 다른 값들도 혹시 몰라 콘솔에 조회해 봤지만 다른 값들의 정보는 잘 받고 있는 것을 확인하여 이메일 부분에 문제가 있을거라 생각하고 기능 구현 과정을 생각해봤습니다.
처음 카카오 디벨로퍼에서 개인정보 동의항목을 선택했을 때 로그인 하려는 유저 닉네임과 이메일 정보를 받을 수 있게 선택하는 설정을 했습니다. 이때 닉네임을 필수 선택으로 두고 이메일은 필수 선택이 아니게 설정해서 이메일은 정보제공 동의하지 않아도 로그인 요청을 할 수 있게 설정되었고,
이로 인해 평소 선택 부분은 선택하지 않았던 습관이 여기서도 선택하지 않아 이메일 정보를 제공하지 않겠다라고 요청인 된 것을 알 수 있었습니다.
그래서 혹시나 하는 마음에 카카오톡 연결된 서비스를 확인해보니 이미 제 프로젝트와 연결되어 있었고 이 연결된 설정값은 이메일 제공 동의를 하지 않는다는 설정을 갖고 있기 때문에 생기는 에러였습니다.
로직상에서 이메일을 처리하는 부분을 없애도 되지만 이런 에러를 마주했을 때는 해결하는 방법을 찾는 것을 좋아하기 때문에 해결방법을 생각해 봤습니다.
해결 과정
저장된 쿠키와 사용기록 등 모든 정보를 삭제해 봤습니다. 설정 -> 보안 관련 카테고리 선택 -> 저장된 모든 정보를 삭제하기 위해 선택할 수 있는 선택란 전부 체크 후 삭제
위 방법으로 해결되지 않아 카카오톡 계정을 확인해 봤습니다.
카카오톡 -> 설정 -> 카카오계정 -> 로그인 관리
위 과정을 거쳐 들어가 보니 제 프로젝트로 로그인된 기록이 있는 것을 확인하고 카카오에 내가 잘못 설정한 값이 저장되어 있어 생기는 에러라고 추측하고 여기서는 삭제되지 않아 다른 방법을 찾아봤습니다.
카카오톡 -> 설정 -> 카카오계정 -> 연결된 서비스 관리 -> 내 프로젝트 -> 연결 끊기
위 방법을 통해서 연결을 끊고 다시 로그인 시도를 해보니 개인정보 제공동의 항목을 출력되고 모두 선택 후 로그인 해보니 제대로 로그인된 것을 확인할 수 있었습니다.
회고
항상 에러를 마주하면 시간을 엄청 오래 썼지만 요즘은 에러를 마주해도 비슷한 에러들을 많이 마주해서 빠르게 해결할 수 있었습니다. 하지만 이번 에러는 문제의 원인은 빠르게 추측할 수 있었지만 어디서 어떻게 해결해야 할지 막막한 부분이 있어 시간을 좀 많이 사용해서 해결했습니다. 그래서 처음부터 기능 구현하면서 테스트 해보고 성공하면 다음 기능 구현해보고 하는 과정들을 생각하며 로직을 따라가보면 에러와 가까워질 수 있다는 것을 알게되는 시간이었습니다. 또 새로운 에러를 마주하게 된다면 내가 기능 구현했던 과정을 생각하며 에러를 잡으려고 할 것 같습니다.