java.net.UnknownHostException: Failed to resolve 'https:' [A(1)] after 4 queries
예외 오류가 발생했다. 해당 오류 코드를 자세히 읽어봤지만 파악하기가 쉽지 않았다. 그래서 구글링 결과 해당 오류는 다음과 같은 문제로 일어난다는 것을 알게 됬다.
3개의 가능성 때문에 UnknownHostException이 발생한다고 했다.
'https:' [A(1)] after 4 queries
이 부분을 이해하기는 힘들지만 URI에 문제가 있을 수도 있다고 했다. 그러나 정확히 잘 알지 못하기 때문에 우선 1번과 2번을 체크해 보기로 했다.
이미 기입했던 내용이긴 하지만 혹시 몰라kakao developer 문서에서 다시 한번 access token을 얻기 위한 정보를 확인했다.
이를 이용해 postman을 작성했다.
결과가 아주 잘 출력됨을 알 수 있다.
그렇다면 내가 정의한 request에 문제가 있음을 느꼈다.
UriBuilder를 통해 uri가 만들어지는 과정을 파악하는것이 쉽지 않았다. 그래서 UriBuilderFactory의 구현체인 DefaultUriBuilderFactory를 통해 WebClient에 적용되는 Uri를 직접 테스트해보았다.
내가 원하는 access token 요청 uri는
https://kauth.kakao.com/oauth/token
형태였다. 그러나 실제 출력결과는
https:/kauth.kakao.com/oauth/token
이 출력되었다.
encoding을 적용했음에도 이런 결과가 나오다니.. 멘붕이 왔다.
이를 해결하기 위해 UriBuilder를 파악할 필요가 있었다.
우선 의심이 되는 부분은 path() 메서드였다. 여기에 "///path"를 넣어서 "/"하나만 나온다면 이 부분이 확실히 문제가 된다.
살펴보니 역시 URI에 문제가 있었다. 실제 출력결과를 확인해보니
다음과 같이 /path로 출력됨을 알 수 있다. /// 중 / 2개가 생략된 것이다.
이 때문에 DefaultUriBuilderFactory에 대해서 찾아봤다.
URI(Uniform Resource Identifier)는 웹 기술에서 사용하는 논리적 또는 물리적 리소스를 식별하는 고유한 문자 시퀀스이다.
URI는 사람 및 장소와 같은 실제 개체, 개념 또는 웹 페이지 및 책과 같은 정보 리소스를 포함하여 모든 것을 식별하는 데 사용될 수 있습니다일부 URI는 네트워크(인터넷 또는 컴퓨터 파일 시스템이나 인트라넷과 같은 다른 개인 네트워크 ) 에서 정보 리소스를 찾고 검색하는 수단을 제공합니다.
URI는 고유한 식별자이고 이걸 통해 우리는 인터넷에서 해당 식별자를 통해 정보나 데이터를 얻기 위해 사용한다. 이 때 URI는 크게 3가지로 분류 할 수 있다.
네이버 도서 페이지의 URI를 가져와 보았다. 이때 https 프로토콜을 scheme으로 정의하고 초록색 부분은 호스트명 그리고 뒤는 Path이다.
UriBuilder는 상황에 따라 길고 복잡한 URI를 builder 패턴을 활용해 쉽게 작성해준다.
그래서 path() 메서드는 단순히 path를 추가해주는 method이다. 이를 추가하려면
.scheme()에 https를
.host()에 search.shopping.naver.com
.path()에 /book/home
이런 형태로 넣어주어야 한다.
굉장히 Uri를 직관적으로 설계가 가능하니 문자열로 모두 정의하는 것보다 편하고 안전하게 코드를 짤 수 있다.
나는 OAtuh2 Access token path를 application.yml에서 관리하고 ClientRegistration을 통해 관리하고 있다. 이 때 저장되어 있는 URI는 파라미터를 제외한 스키마와 호스트명이 합쳐진 URI다. 이를 한번에 인식해서 사용해야 한다.
그래서 직접 UriBuilder를 활용해 uri를 만들고 encode해서 uri를 만들고 요청했다.
controller를 만들어 postman으로 테스트해보니
잘 동작함을 알 수 있다.