느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라
article thumbnail

FeignClient를 사용할때 @GetMapping을 이용하고, 객체를 전달하도록 인자로 전달하였으나, 뭔가 자동으로 POST요청으로 전달되는 것으로 보였다.

다음의 예제는 해당 문제를 재현하기위한 코드들이다.

이 재현 코드에는 총 세개의 클래스가 쓰였다.

  • MyController
  • MyFeign
  • MyParam
<code />
@RestController public class MyController { private final MyFeign feign; @Autowired public MyController(MyFeign feign) { this.feign = feign; } @GetMapping("/test") public void getTest(MyParam param) { System.out.println(String.format("get 요청이 들어왔습니다. : %s", param)); } @PostMapping("/test") public void postTest(MyParam param) { System.out.println(String.format("post 요청이 들어왔습니다. : %s", param)); } @GetMapping("/request") public void request() { MyParam build = MyParam.builder() .val1("val1") .val2("val2") .build(); feign.request(build); System.out.println("요청을 보냈습니다."); } }
<code />
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(url = "http://localhost:8080", name = "myFeign") public interface MyFeign { @GetMapping("/test") void request(MyParam param); }
<code />
@Getter @Setter @ToString @NoArgsConstructor public class MyParam { String val1; String val2; @Builder public MyParam(String val1, String val2) { this.val1 = val1; this.val2 = val2; } }

아래와같이 MyController에 Feign요청을 하는 메소드인 request에 다음과 같이 요청을 하였다.

<code />
$ curl localhost:8080/request

Get 요청을 하였고, Param에 값이 들어있는데도 불구하고 POST요청으로 요청이 갔고 안의 값들도 null인 기대하지 않는 결과가 나왔다.

이건의 경우 우리팀 한 분이 겪었던 문제였고, 해당 코드를 보아하니 @SpringQueryMap 이라는 어노테이션을 사용하였다.


이를 이용하여 아래와 같이 @SpringQueryMap 어노테이션을 사용하였다.

<code />
@FeignClient(url = "http://localhost:8080", name = "myFeign") public interface MyFeign { @GetMapping("/test") void request(@SpringQueryMap MyParam param); }

 

코드 수정후 재시작하여 위와 똑같이 curl로 request를 하였더니 아래와 같이 원하는 결과를 얻을 수 있었다.

 

 

profile

느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라

@주현태

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!