카테고리 없음

Kotlin환경에서 WebClient 사용시 Multi HttpHeader 설정하기

martial 2022. 9. 27. 15:20

안녕하세요.

 

이번 프로젝트를 진행중에 Kotlin/Spring 환경에서 Kakao Oauth2로 소셜로그인 서비스를 구현하는 일이 있어서

구현하던 도중 WebClient로 다중 Header를 설정해주는데 문제가 발생해서 이 문제를 해결하는 방법에 대해 포스팅 하려고 합니다.

 

제 포스팅을 통해서 여러분들이 해답을 찾으셨으면 좋겠네요. 서론이 길었습니다. 시작하도록 하겠습니다!

 

제가 에러를 마주한 환경은 다음과 같습니다.

 

 

WebClient 객체를 생성해서 kauth host에 token을 요청하는 WebClient를 짜던 도중

header lambda에 contentType과 acceptCharset에 대한 파라미터를 set해주려 하는데 빨간색 밑줄과 함께 에러가 감지되었습니다.

 

무슨 문제인가 하고 Error가 발생한 이유를 읽어보았습니다.

 

Error 메세지는 다음과 같았습니다.

한글로 번역결과 "확인되지 않은 참조입니다. 수신기 유형 불일치로 인해 다음 후보 중 해당되지 않습니다." 라고 나와있네요.

 

여기서 한번 더 변역해보자면 parameter의 유형이 HttpHeaders에서 제공하지 않는 parameter라는 error인거 같은데요.

그래서 직접 HttpHeaders 구현 class에 참조해서 확인해보았습니다.

확인 해본 결과 존재합니다. Parameter 타입도 똑같이 MediaType을 받는데요 도대체 무슨 문제인가 싶었습니다.

그래서 Kotlin 환경에서 다중 Header를 setting한 코드를 참고하고싶어서 구글링을 시작했습니다.

 

구글링 결과 headers를 통해 다중 header를 setting한 포스팅은 보이지가 않았습니다. 근데 여기서

이상한 점 하나를 발견했습니다. 다중 header는 아니었지만 한가지의 header를 설정해준 포스팅에서 

 

contentType을 setContentType 메서드를 통해서 해주는걸 확인했습니다.

근데 제가 배우기론 kotlin에선 getter,setter의 경우 get,set 키워드는 제거되어있는 형태로 사용되는걸로 알고 있었습니다.

 

물론 위에 HttpHeaders 구현체는 Java로 구현되어 있기 때문에 contentType을 setting 해주는 메서드 명이 setContentType인건 알지만

kotlin을 사용하는 제 환경의 ide 상에선 setContentType 메서드를 제공해주지 않습니다.

 

그래서 속는셈 치고 한번 setContentType으로 메서드명을 변경해봤습니다.

빨간 에러 메세지에서 경고메세지로 바뀌었습니다. 그래서 한번 hint를 확인해보았습니다.

허용된 문법을 사용하라는 힌트가 발견되었습니다. 

그래서 한번 클릭해 보니

이렇게 ide가 자동으로 변환해주었습니다. 파라미터를 받는 형식의 method setter가 아닌 그냥 equals로 대입받는 형식의 setter 였네요. 기존 java환경에서만 개발하다 보니 kotlin의 setter에 대해 무지로 발생한 상황이네요.. 오늘도 또 하나 알아갑니다!!

 

저는 추가로 headers lambda를 it를 사용해서 refactoring 하였습니다.

 

++ 아래의 acceptCharset같은 경우도 같은 원인이고 같은 방법으로 해결하였습니다.

 

제 블로그를 보고 해당 사실에 대해 알아가셨으면 하는 바램입니다. 

혹여 제가 놓친 부분이 있거나, 틀린 말이 있다면 댓글로 피드백 부탁드립니다!