| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- Eclipse
- junit
- math
- ArrayList
- 스프링부트
- html
- Array
- 테스트자동화
- IntelliJ
- 자바문법
- vscode
- Visual Studio Code
- 단위테스트
- Java
- 문자열
- 정규식
- java테스트
- SpringBoot
- js
- 자바
- HashMap
- 인텔리제이
- input
- javascript
- 자바스크립트
- CSS
- list
- string
- junit5
- 배열
- Today
- Total
어제 오늘 내일
[Spring Boot] "RestTemplate은 이제 그만!" 외부 API, Feign Client로 3줄 컷 하기 본문
[Spring Boot] "RestTemplate은 이제 그만!" 외부 API, Feign Client로 3줄 컷 하기
hi.anna 2026. 3. 24. 01:58
서버 개발을 하다 보면 다른 서버(네이버, 카카오, 혹은 사내 다른 팀 서버)에 API 요청을 보내야 할 때가 있습니다.
보통 RestTemplate이나 WebClient를 쓰는데, 코드가 이렇습니다.
// ❌ RestTemplate의 악몽 (URL 만들고, 헤더 넣고, 요청 보내고...)
String url = "https://api.weather.com/v1/forecast?city=seoul";
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer token");
HttpEntity<String> entity = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
API 하나 호출하는데 5~6줄을 써야 합니다. API가 10개면 50줄이 넘어가죠. 유지보수하기 정말 힘듭니다.
오늘은 이 코드를 단 3줄로 줄여주는 Spring Cloud OpenFeign을 알아보겠습니다.
1. OpenFeign이 뭔가요? (선언적 HTTP 클라이언트)
Netflix가 만들고 Spring Cloud가 채택한 기술입니다.
핵심은 "인터페이스만 만들면, 실제 구현체는 스프링이 알아서 만들어준다"는 것입니다.
마치 우리가 JpaRepository 인터페이스만 만들면 JPA가 쿼리를 날려주는 것과 똑같은 원리입니다.
2. 설정하기 (의존성 추가)
Feign은 Spring Cloud 프로젝트의 일부라서 버전 관리가 조금 까다롭습니다. build.gradle에 BOM(Bill of Materials) 설정이 필요합니다.
ext {
set('springCloudVersion', "2022.0.4") // 스프링 부트 버전에 맞춰야 함!
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
그리고 메인 클래스에 어노테이션을 붙여줍니다.
@EnableFeignClients // ★ Feign 기능 활성화!
@SpringBootApplication
public class MyApplication { ... }
3. 실전 구현: 날씨 API 호출하기
이제 외부 API 명세서를 보고 인터페이스를 작성해 봅시다.
① Feign Client 인터페이스 만들기
// 1. name: 클라이언트 이름 (로그 등에 쓰임)
// 2. url: 요청 보낼 실제 주소
@FeignClient(name = "weatherClient", url = "https://api.weather.com")
public interface WeatherClient {
// 마치 내 컨트롤러 짜듯이 작성하면 됩니다!
@GetMapping("/v1/forecast")
WeatherResponse getForecast(
@RequestHeader("Authorization") String token, // 헤더
@RequestParam("city") String city // 쿼리 파라미터
);
}
② 서비스에서 사용하기
@Service
@RequiredArgsConstructor
public class WeatherService {
private final WeatherClient weatherClient; // 우리가 만든 인터페이스 주입!
public String getSeoulWeather() {
// ★ 그냥 메서드 호출하듯이 쓰면 끝! (네트워크 통신은 알아서 함)
WeatherResponse response = weatherClient.getForecast("Bearer my-token", "seoul");
return response.getTemperature();
}
}
끝입니다. RestTemplate의 지저분한 코드가 메서드 호출 한 줄로 바뀌었습니다.
4. 꿀팁: 로그 남기기 (Debugging)
Feign은 기본적으로 로그를 남기지 않습니다. 개발할 때 "도대체 무슨 요청이 나가는 거야?" 답답하다면 설정을 추가하세요.
① 설정 파일 ()
logging:
level:
# 패키지 경로를 적고 레벨을 DEBUG로 설정
com.example.demo.client.WeatherClient: DEBUG
② 자바 설정 ()
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
// FULL: 요청/응답 헤더, 바디, 메타데이터 모든 것을 남김 (개발용)
return Logger.Level.FULL;
}
}
이제 콘솔창에 HTTP 요청과 응답 본문이 적나라하게 찍혀서 디버깅이 정말 쉬워집니다.
5. 주의사항: 타임아웃 (Timeout)
외부 서버가 1분 동안 응답이 없으면 내 서버도 같이 멈춰있게 됩니다. 그래서 타임아웃 설정은 필수입니다.
spring:
cloud:
openfeign:
client:
config:
default: # 모든 클라이언트에 적용
connectTimeout: 5000 # 연결 5초
readTimeout: 5000 # 읽기 5초
5초 안에 응답 없으면 바로 에러 뱉고 끝냅니다. (Fail Fast)
마치며
오늘의 결론입니다.
- OpenFeign을 쓰면 외부 API 호출을 내 코드처럼(Interface) 작성할 수 있다.
- 가독성이 10배 좋아지고, 유지보수가 쉬워진다.
- Spring Cloud 의존성을 쓰기 때문에 버전 호환성을 잘 확인해야 한다.
이제 여러분은 "외부 API 연동? 그거 금방 하죠."라고 말할 수 있는 개발자가 되었습니다.
다음 포스팅에서는 "H2 DB로는 불안해요..." 도커를 이용해 실제 운영 환경과 똑같은 테스트 환경을 만드는 TestContainers에 대해 알아보겠습니다. (테스트의 신세계가 열립니다!)
도움이 되셨다면 좋아요와 댓글 부탁드립니다! 😊
