티스토리 뷰

RestTemplate이란?

이 전에 썼던 글을 참고

 

다른 매서드에서도 반복적으로 RestTemplate을 사용한다면?

RestTemplate 예시를 보면 아래와 같이 매번 객체를 새로 생성해서 사용한다.

RestTemplate restTemplate = new RestTemplate();

String url = "http://example.com/users/{id}";
Map<String, String> params = new HashMap<>();
params.put("id", "123");

User user = restTemplate.getForObject(url, User.class, params);

이렇게 사용하게 되면 모든 매서드에서 new를 써서 RestTemplate 객체를 생성해서 사용해야 한다.

 

트래픽이 작은 작업들에게선 고려할 수 있는 방법이라고 생각된다.

 

그런데... 타임아웃과 같은 옵션을 사용하게 되면 조금 불편해진다.

RestTemplate restTemplate = new RestTemplate();

SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(5000);
requestFactory.setReadTimeout(5000);

restTemplate.setRequestFactory(requestFactory);

String url = "http://example.com/users/{id}";
Map<String, String> params = new HashMap<>();
params.put("id", "123");

User user = restTemplate.getForObject(url, User.class, params);

타임 아웃을 설정하는 코드 뭉텅이가 추가되면서, copy and paste 해야할 코드 양이 증가하게 된다.

 

그렇다면 어떻게 설정해야 편하게 사용할 수 있을까?

 

가장 먼저 떠오르는건 DI를 사용하는 것이다.

 

전역으로 선언할 수 있으면, 객체를 선언하는 횟수를 확실히 줄일 수 있을 것이다.

 

예시를 들기 위해 위와같이 DI를 설정했다.

그런데 사용할 수 없다.

 

이는 RestTemplate의 생성자에는 DI를 위해서 스프링 프레임워크가 필요로 하는 정보가 없기 때문이다.

 

왜 사용할 수 없나?

스프링 프레임워크에서 별도의 클래스를 DI 하기 위해서는 내부적으로 객체를 초기화하는 생성자가 필요하다.

 

또, 클래스가 스프링 Bean으로 설정되어 있어야 사용 가능하다.

 

때문에 별도의 추가 설정이 필요하다.

 

그래서 어떻게 사용하면되나?

생성 방법이 어렵진 않다.

 

config 클래스를 따로 생성해서 사용한다.

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setConnectTimeout(5000);
        requestFactory.setReadTimeout(5000);

        restTemplate.setRequestFactory(requestFactory);

        return restTemplate;
    }

Configuration으로 Component Scan을 할 수 있도록 하고, RestTemplate 클래스 생성자를 Bean으로 등록했다.

 

위와 같이 설정하면, 다른 클래스에서 DI 설정된 클래스와 같이 사용할 수 있다.

 

일일이 찾아가서 눈물의 타임아웃 5초 설정을 해주는 무한 copy and paste를 해줄 필요가 없다.

 

굳이 타임아웃 설정 때문이 아니더라도, 위와 같이 설정해서 사용하는 편이 가독성이나 코드의 중복을 막는 좋은 방법이 될 것이다.

 

다른 예로는 ModelMapper나 ObjectMapper도 위와같이 설정해서 사용하면 좋을 것 같다.

(2023.12.28 수정 ObjectMapper는 기본적으로 DI로 사용 가능)

마치며

DI(Dependency Injection)을 모르는 사람은 없으리라 생각하고 쓴 글이다.

 

API 외부 요청을 자주 사용할 일이 없어, 매서드 안에서 매번 new RestTemplate을 하며 사용했었다.

 

RestTemplate 뿐만 아니라 다른 클래스 들도 앞으로는 위와 같이 등록하고 사용할 것 같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함