일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 1차원 DP
- 2차원 dp
- 99클럽
- @Builder
- @GeneratedValue
- @GenericGenerator
- @NoargsConstructor
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- ApplicationEvent
- assertThat
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- CCW
- chat GPT
- CICD
- Today
- Total
기록
Spring/Feign API로 외부 RESTful API 호출하기 본문
시작하면서
최근에 프로그래머스의 고양이 사진 검색 API 만들기 과제를 하면서, Feign API를 접하게 되었다. 이전에는 HttpConnection를 사용해 Http client를 작성했는데, Feign API는 인터페이스만 작성하면 기본적인 통신이 가능해서 훨씬 단순하다고 느꼈다.
이 글에서는 정말 간단하게 Feign API를 사용하는 방법에 대해서 이야기하고자 한다.
- 미리 준비할 것
아래에서는 고양이 사진 API를 사용할 것이므로, 미리 사용할 API와 API 응답에 맞는 Response 객체를 만들어둔다.
HttpConnection
위 예제를 HttpConnection을 통해 구현하면, 외부 Api를 호출하고 jsonString을 Vo에 담는 과정까지 직접 구현해야 했다.
public class BreedHttpConnectionClient {
public String getBreedList(){
String apiUrl = "https://api.thecatapi.com/v1/breeds";
HttpURLConnection connection = null;
try {
URL url = new URL(apiUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
// Optional: If you need to set headers, you can do it here
// connection.setRequestProperty("Authorization", "Bearer your-access-token");
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
return response.toString();
} else {
// Handle error response if needed
// You can get error response using connection.getErrorStream()
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
return null;
};
}
HttpConnection, 아래에서 사용한 Feign API 이외에도 HTTP 클라이언트를 호출하는 방법은 다양하며, 많이 사용되는 것에는 RestTemplate, WebClient, OkHttp 등의 라이브러리 등이 있다.
Feign API
- Feign API
https://spring.io/projects/spring-cloud-openfeign
- 클라이언트와 서비스
Feign API를 사용하다보면 FeignClient를 작성하는데, 어떤 역할을 하는 클래스를 *Client 라고 하는지 궁금해졌다.
"클라이언트"는 일반적으로 다른 시스템이나 서버에 접근하여 서비스를 호출하거나 데이터를 요청하는 주체를 의미한다. 클라이언트는 보통 서버와 통신
하는 코드를 포함하고 있으며, 외부 서비스와의 연동
이나 RESTful API 호출
과 같은 작업을 처리한다.
Feign API를 사용할 때, @FeignClient를 사용하여 인터페이스를 정의하는데, 이러한 인터페이스가 주로 클라이언트 역할을 수행한다. 그렇기 때문에 해당 인터페이스의 이름에 *Client라는 접미사를 붙여서 명시적으로 표현하는 것이 관례이다.
- 사용해보기
1. 의존성 추가
//build.gradle
dependencies {
//...
// OpenFeign
implementation platform("org.springframework.cloud:spring-cloud-dependencies:2022.0.2")
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
2. @EnableFeignClients
@EnableFeignClients
어노테이션은 Feign 클라이언트를 자동으로 스캔하고, @FeignClient를 추가한 클라이언트를 스프링 컨테이너에 빈으로 등록한다.
@EnableFeignClients
@SpringBootApplication
public class CatSearchApplication {
public static void main(String[] args) {
SpringApplication.run(CatSearchApplication.class, args);
}
}
3. @FeignClient
@FeignClient는 외부 서비스나 RESTful API를 호출하기 위해 인터페이스를 정의할 때 사용하는 어노테이션으로, 클라이언트를 인터페이스로 쉽게 만들 수 있다.
@FeignClient(name = "BreedClient", url = "${cat-api.url}")
public interface BreedClient {
@GetMapping("/breeds")
List<BreedResponse> getBreedList();
}
FeignClient 어노테이션은 아래와 같은 속성을 가지고 있으며, name과 url은 필수값이다.
name
: Feign 클라이언트의 이름url
: Feign 클라이언트가 요청을 보낼 대상 서비스의 기본 URL을 지정value
: name과 동일한 역할을 하며, name 대신에 value를 사용할 수 있다.configuration
: Feign 클라이언트의 설정을 세부적으로 조정path
: 요청하는 URL의 기본 경로(prefix)를 지정 기본값은 "/"fallback
: 요청이 실패할 경우 대체 로직을 정의fallbackFactory
: Fallback 클래스와 유사하지만 더 자세한 정보
4. 서비스에서 호출하기
List<BreedResponse> breedList = breedClient.getBreedList();
더 공부할 것
- 요청이 실패한 경우, 대체 로직 정의하기(fallback)
- 클라이언트 설정 조정하기(configuration)
'Web > Spring' 카테고리의 다른 글
Spring Boot와 JPA를 활용한 커스텀 아이디 생성 전략 구현 (0) | 2023.10.31 |
---|---|
Spring/트랜잭션 제어/@Transactional (0) | 2023.08.27 |
java - String(문자열)으로 Method(메소드) 호출 (reflection) (0) | 2023.06.28 |
Spring/Jsp 사용설정 (0) | 2022.10.24 |
[튜토리얼] 의존성 주입(3) XML (0) | 2022.09.14 |