[스프링] FeignClient 초기 세팅 & 기본 사용법

임하정·2024년 4월 4일
post-thumbnail

스프링 FeignClient을 사용하기 위한 초기 세팅을 해보자 🙌🏻



1. Build.gradle 의존성 추가

일단 build.gradle에 의존성 추가를 하자.
Spring Cloud 사이트에서 버전을 확인한 후, 본인 Spring Boot 버전에 맞게 추가해야 한다.

Spring Boot 2.7.18을 사용하고 있는 머플러 프로젝트에 Feign을 사용하기 위해 추가한 build.gradle 설정은 다음과 같다.

ext {
	set('springCloudVersion', "2021.0.4")
}

dependencyManagement {
	imports {
		mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
	}
}

dependencies {
	/*
     * (생략)
    */
    
    // Feign 설정
	implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}



2. @EnableFeignClients 추가

Feign을 활성화하기 위해
메인 어플리케이션에 @EnableFeignClients을 추가한다.
나는 FeignClientConfig@Configuration 어노테이션을 달아서 해당 설정을 해주었다.

@Configuration
@EnableFeignClients(basePackages = "com.umc5th.muffler.global.feign")
public class FeignClientConfig {
}

이렇게 Spring Cloud Feign 기능을 활성화시키면,
Spring 어플리케이션은 지정된 패키지 내의 @FeignClient 어노테이션이 붙은 인터페이스를 찾아,
실행 시점에 해당 인터페이스의 구현체를 동적으로 생성한다.


사실 처음에 전체 프로젝트를 다 스캔해주는 줄 착각하고,
@EnableFeignClients의 basePackages 설정을 하지 않고 실행했더니 아래와 같은 에러가 났다.

에러

KakaoClient 타입의 빈을 찾을 수 없다는 에러로,
KakaoClient 인터페이스에 대한 Feign 클라이언트 프록시가 올바르게 생성되지 않았거나, 스프링 컨텍스트에 등록되지 않았음을 의미한다.

그렇기 때문에 @EnableFeignClients 뒤에 basePackages = 를 사용하여
Feign 클라이언트 인터페이스가 정의된 패키지를 명시적으로 지정해주자!



3. @FeignClient 인터페이스 생성

이제 내가 리모트 서비스 호출하기 위한 Client 인터페이스를 작성하자!
FeignClinet선언적 REST 클라이언트로,
인터페이스에 호출에 필요한 메서드만 정의하면 Feign이 런타임에 해당 인터페이스를 구현한 프록시 객체를 자동으로 생성한다.

나는 소셜 로그인을 위해 카카오와 통신하는 KakaoClient 인터페이스를 아래와 같이 생성했다.

@FeignClient(name = "kakao-client", url = "https://kapi.kakao.com", configuration = {KakaoAuthInterceptor.class})
public interface KakaoClient {

    @PostMapping("/v1/user/unlink?target_id_type=user_id")
    KakaoUnlinkResponse unlinkMember(@RequestParam(value = "target_id") Long memberId);
}
  1. name에는 Feign 클라이언트 이름을 정의한다.
  2. url에는 리모트 서비스의 기본 URL을 작성한다.
  3. configuration에 인터셉터나 에러 디코더 같은 원하는 설정을 추가한다.
  4. 메서드 위에는 스프링 MVC 어노테이션을 사용하여 API 엔드포인트를 지정한다.



4. FeignClient 메소드를 사용하여 HTTP 요청 보내기

@Slf4j
@Service
@RequiredArgsConstructor
public class KakaoService {

    private final KakaoClient kakaoClient;

    public void leave(String memberId) {
        KakaoUnlinkResponse response = kakaoClient.unlinkMember(Long.valueOf(memberId));
        log.info("회원 탈퇴 id: {}", response.getId());
    }
}

@FeignClient로 정의한 인터페이스의 객체를 런타임 때 자동으로 만들어 주기 때문에,
이제 Service에서 빈 주입 방식으로 내가 생성했던 FeignClient 받아서 바로 사용하면 된다!




마치며 ...

기존의 HTTP 요청을 보내기 위해 썼던 많은 코드들이 떠오른다..
코드가 깔끔하지 않아 가독성도 좋지 않았고, 내가 직접 처리해야할 요소도 많았다.
그러나 FeignClient는 역시 듣던대로 상당히 개발 친화적인 클라이언트 같다!

다음 포스팅에서는 예외까지 깔끔하게 처리하기 위해, Feign 에러 핸들링하는 방법을 작성해보겠다.😃

0개의 댓글