공식문서에 작성된 글을 바탕으로 공부하고 정리해 보았습니다.
영어로 된 공식문서에 친근해지고자 HttpInterface를 설명하는 글 중 중요 문장을 작성하면 강조하였습니다.
HTTP Interface
The Spring Framework lets you define an HTTP service as a Java interface with @HttpExchange methods.
you can pass such an interface to HttpServiceProxyFactory to create a proxy which performs requests through an HTTP Client such as RestClient or WebClient.
(해당 인터페이스를 HttpServiceProxyFactory에 전달하면, Http 클라이언트를 통해 요청을 수행할 수 있는 프록시를 생성할 수 있다.)
interface
interface RepositoryService {
@GetExchange("/repos/{owner}/{repo}")
Repository getRepository(@PathVariable String owner, @PathVariable String repo);
// more HTTP exchange methods...
}
Now you can create a proxy that performs requests when methods are called.
webclient
WebClient webClient = WebClient.builder()
.baseUrl("<https://api.github.com/>")
.build();
WebClientAdapter adapter = WebClientAdapter.create(webClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();
RepositoryService service = factory.createClient(RepositoryService.class);
- WebClientAdapter : WebClient를 이용해 HTTP 요청을 보낼 수 있도록 만드는 어댑터 역할
- 해당 어댑터는 WebClient의 기능을 Wrapping 하여 HttpServiceProxyFactory와 같은 다른 컴포넌트에서 사용할 수 있게 해주는 중재자 역할을 수행합니다.
- HttpServiceProxyFactory: 인터페이스 기반으로 실제 HTTP API 요청을 처리할 수 있는 프록시 클라이언트를 생성하는 팩토리
- 프록시란 어떤 객체에 대한 접근을 제어하거나 대리하는 역할을 하는 객체
- 프록시 클라이언트에서 클라이언트란 API 호출을 처리하는 HTTP 요청 객체를 의미합니다.
프록시 클라이언트를 생성하는 이유
- 인터페이스를 사용한 추상화
- 인터페이스를 정의하고, 그 인터페이스를 통해 API를 호출합니다.
- 프록시 클라이언트는 인터페이스를 구현해 실제 API와의 HTTP 통신을 처리합니다.
- 자동으로 HTTP 요청 처리
- 개발자가 직접 HTTP 요청을 작성하고 응답을 처리할 필요 없이, 프록시 클라이언트가 이 과정을 자동으로 처리해 줍니다.
- 인터페이스의 메서드를 호출하면, 그 메서드가 실제로는 HTTP 요청을 보내고 응답을 받아 반환하는 방식으로 동작합니다.
- 유지보수성 향상
- 직접 HTTP 요청 로직을 작성하지 않기 때문에 코드가 간결해짐.
- 인터페이스 기반으로 작성된 코드만 봐도 API의 구조를 쉽게 이해할 수 있음
- API가 변경되었을 때 인터페이스만 수정하면 됨
@HttpExchange
@HttpExchange is supported at the type level where it applies to all methods.
@HttpExchange(url = "/repos/{owner}/{repo}", accept = "application/json")
해당 어노테이션을 통해 HTTP 요청에 필요한 메타데이터를 설정하고, 특정 URL과 요청 헤더 정보를 지정할 수 있습니다.
- url: API 호출 시 사용할 엔드포인트 URL을 정의합니다.
- accept: HTTP 요청 헤더의 Accept 필드를 설정하는 데 사용합니다.
Exception Handler
To customize error response handling, you need to configure the HTTP Client
For WebClient:
WebClient raises WebClientResponseException for 4xx and 5xx HTTP status codes.
WebClient webClient = WebClient.builder()
.defaultStatusHandler(HttpStatusCode::isError, resp -> ...)
.build();
WebClientAdapter adapter = WebClientAdapter.create(webClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(adapter).build();
참고자료
'Spring Framework > Spring boot' 카테고리의 다른 글
[SpringBoot] Spring에서 @Transactional과 try-catch 사용 시 롤백되지 않는 이유 (0) | 2024.10.09 |
---|---|
[Spring] H2 In-memory 데이터베이스 설정 및 접속 방법 (3) | 2024.10.05 |
[Springboot] 스프링부트 DTO enum 타입 JSON 역직렬화 하기 - @JsonProperty, @JsonCreator (0) | 2024.09.05 |
[Spring&WebSocket] 스프링 STOMP를 통한 채팅 서비스 개발하기 - websocket (0) | 2024.08.27 |
[SpringBoot] 스프링부트 @Transactional 개념 및 사용법 - Required, requires_new (0) | 2024.08.22 |