@FeignClient 활용하기

pitseleh·2025년 5월 27일
post-thumbnail

MSA 환경에서 개발을 할 때 가장 난감한 상황은 Bank 서비스가 User 서비스의 사용자 정보를 조회해야 하는 상황이 상당히 많았다는 것이다. 계좌 조회 시 사용자 이름이 필요하고, 이체 시 수신자 정보를 확인해야 하는 등 서비스 간 데이터 연동이 필수적이었다. 이렇게 MSA 환경에서 다른 마이크로서비스의 API를 호출하려면 어떻게 해야 할까?

1. @FeignClient

🔍 @FeignClient란?

Netflix에서 개발한 선언적 HTTP 클라이언트로, 이때 선언적이라는 것의 의미는 어떻게(How) 구현할지가 아닌 무엇을(What) 할지만 정의하면 되는 방식이다.

// 선언적 방식 - 인터페이스만 정의
@FeignClient(name = "user-service")
public interface UserServiceClient {
    @GetMapping("/api/user/login")
    UserInfoResponse loginUser(@RequestParam("userId") Integer userId);
}

// 명령적 방식 - 구체적인 구현 필요 (RestTemplate)
public UserInfoResponse loginUser(Integer userId) {
    String url = "http://user-service:7001/api/user/login?userId=" + userId;
    // 복잡한 HTTP 호출 로직 필요
}

2. 구현 방법

@FeignClient(name = "user-service", url = "${api.user-url}")
public interface UserServiceClient {

    @GetMapping("/api/user/login")
    ResponseEntity<ApiResponse<UserInfoResponse>> loginUser(@RequestParam("userId") Integer userId);

    @GetMapping("/api/user/fetch/users")
    ResponseEntity<ApiResponse<UserInfoListResponse>> fetchUserInfoByName(@RequestParam("userName") String userName);
}

name은 Eureka에 등록된 서비스 이름으로 지정했다. url 역시 설정파일에 등록한 url을 가져왔다. 활용할 때는 아래와 같이 단순하게 호출하면 된다. 사용 방법이 상당히 간단하다.

@Service
@RequiredArgsConstructor
@Slf4j
public class UserInfoService {
    private final UserServiceClient userServiceClient;

    public UserInfoResponse getUserInfoById(Integer userId) {
        ResponseEntity<ApiResponse<UserInfoResponse>> response = userServiceClient.loginUser(userId);
        return response.getBody().getData();
    }
}

0개의 댓글