FeignClient 입문 (1)

jinvicky·2024년 2월 1일
0

Spring & Java

목록 보기
16/23
post-thumbnail

Intro

회사 프로젝트 내에서 어떤 방식으로 통신할 것이냐 이야기에서 FeignClient 이야기가 나왔다. 한번 예제로 학습해 보자.

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'
}

✅ localhost 내부 통신

전체 Flow는 아래와 같다.

  1. /로 url 접속하면 controller에서 /경로의 GetMapping이 걸린다.
  2. controller의 getTestFeign()에서 service를 호출한다.
  3. service단에서 @FeignClient interface를 호출한다.
  4. interface에서 클래스 최상단 url로 http 통신을 한다.

결과적으로 아래 화면이 나온다.

✅ Jsonplaceholder 통신

처음에 localhost:8089 통해서 하니까 뭔가 내부에서 빙빙도는 것 같아서 헷갈렸다.
api test에 자주 쓰이는 jsonplaceholder 사이트로 해보자.

https://jsonplaceholder.typicode.com

/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로 바꿔보자.

profile
Front-End와 Back-End 경험, 지식을 공유합니다.

0개의 댓글