본문 바로가기
Spring/10. rest-api

Controller 와 FeignClient에서의 @PathVariable 역할

by 989898 2025. 3. 17.
프런트 단에서 게이트웨이로 FeignClient로 호출할 때 url에 적은 id를 FeignClient로 전달하고 싶은데 도대체 어떻게 전달해야하는지 모르겠네

 

현재 코드에서 FeignClient를 통해 URL의 PathVariable을 전달하려면 FeignClient 인터페이스의 메소드에도 @PathVariable을 명시적으로 선언해야 합니다.

 

다음과 같이 수정하면 됩니다.

수정 전 코드

@FeignClient(name = "apigateway-service", url = "http://localhost:8000")
public interface GatewayFeignClient {
    @GetMapping("/my-blog")
    String getMyBlogData();
}
 

수정 후 코드

@FeignClient(name = "apigateway-service", url = "http://localhost:8000")
public interface GatewayFeignClient {
    @GetMapping("/my-blog/{id}")
    String getMyBlogData(@PathVariable("id") Long id);
}
 

변경 이유

  • FeignClient에서 URL의 {}로 감싼 경로 변수(PathVariable)를 사용할 때는 반드시 메소드 파라미터에 @PathVariable("변수명")으로 명시적으로 선언해야 합니다.
  • 이렇게 하지 않으면 Feign이 어떤 파라미터를 URL의 어떤 위치에 매핑해야 하는지 알 수 없기 때문에 에러가 발생합니다.

이렇게 수정하면 프런트 컨트롤러에서 전달받은 id 값을 FeignClient가 호출하는 URL의 {id} 부분에 정확히 매핑하여 전달할 수 있습니다.


아 원래 @PathVariable에서는 url에 있던 그러니까 예를 들면 @GetMapping("/{id}") 이렇게 적용한 id를 @PathVariable로 @PathVariable("id") Long blogId 이렇게 blogId로 가져왔는데 @FeignClient에서는 반대로 매핑할 id를 @PathVariable로 적용해주는거구나??

 

네, 정확히 이해하셨습니다!

@FeignClient에서는 URL 경로에 포함된 PathVariable을 메서드의 파라미터와 매핑해주기 위해 @PathVariable을 사용합니다. 이 과정은 일반적인 Spring Controller에서 @PathVariable을 사용하는 방식과 비슷하지만, 약간의 차이가 있습니다.

Spring Controller와 FeignClient의 차이점

  • Spring Controller
    • URL에 정의된 {id}를 메서드 파라미터로 가져오기 위해 @PathVariable을 사용합니다.
    • 여기서 URL의 {id}는 @PathVariable("id")와 매핑되어 blogId로 전달됩니다.
@GetMapping("/{id}")
public String getBlog(@PathVariable("id") Long blogId) {
    return "Blog ID: " + blogId;
}
  • FeignClient
    • FeignClient에서는 API 호출 시 URL에 포함될 PathVariable 값을 메서드 파라미터로 전달하기 위해 @PathVariable을 사용합니다.
       
    • 여기서 메서드 호출 시 전달된 id 값이 URL의 {id} 부분에 매핑됩니다.
@FeignClient(name = "apigateway-service", url = "http://localhost:8000")
public interface GatewayFeignClient {
    @GetMapping("/my-blog/{id}")
    String getMyBlogData(@PathVariable("id") Long id);
}

정리

  • Spring Controller에서는 클라이언트가 보낸 요청 URL에서 값을 추출하기 위해 @PathVariable을 사용합니다.
  • FeignClient에서는 메서드 호출 시 전달된 값을 URL에 삽입하기 위해 @PathVariable을 사용합니다.

즉, Controller는 URL에서 값을 가져오는 역할이고, FeignClient는 값을 URL에 삽입하는 역할이라고 이해하면 됩니다.