JVM/Spring

[Spring] How to change the CamelCase to SnakeCase when i use POST form-url-encoded in Spring Cloud feign Client

Hyo Kim 2022. 7. 14. 12:21
728x90
반응형

😢 서론

<사진1> 두둥 넷플릭스

KakaoPay API 통신을 feign client를 통해 진행하는 중

POST로 form-urlencoded 타입으로 전송해야 하는데,

@JsonNaming 애노테이션이 form-urlencoded 타입에서는 정상적으로 작동하지 않아 해결한 내용을 정리해봅니다.. ㅜ

이 글은, feign Client를 통해 요청을 보내는 방법을 정리합니다.
본인의 서버 컨트롤러로 받는 방법으로는 여기 에서 많은 해결책이 나와있습니다. 참고 바랍니다!!

🫢 본론

FeignClient

@FeignClient(name = "kakaoPay", url = "https://kapi.kakao.com/v1", path = "/payment", configuration = CoreFeignConfiguration.class)
public interface KakaoPayClient {

	@RequestMapping(value = "/ready", method = POST,
		consumes = APPLICATION_FORM_URLENCODED_VALUE)
	@Headers("Content-Type: application/x-www-form-urlencoded;charset=utf-8")
	KakaoPayReadyResponse ready(@RequestHeader(value = "Authorization") String authorization, KakaoPayReadyRequest request);

}

 

기존 방식

@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
@JsonInclude(Include.NON_NULL)
public class SnakeCaseStrategy {

}

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class KakaoPayReadyRequest extends SnakeCaseStrategy {

	// 가맹점 코드
	@NotEmpty
	private String cid = "TC0ONETIME";

	// 가맹점 코드 인증키
	private String cidSecret;
    
    ...
    
}

KakaoPayReadyRequest 객체를 통해 전송할 때 @JsonNaming을 사용해서 보내려 했지만 변경이 안됐습니다.

Json 타입으로 보낼 때에만 정상적으로 작동하더군요..

 

그래서 열심히 찾아본 결과 해결책은 아래와 같습니다.

 

이렇게 하면 됩니다.

public class CoreFeignConfiguration {

	...
    
	@Bean
	Encoder formEncoder() {
		return new feign.form.FormEncoder();
	}

}

public class KakaoPayReadyRequest {

	// 가맹점 코드
	@NotEmpty
	private String cid = "TC0ONETIME";

	// 가맹점 코드 인증키
	@feign.form.FormProperty("cid_secret")
	private String cidSecret;

	// 가맹점 주문번호
	@NotEmpty
	@feign.form.FormProperty("partner_order_id")
	private String partnerOrderId;
    
    ...
}

 

Feign Client에서 사용하는 Configuration에 formEncoder() 메서드를 빈으로 등록 후에

@feign. form.FormProperty("...")를 모든 프로퍼티에 붙여 변경하는 방법을 취했습니다.

 

<사진2> 정상 변경

 

이 방법은 프로퍼티 별로 다 붙여줘야되는 단점이 있긴 하지만,

현재 제가 찾아본 다른 방법으로는 별도로 설정을 추가한다던지, 객체가 아닌 단일 프로퍼티로 전송한다던지 등

현재 방법이 그나마 제일 깔끔하다고 느꼈습니다.


🫣 결론

혹시 더 나은 방법을 알고 계신 분이 계시다면.. 댓글로 알려주시면 감사하겠습니다!!

 

언제나 피드백은 환영입니다!!

 

참고

 

728x90
반응형