IT/Spring Boot

FeignClient 사용시 GET요청시 인자를 추가하기 (@SpringQueryMap)

주현태 2022. 2. 27. 22:22

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

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

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

  • MyController
  • MyFeign
  • MyParam
@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("요청을 보냈습니다.");
    }
}
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);
}
@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에 다음과 같이 요청을 하였다.

$ curl localhost:8080/request

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

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


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

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

 

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