RestClient를 접한 후, 정말 유용하고 편하게 사용하고 있었다.
하지만 WebClient도, RestClient도 레퍼런스가 많이 없다보니 계속 실습하며 공부해야 하는데,
꼼꼼이 학습을 하지 않아 나와 같은 난관에 빠진 사람들에게 공유하고자,
그리고 이 일을 길이길이 기억하고자 글을 작성한다...
😵 마주한 문제
공공데이터포털의 '한국관광공사 국문 관광정보 서비스'를 이용하기 위해 외부 API와 연결하려고 작성한 코드.
Spring Document의 RestClient 문서를 보면 defaultUriVariables
는
'Configure default URL variable values to use when expanding URI templates with a Map'
(Map으로 URI 템플릿을 확장할 때 사용할 기본 URL 변수 값을 구성합니다.)
라고 설명하니 대충 맞는 거 같고,
필요 Parameter 값도 다 들어갔고, 오타도 하나 없는데
이상하게 30 : SERVICE_KEY_IS_NOT_REGISTERED_ERROR 에러를 마주했다.
이유를 찾고자 exchange()
메소드를 통해 URI를 출력 해보았는데
왜인지 Path Parameter가 찍히지 않았다.
System.out.println(Optional.of(restClient.get()
.uri("/areaCode1")
.exchange((clientRequest, clientResponse) -> clientRequest.getURI().toString())));
// console
Optional[https://apis.data.go.kr/B551011/KorService1/areaCode1]
원래 출력이 안 되나 defaultUriVariables
는...? 라고 생각해
이번에는 build할 때가 아니라 get할 때 직접적으로 Parameter를 넣고 출력 해보았다.
그런데 이게 웬일인지... 너무나 좋은 기능 (어쩌면 아닐지도) 덕분에
인코딩 된 Key를 넣었는데, RestClient에서 한번 더 인코딩 해주어/
특수문자를 인코딩한 %2F
가, %25F
로 변경되어 전달된 것이다.
(%25
는 %
특수문자가 인코딩된 것이다.)
그렇다고 디코딩 된 Key를 넣으면, 또 /
문자를 구분자로 보고 인코딩하지 않아
이도저도 못하게 된 것이다.
🤔 해결 방법...?
https://wpioneer.tistory.com/222
[Spring Boot] WebClient 파라미터 인코딩 하는법
WebClient를 사용해서 그냥 호출하게 되면 인코딩을 하지 않아 API 키가 달라지는 경우가 생길수가 있다. 나같은 경우에 그 문제 때문에 골머리를 앓았는데 아래와 같은 방법으로 해결했다. 일단 Uri
wpioneer.tistory.com
위 글을 참고하여 DefaultUriBuilderFactory
를 만드니 어찌저찌 해결은 됐지만,
아냐...! 난 이렇게 복잡하게 RestClient를 쓰고 싶었던 게 아니라구!
난 사실 꿀 빨면서 간단하게 통신하려고 RestClient를 쓰는 거란 말야!
그리고 이 방법을 적용해 다시 처음 RestClient를 build할 때의 defaultUriVariables
를 사용하려 하지만,
다시금 마주하는 SERVICE_KEY_IS_NOT_REGISTERED_ERROR 에러...
💡 해결 방법_최종_최최종_진짜최종
내가 바보였던 걸 인정하고 싶진 않지만 이것도 학습의 과정이니까...
문제는 인코딩, 디코딩 설정 이런 복잡한 것이 아니라
그저 defaultUriVariables
의 사용법이 잘못된 것이였다.
단순히 param을 추가해주는 메소드가 아니라,
위 코드와 같이 URL 변수가 들어갈 구역을 미리 설정해두어야
해당 변수 구역에 Map에서 초기화한 value들이 들어가는 것이였다...! (머쓲^^;)
삽입된 변수값은 인코딩이 되지만,
내가 고민했던 /
가 인코딩이 안돼요!!! 빼액! 같은 일은 일어나지 않는다.
즉, 변수 처리한 문자열은 /
특수문자도 %2F
로 잘 인코딩이 된다는 것이다.
내 무지에서 일어난 실수지만, 이것을 계기로
defaultUriVariables
사용법과 인코딩 디코딩 어쩌구.... 는 절대로 까먹지 않을 듯 하다.
두고보자 RestClient~~~!!
'프레임워크 및 라이브러리 > Spring' 카테고리의 다른 글
RuntimeException : Cannot invoke "*" because "*" is null 해결 (0) | 2024.07.17 |
---|---|
[MyBatis] MyBatis 초기 설정하기 (2) | 2024.07.08 |
[MyBatis] argument type mismatch (0) | 2024.07.01 |
WebClient를 사용하지 않게 된 이유, 그리고 RestClient (1) | 2024.03.27 |
application.properties (0) | 2024.03.15 |