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를 하였더니 아래와 같이 원하는 결과를 얻을 수 있었다.