OpenSource/Spring Boot

springboot - RestTemplate 적용

태하팍 2024. 4. 7. 17:53
반응형

안녕하세요~
오늘은 스프링부트에서 http통신을 할 때 많이 사용하는 친구입니다.
RestTemplate를 적용해보겠습니다.
이제 사용하지 않는가 싶었는데 알아보니 비동기방식이 Deprecated되었군요! 
비동기는 webClient를 사용!

동기 방식인 RestTemplate를 적용해보겠습니다.

따로  dependency를 걸 필요는 없습니다.
Web을 사용한다면 이미 아래와 같이 디펜던시를 걸었을테니깐요! ㅎㅎ

implementation 'org.springframework.boot:spring-boot-starter-web'

이제 필요한건 RestTemplate을 사용할 수 있도록 Bean을 생성하는 것 입니다.
@Configuration과 @Bean을 사용해서 아래와 같이 만들어줍니다. 

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
        return restTemplateBuilder
                .requestFactory(() -> new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()))
                .setConnectTimeout(Duration.ofMillis(5000)) // connection-timeout
                .setReadTimeout(Duration.ofMillis(5000)) // read-timeout
                .additionalMessageConverters(new StringHttpMessageConverter(Charset.forName("UTF-8")))
                .build();
    }
}

사용은 이제 원하는곳에 가셔서 아래처럼 사용하시면 됩니다 ㅎㅎ

 HttpHeaders headers = new HttpHeaders();
        
headers.setContentType(MediaType.APPLICATION_JSON);

Map<Object, Object> params = new HashMap<>();
params.put("query", query);

HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity(params, headers);
ResponseEntity<JsonNode> entity = restTemplate.exchange(URL, HttpMethod.POST, requestEntity, JsonNode.class);

물론 @Autowired가 아닌 생성자 주입을 통해 빈을 주입 받아서 사용합니다.

2024.03.21 - [OpenSource/Spring Boot] - Field injection is not recommended

@Repository
@RequiredArgsConstructor
public class TestRepository {
    private final static String URL = "http://url입니다";
    private final RestTemplate restTemplate;

RestTemplate 소스를 돌아가는 소스로 살펴보겠습니다.

Config는 동일합니다.

아래는 컨트롤러 소스 입니다.

    @GetMapping("/hello3")
    @ResponseBody
    public ResponseEntity<String> getHello3(@RequestParam String q) {
        ResponseEntity<String>  res = stockService.getStockHtml3(q);
        return res;
    }

 /hello3로 접속! get 방식 입니다.

다음으로는 서비스 소스 입니다.
생성자 주입을 통해 주입 받습니다.

@Service
@RequiredArgsConstructor
public class StockService {
   private final RestTemplate restTemplate;
   public ResponseEntity<String> getStockHtml3(String q){
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        Map<Object, Object> params = new HashMap<>();
        params.put("query", q);
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity(params, headers);
        ResponseEntity<String> res  = restTemplate.exchange("https://finance.naver.com/sise/sise_quant.naver", HttpMethod.POST, requestEntity, String.class);
        return res;
    }

테스트로 접속해보면!
 아래와 같이 나오게 됩니다.

RestClient로는 아래를 참조하세요!

2024.04.07 - [OpenSource/Spring Boot] - springboot-RestClient??

끝~

반응형