토리맘의 한글라이즈 프로젝트 logo 토리맘의 한글라이즈 프로젝트

스프링 부트 공식 레퍼런스를 한글로 번역한 문서입니다.

전체 목차는 여기에 있습니다.

목차


7.15. Calling REST Services with RestTemplate

애플리케이션에서 원격에 있는 REST 서비스를 호출해야 할 땐 스프링 프레임워크의 RestTemplate 클래스를 사용할 수 있다. RestTemplate 인스턴스는 사용 전에 커스텀해야 하는 경우가 많기 때문에 스프링 부트는 RestTemplate 빈을 단일로 자동 설정해주지 않는다. 하지만 RestTemplate 인스턴스를 만들 때 활용할 수 있는 RestTemplateBuilder를 자동으로 설정한다. 자동 설정된 RestTemplateBuilderRestTemplate 인스턴스에 적당한 HttpMessageConverters를 적용해준다.

다음은 RestTemplateBuilder를 활용하는 전형적인 예시다:

@Service
public class MyService {

    private final RestTemplate restTemplate;

    public MyService(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();
    }

    public Details someRestCall(String name) {
        return this.restTemplate.getForObject("/{name}/details", Details.class, name);
    }

}

RestTemplateBuilderRestTemplate을 빠르게 설정할 수 있는 유용한 메소드를 많이 가지고 있다. 예를 들어, BASIC 인증을 추가하고 싶을 땐 builder.basicAuthentication("user", "password").build()를 사용하면 된다.

7.15.1. RestTemplate Customization

RestTemplate을 커스텀하는 방법은, 커스텀을 적용하려는 범위에 따라 세 가지로 나뉜다.

커스텀 범위를 최소한으로 좁히려면 자동 설정된 RestTemplateBuilder를 주입한 다음 필요한 메소드를 호출해라. 메소드를 호출할 때마다 새 RestTemplateBuilder 인스턴스를 반환하므로, 그 빌더를 사용하는 곳에만 커스텀이 적용된다.

애플리케이션 전체에 걸쳐 커스텀 로직을 첨가하려면 RestTemplateCustomizer 빈을 사용해라. 이런 빈들은 전부 자동 설정된 RestTemplateBuilder에 저절로 등록되며, RestTemplateBuilder로 빌드하는 모든 템플릿에 적용된다.

다음은 192.168.0.5를 제외한 모든 호스트에 프록시를 설정하는 customizer 예시다:

public class MyRestTemplateCustomizer implements RestTemplateCustomizer {

    @Override
    public void customize(RestTemplate restTemplate) {
        HttpRoutePlanner routePlanner = new CustomRoutePlanner(new HttpHost("proxy.example.com"));
        HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(routePlanner).build();
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
    }

    static class CustomRoutePlanner extends DefaultProxyRoutePlanner {

        CustomRoutePlanner(HttpHost proxy) {
            super(proxy);
        }

        @Override
        public HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context) throws HttpException {
            if (target.getHostName().equals("192.168.0.5")) {
                return null;
            }
            return super.determineProxy(target, request, context);
        }

    }

}

마지막 방법은 자체 RestTemplateBuilder 빈을 생성하는 거다. RestTemplateBuilder 자동 설정은 그대로 사용면서 RestTemplateCustomizer 빈 사용을 전부 막으려면, RestTemplateBuilderConfigurer를 통해 커스텀 인스턴스를 설정해야 한다. 다음 예제는 커스텀 connect, read 타임아웃만 직접 지정하고 나머지는 스프링 부트로 자동 설정하는 RestTemplateBuilder를 정의한다:

@Configuration(proxyBeanMethods = false)
public class MyRestTemplateBuilderConfiguration {

    @Bean
    public RestTemplateBuilder restTemplateBuilder(RestTemplateBuilderConfigurer configurer) {
        return configurer.configure(new RestTemplateBuilder()).setConnectTimeout(Duration.ofSeconds(5))
                .setReadTimeout(Duration.ofSeconds(2));
    }

}

가장 극단적인 옵션은 (거의 사용하지 않는다) configurer 없이 자체 RestTemplateBuilder 빈을 생성하는 거다. 이렇게 하면 RestTemplateBuilder 자동 설정은 비활성화되며, RestTemplateCustomizer 빈도 사용하지 않게 된다.


전체 목차는 여기에 있습니다.

<< >>

TOP