본문 바로가기

개발스터디/MSA 스터디 (22년)

[MSA 1.0] (5) RestTemplate 개념과 사용법

RestTemplate: 

  • 마이크로 서비스들은 기본적으로 REST API를 통해 각 서비스 들끼리 호출 하고 응답하는 구조로 이루어져 있습니다.
  • 이에 RestTemplate은 마이크로 서비스 끼리 통신하는 한가지의 방법입니다.

 

RestTemplate 동작 원리:

 


Rest Template 를 구현해봅시다.

 

  • 외부 서버에 api 요청을 보내는 역할
  • 핵심은 RestTemplateService의 이부분인것 같다. 

return apiService.post("https://postman-echo.com/post", HttpHeaders.EMPTY, person, Response.class).getBody();

 

  • RestTemplate 을 사용하려면 필요한 시점에 RestTemplate 인스턴스를 생성해야한다.
RestTemplate restTemplate = new RestTemplate();

 

  • 또는 Bean 으로 선언하고 필요할 때 주입할 수도 있다. 나는 이방법으로 구현했다.
### RestTemplateConfig.java


@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();
    }
}

 

 

 

 

 


패키지와 Class의 구성은 다음과 같습니다.

 

 

 

자세한 소스는 다음을 참고 하세요. 

 

https://github.com/SangJinny/RestTemplatePractice/tree/master/src/main/java/com/resttemplate/practice

 

GitHub - SangJinny/RestTemplatePractice

Contribute to SangJinny/RestTemplatePractice development by creating an account on GitHub.

github.com

 

이렇게 구성하게 되면, 이와 같은 형태로 api를 만들게 된다.

 

따라서 service 1 에서 resttemplate으로 rest api를 요청하게 되면

service 2에서 /services로 rest api가 도달하면서 해당 메서드가 호출된다.

하지만 service1에서 rest template을 통해 return 받는 값이 json이라서  ObjectMapper을 통해  String으로 파싱을 해줘야 하는데

Response의 DTO를 변경 해줘야 하는데 그 방법은 모르겠다. 이 부분을 같이 해결했으면 좋겠다.

 

우회할수 있는 방법은 다음과 같이 json을 Object Mapper로 파싱하는 방법이 있다.

 

 public String callPostExternalServer2() throws JsonProcessingException {


        HashMap<String, Object> result = new HashMap<String, Object>();
        String jsonInString = "";


        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders header = new HttpHeaders();
        HttpEntity<?> entity = new HttpEntity<>(header);


        ResponseEntity<?> resultMap = restTemplate.exchange("http://localhost:8011/services", HttpMethod.POST,entity , Object.class);
        result.put("statusCode", resultMap.getStatusCodeValue()); //http status code를 확인
        result.put("header", resultMap.getHeaders()); //헤더 정보 확인
        result.put("body", resultMap.getBody()); //실제 데이터 정보 확인

        ObjectMapper mapper = new ObjectMapper();
        jsonInString = mapper.writeValueAsString(resultMap.getBody());

        return jsonInString;

 

이와 같이 External Server로의 rest api 통신을 성공 하였다.