OpenFeign
은 Java에서 RESTful 웹 서비스와의 통신을 간편하게 해주는 HTTP 클라이언트 바인더 입니다. 이 라이브러리는 Spring Cloud와 프로젝트에서 널리 사용되며, 다른 마이크로서비스와의 통신을 위해 사용됩니다. 최근에는 RestTemplate
보다 많이 사용되고 있습니다.
build.gradle
에 OpenFeign implement 하기
// open feign
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
dependency manager 설정 및 spring cloud version을 주입하기
ext {
/**
* https://spring.io/projects/spring-cloud
* 위에서 현재 Spring 버전과 호환 되는 springCloudVersion 을 찾아 설정해 준다.
* 현재 프로젝트 spring version 은 3.2.6 입니다.
*/
set('springCloudVersion', "2023.0.2")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
@EnableFeignClients
어노테이션을 사용하여 현재 프로젝트에서 OpenFeign을 사용할 것임을 알린다.
@EnableFeignClients // Feign Client 사용을 위한 어노테이션
@SpringBootApplication
public class SpringOpenfeignApplication {
public static void main(String[] args) {
SpringApplication.run(SpringOpenfeignApplication.class, args);
}
}
@FeignClient
어노테이션을 사용한 클래스를 생성하여 name
, url
을 설정한다.
name
은 현재 Feign Client의 고유 이름이고 url
은 요청을 전송할 서버의 url이다.
또한, configuration에 Feign Client의 설정 정보 클래스를 설정해 줄 수도 있다.
@FeignClient(
name = "demo-client", // feign client 의 고유 이름
url = "${feign.url.prefix}", // 요청을 전송할 서버의 url
configuration = {DemoFeignConfig.class} // 어떤 설정을 적용할 것인지 설정
)
public interface DemoFeignClient {
@GetMapping("/get")
ResponseEntity<BaseResponseInfo> callGet(
@RequestHeader("CustomHeaderName") String customHeader,
@RequestParam("name") String name,
@RequestParam("age") Long age
);
}
url
같은 경우 application.yml
파일로 부터 주입 받기 위해 위와 같이 설정하였습니다.application.yml
설정 Feign Client를 설정하기 앞서서 application.yml
을 미리 정의하여 환경 변수로 설정 정보를 불러올 수 있다.feign:
url:
prefix: http://localhost:8080/target_server # DemoFeignClient 에서 사용할 url prefix
client:
config:
default:
connectTimeout: 1000
readTimeout: 3000
loggerLevel: NONE
demo-client: # DemoFeignClient 에서 사용할 Client 설정 값
connectionTimeout: 1000
readTimeout: 10000
loggerLevel: HEADERS # FeignCustomLogger -> Logger.Level logLevel 변수에 할당
demo-client
부분을 보면 connectionTimeout
, readTimeout
, loggerLevel
을 미리 정의한 것을 확인할 수 있으며 feign.url.prefix
를 보면 target이 될 서버의 url 을 설정한 것을 볼 수 있다.DemoService
에서 현재 서버에 요청을 전송하고 요청이 전송됬는지 확인해 보자@Service
@RequiredArgsConstructor
public class DemoService {
private final DemoFeignClient demoFeignClient;
public String get() {
ResponseEntity<BaseResponseInfo> response = demoFeignClient.callGet(
"CustomHeader", // 전송 Header
"CustomName", // 전송 Name
1L // 전송 Age
);
System.out.println("FROM TARGET SERVER");
System.out.println("Name: " + response.getBody().getName());
System.out.println("Age: " + response.getBody().getAge());
System.out.println("Header: " + response.getBody().getHeader());
return "get";
}
}
FeignClient
를 주입받아 사용하는 클래스
# GET request
GET http://localhost:8080/get
Feign Client 사용을 위한 요청
FROM TARGET SERVER
Name: CustomName
Age: 1
Header: CustomHeader
get()
메소드를 사용하였을때, Feign Client가 원활히 작동하는 것을 확인해 볼 수 있다.