DTO 직, 역직렬화 필드값 변환

알파로그·2024년 1월 29일
0

Spring Boot

목록 보기
55/57

✏️ 발단

  • 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

  • @FormProperty 는 feign 라이브러리에서 제공하는 어노테이션으로,
    application/x-www-form-urlencoded 컨텐츠 타입에서 직렬화시 사용할 수 있다.
    - 아래와 같이 수정해주니 직렬화도 성공했다.
@Getter
@AllArgsConstructor
public class KakaoTokenRequest {

    @FormProperty("grant_type")
    private String grantType;
		...
}
profile
잘못된 내용 PR 환영

0개의 댓글