IT IT 인터넷 spring mvc openFeignspring cloudmsarest apiresttemplate

http://java21.net/blog/marco?post_id=2422

OpenFeign 클라이언트 사용 가이드

OpenFeign에 대한 공식 문서를 기반으로 한 가이드를 작성하겠습니다. 공식 문서에 따라 OpenFeign을 설정하고 사용하는 방법을 단계별로 안내합니다.


OpenFeign 클라이언트 사용 가이드

OpenFeign은 선언적인 HTTP 클라이언트입니다. 이를 통해 RESTful 웹 서비스를 호출할 수 있습니다. Spring Cloud에서 Feign을 사용하면, @FeignClient 어노테이션을 사용해 쉽게 HTTP 요청을 보낼 수 있습니다.

1. 의존성 추가

먼저, OpenFeign을 프로젝트에 추가해야 합니다. Gradle 또는 Maven을 사용하여 의존성을 추가할 수 있습니다.

Gradle 사용 시:

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}

Maven 사용 시:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

2. @EnableFeignClients 활성화

OpenFeign을 사용하려면, Spring Boot 애플리케이션에서 Feign 클라이언트를 활성화해야 합니다. 이를 위해 @EnableFeignClients 어노테이션을 추가합니다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class FeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class, args);
    }
}

3. Feign 클라이언트 인터페이스 정의

Feign을 사용하려면 인터페이스를 정의해야 합니다. 이 인터페이스는 HTTP 요청을 정의하는 메서드를 포함합니다. 각 메서드는 HTTP 요청을 매핑하는 어노테이션을 사용하여 RESTful API를 호출할 수 있습니다.

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "example-client", url = "https://api.example.com")
public interface ExampleClient {

    @GetMapping("/data")
    String getData();
}

  • @FeignClient: Feign 클라이언트를 정의하는 어노테이션입니다. name은 클라이언트의 이름을 정의하며, url은 호출할 서비스의 URL을 설정합니다.

  • @GetMapping: HTTP GET 요청을 보낼 경로를 지정합니다.

4. Feign 클라이언트 사용

Feign 클라이언트를 정의한 후, 이를 서비스 클래스에 주입하여 사용할 수 있습니다. 클라이언트를 사용하여 실제로 외부 API를 호출합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ExampleService {

    private final ExampleClient exampleClient;

    @Autowired
    public ExampleService(ExampleClient exampleClient) {
        this.exampleClient = exampleClient;
    }

    public String fetchData() {
        return exampleClient.getData(); // Feign 클라이언트를 통해 API 호출
    }
}

5. Feign 설정

Feign의 동작 방식을 커스터마이즈하려면 application.properties 또는 application.yml에서 설정할 수 있습니다. 예를 들어, 타임아웃 설정이나 로깅을 추가할 수 있습니다.

타임아웃 설정

feign.client.config.default.connectTimeout=5000
feign.client.config.default.readTimeout=5000

  • connectTimeout: 서버에 연결할 때까지 기다리는 시간

  • readTimeout: 서버로부터 응답을 받을 때까지 기다리는 시간

로깅 설정

Feign의 로깅 수준을 설정하려면 다음과 같이 설정할 수 있습니다.

logging.level.com.example=DEBUG
logging.level.feign=DEBUG

커스터마이징된 Feign 설정

@FeignClient에서 configuration 속성을 사용하여 Feign의 설정을 커스터마이즈할 수 있습니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import feign.Logger;

@Configuration
public class FeignConfig {

    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL; // Feign의 로깅 수준을 FULL로 설정
    }
}

그리고 @FeignClient에서 해당 설정을 사용하도록 지정할 수 있습니다.

@FeignClient(name = "example-client", url = "https://api.example.com", configuration = FeignConfig.class)
public interface ExampleClient {
    @GetMapping("/data")
    String getData();
}

6. 오류 처리 및 Fallback

Feign 클라이언트에서 예외 처리나 장애가 발생했을 때 대체 응답을 제공하려면 fallback을 설정할 수 있습니다.

@FeignClient(name = "example-client", url = "https://api.example.com", fallback = ExampleClientFallback.class)
public interface ExampleClient {

    @GetMapping("/data")
    String getData();
}

@Component
public class ExampleClientFallback implements ExampleClient {

    @Override
    public String getData() {
        return "Fallback response"; // 오류 발생 시 대체 응답 반환
    }
}

ExampleClientFallback 클래스는 Feign 클라이언트가 정상적으로 동작하지 않을 경우 호출됩니다. 이를 통해 오류를 처리하고 대체 응답을 반환할 수 있습니다.

7. Feign 클라이언트에서의 예외 처리

Feign 클라이언트에서 발생하는 예외를 처리하기 위해, Spring은 기본적으로 FeignException을 제공합니다. 이를 통해 HTTP 상태 코드에 따른 처리를 할 수 있습니다.

import feign.FeignException;

public class ExampleService {

    private final ExampleClient exampleClient;

    public ExampleService(ExampleClient exampleClient) {
        this.exampleClient = exampleClient;
    }

    public String fetchData() {
        try {
            return exampleClient.getData();
        } catch (FeignException e) {
            // 예외 처리 로직
            return "Error: " + e.getMessage();
        }
    }
}

8. 결론

OpenFeign은 Spring Cloud 환경에서 RESTful 서비스를 호출할 때 유용한 도구입니다. @FeignClient를 사용하여 간단하게 HTTP 요청을 선언적으로 정의할 수 있으며, 다양한 설정을 통해 클라이언트를 커스터마이즈하고 예외를 처리할 수 있습니다. Feign을 통해 코드의 가독성 및 유지보수성을 높일 수 있습니다.


이 가이드는 공식 문서를 기반으로 Feign 클라이언트를 설정하고 사용하는 방법을 안내했습니다. OpenFeign의 공식 문서를 참고하여 더 다양한 기능과 옵션을 확인할 수 있습니다.