Rest Client

qkrrnjswo·2023년 7월 25일
0

공부 정리

목록 보기
13/24

1. Rest Client?

Rest Client란 Rest API 서버에 HTTP 요청을 보낼 수 있는 클라이언트 툴 또는 라이브러리를 말합니다. Spring에서는 객체로 간편하게 Rest 방식 API를 호출할 수 있는 RestTemplate을 내장 클래스로 지원합니다.

Feign client 라는 것도 있다 알아보자!



2. RestTemplate

  1. spring 3.0 부터 지원
  2. Rest Client를 구현한 class
  3. 기계적이고 반복적인 코드를 최대한 줄여줌
  4. RESTful형식의 API서버에 쉽게 요청 가능
  5. HTTP 요청 후 JSON, XML, String과 같은 응답을 받을 수 있는 템플릿
  6. Blocking I/O 기반의 동기방식을 사용하는 템플릿

javaDoc


2-1. 동작 원리

  1. RestTemplate의 메서드릴 호출
  2. RestTemplate은 MessageConverter를 이용해 java object를 request body에 담을 message(JSON etc.)로 변환
  3. ClientHttpRequestFactory에서 ClientHttpRequest을 받아와 요청을 전달
  4. 실질적으로 ClientHttpRequest가 HTTP 통신으로 요청을 수행
  5. RestTemplate이 에러핸들링
  6. ClientHttpResponse에서 응답 데이터를 가져와 오류가 있으면 처리
  7. MessageConverter를 이용해 response body의 message를 java object로 변환
  8. 결과를 반환

2-2. 코드

다음 코드는 파파고 번역 API에 번역을 요청하는 코드의 일부분이다.

@Service
@RequiredArgsConstructor
public class PapagoService {
    private final PapagoConfig papagoConfig;
	
    // RestTemplate 생성
    private static RestTemplate restTemplate = new RestTemplate();

    public String textTranslation(String text) {
    	// API에서 요청하는 형태로 Dto 만들기
        PapagoRequestDto papagoRequestDto = PapagoRequestDto.builder()
                .source(PapagoConfig.source)
                .target(PapagoConfig.target)
                .text(text).build();
		
        //                              Response를 받는 부분      Http를 만드는 부분
        PapagoResponseDto papagoResponseDto = this.getResponse(buildHttpEntity(papagoRequestDto));

        return papagoResponseDto.getMessage().getResult().getTranslatedtext();
    }
	
    // Http 요청을 만드는 부분
    private HttpEntity<PapagoRequestDto> buildHttpEntity(PapagoRequestDto papagoRequestDto) {
    	// 해당 API에서 요청하는 형태로 Http요청을 만듬
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType(PapagoConfig.CONTENT_TYPE));
        headers.add(PapagoConfig.KEY_NAME,papagoConfig.getApiKey());
        headers.add(PapagoConfig.ID_NAME,papagoConfig.getApiId());
        return new HttpEntity<>(papagoRequestDto, headers);
    }
	
    //Request를 주고 Response를 받는 부분
    public PapagoResponseDto getResponse(HttpEntity<PapagoRequestDto> papagoRequestDtoHttpEntity) {
    	// 현재는 restTemplate을 이용, Post로 요청하고 있음
        ResponseEntity<PapagoResponseDto> responseEntity = restTemplate.postForEntity(
                PapagoConfig.URL,
                papagoRequestDtoHttpEntity,
                PapagoResponseDto.class);

        return responseEntity.getBody();
    }
}


3. 참고

https://velog.io/@bestfarmer/Rest-Client
https://sjh836.tistory.com/141
https://dejavuhyo.github.io/posts/spring-resttemplate/

0개의 댓글