회사 프로젝트 내에서 어떤 방식으로 통신할 것이냐 이야기에서 FeignClient 이야기가 나왔다. 한번 예제로 학습해 보자.
feignclient 의존성 설치할 때 여러 블로그 따라해봤는데 시작과 빌드 과정에서 온갖 에러를 만났다.
결과적으로 공식을 따라하는 것이 가장 좋았다.
참고 https://spring.io/projects/spring-cloud
build.gradle
ext {
set('springCloudVersion', "2023.0.0")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencis {
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
전체 Flow는 아래와 같다.
@FeignClient
interface를 호출한다. 결과적으로 아래 화면이 나온다.
처음에 localhost:8089
통해서 하니까 뭔가 내부에서 빙빙도는 것 같아서 헷갈렸다.
api test에 자주 쓰이는 jsonplaceholder 사이트로 해보자.
/post/{id}
를 통해서 특정 포스트를 가져올 것이다.
Controller
@RestController
@RequestMapping("/jsonplaceholder")
public class JsonPlaceHolderController {
private final JsonPlaceholderService jsonPlaceholderService;
public JsonPlaceHolderController(JsonPlaceholderService jsonPlaceholderService) {
this.jsonPlaceholderService = jsonPlaceholderService;
}
@GetMapping("/posts/{id}")
public String getJsonPostById(@PathVariable Long id) {
return jsonPlaceholderService.getJsonPlaceholder(id);
}
}
Service
@Service
public class JsonPlaceholderService {
private final JsonPlaceHolderClient jsonPlaceHolderClient;
public JsonPlaceholderService(JsonPlaceHolderClient jsonPlaceHolderClient) {
this.jsonPlaceHolderClient = jsonPlaceHolderClient;
}
public String getJsonPlaceholder(Long id) {
return jsonPlaceHolderClient.callJsonPlaceholder(id);
}
}
FeignClient(Interface)
@FeignClient(name = "jsonplaceholder", url = "https://jsonplaceholder.typicode.com")
public interface JsonPlaceHolderClient {
@GetMapping("/posts/{id}")
String callJsonPlaceholder(@PathVariable("id") Long id);
}
@FeignClient
어노테이션을 붙이면 클래스로 구현하지 않고도 인터페이스만으로도 동작이 가능하다.
url
속성은 @RequestMapping("")
의 경로 지정과 동일하다고 보면 된다.
결과 화면
url
속성 값 직접 하드코딩 말고 불러오기 한번 해볼까?
application.yml
spring:
cloud:
openfeign:
client:
config:
post:
url: https://jsonplaceholder.typicode.com/posts
이제 FeignClient를 변경해 보자. 좀 더 변경 시 확인할 파일이 줄었다.
FeignClient(Interface)
@FeignClient(name = "jsonplaceholder", url = "${spring.cloud.openfeign.client.config.post.url}")
public interface JsonPlaceHolderClient {
@GetMapping("/{id}")
String callJsonPlaceholder(@PathVariable("id") Long id);
}
/posts/{id}
에서 /{id}
로 변경된 점 참고하자. 결과는 동일하다.
다음에는 소셜 로그인의 restTemplate 부분을 feignClient로 바꿔보자.