✏️ 발단
- Kakao API 를 사용한 인증 로직을 구현하기위해 Kakao 서버로 요청을 보내던중 Kakao 서버의 요청값들이 스네이크 케이스를 사용하는 사실을 알게됬다.
- Kakao 서버는 파이썬을 사용하기 때문에 스네이크 케이스를 사용하는 것으로 보인다.
🔗 Kakao 서버가 요구하는 파라미터값
- 문제는 내가 사용하는 언어는 Java 고, 컨벤션룰에서 카멜 케이스를 사용하기로 이야기 됬다는 점이다.
- 소스코드 내에서는 카멜 케이스를 유지하면서 직렬화시 스네이크 케이스로 변경시킬 필요가 있었다.
@Getter
@AllArgsConstructor
public class KakaoTokenRequest {
private String grant_type;
private String client_id;
private String redirect_uri;
private String client_secret;
private String code;
}
✏️ JsonProperty
- jackson 라이브러리의 어노테이션으로,
JSON 속성과 Java 객체의 필드를 매핑할 수 있다.
- 아래와 같이 직렬화와 역직렬화 모두 사용이 가능하다고 한다.
@Getter
@AllArgsConstructor
public class KakaoTokenRequest {
@JsonProperty("grant_type")
private String grantType;
...
}
@Getter
public class KakaoTokenResponse {
@JsonProperty("token_type")
private String tokenType;
...
}
📍 직렬화에 실패하는 경우
- 위와같이 설정 후 요청을 보내면 대부분 성공하지만,
컨텐츠 타입이 application/x-www-form-urlencoded
인 경우에 직렬화에 실패했다.
- 역직렬화는 성공했다.
@FeignClient(name = "kakaoToken", url = "${kakao.feign.token_url}")
public interface KakaoTokenClient {
@PostMapping(value = "${kakao.feign.req_token}", consumes = "application/x-www-form-urlencoded")
KakaoTokenResponse getToken(@RequestBody KakaoTokenRequest body);
}
application/x-www-form-urlencoded
은 주로 폼 데이터를 전송하는데 사용되는 타입이므로 아래와 같은 형태로 인코딩하여 전송한다.
"key1=value1&key2=value2"
- 하지만 @JsonProperty 는 JSON 형식을 주로 지원하기 때문에 아래와 같은 형태로 인코딩한다.
"key": "value"
- @FormProperty 는 feign 라이브러리에서 제공하는 어노테이션으로,
application/x-www-form-urlencoded
컨텐츠 타입에서 직렬화시 사용할 수 있다.
- 아래와 같이 수정해주니 직렬화도 성공했다.
@Getter
@AllArgsConstructor
public class KakaoTokenRequest {
@FormProperty("grant_type")
private String grantType;
...
}