Java

[Spring Boot] RestTemplate/WebClient 사용한 REST API 호출 방법

cob 2023. 2. 11. 16:24
RestTemplate 

 

 

 

RestTemplate이란? 
Spring 3.0부터 지원하는 객체로 간편하게  REST 방식 API를 호출할 수 있는 Spring 내장 클래스입니다. (동기 방식)
  • HTTP 프로토콜의 메서드 (GET, POST, DELETE, PUT)에 맞게 여러 메서드를 제공한다.

 

 

 

WebClient
WebClient이란?
Spring 5.0부터 지원하는 객체로 RestTemplate가 동기 방식이라면 WebClient는 비동기 방식의 REST API 호출할 수 있다.

 

 


1. RestTemplate 특징

  • Spring 3.0부터 지원하는 HTTP 통신 템플릿
  • 응답으로 JSON, XML, String을 받을 수 있다.
  • Blocking I/O 기반의 동기방식을 사용
  • RESTful 형식에 맞추어져 있다.
  • Header, Content-Tpye 등을 설정하여 외부 API 호출 가능

 

 


2.  RestTemplate 메서드 종류

메서드 HTTP 설명
getForObject : Object GET GET 방식 요청으로 결과를 객체로 반환
getForEntity : ResponseEntity GET GET 방식 요청으로 결과를 ResponseEntity로 반환
postForLocation POST POST 방식 요청으로 결과를 헤더에 저장된 URI로 반환
postForObject : Object POST POST 방식 요청으로 결과를 객체로 반환
postForEntity : ResponseEntity POST POST 방식 요청으로 결과를 ResponseEntity로 반환
delete DELETE DELETE 방식 요청으로 메서드 실행
headForHeaders HEADER 헤더의 정보를 얻을 수 있고, HTTP HEAD 메서드 사용
put PUT HTTP PUT 메서드를 실행
patchForObject PATCH HTTP PATCH 메서드를 실행
optionsForAllow OPTIONS 지원하는 HTTP 메서드 조회
exchange : ResponseEntity any 헤더 생성 및 어떤 요청이든 사용 가능
execute any Request/Response 콜백을 수정할 수 있음

 

 

 


3. RestTemplate 사용 방법 (Get)

@Slf4j
@RestController
@RequestMapping("api")
public class ApiController {

    // properties 정의된 변수를 가자져온다.
    @Value("${YOUTUBE-URL}")
    private String YOUTUBE_URL;
    @Value("${YOUTUBE-KEY}")
    private String YOUTUBE_KEY;

    // @PathVariable : 파라미터 값,  @RequestBody : 바디 값
    @GetMapping("/youtube/{type}")
    public ResponseEntity<?> youTubeList(@PathVariable(required = false) String type, @RequestBody YouTubeDTO youTubeDTO) {
        try {
        
            // 1) 요청 url를 정의한다.
            URI uri = UriComponentsBuilder
                    .fromUriString(YOUTUBE_URL)
                    .path("/" + type)
                    .queryParam("part", youTubeDTO.getPart())
                    .queryParam("chart", youTubeDTO.getChart())
                    .queryParam("regionCode", youTubeDTO.getRegionCode())
                    .queryParam("maxResults", youTubeDTO.getMaxResults())
                    .queryParam("videoCategoryId", youTubeDTO.getVideoCategoryId())
                    .queryParam("key", YOUTUBE_KEY)
                    .encode()
                    .build()
                    .toUri();


            // 2) RestTemplate 객체 생성
            RestTemplate restTemplate = new RestTemplate();
            
            // 3) Get방식의 요청 결과를 ResponseEntity객체 string 형식의 응답 값으로 받는다.
            ResponseEntity<String> response = restTemplate.getForEntity(uri, String.class);

            log.info("status code : {}", response.getStatusCode());
            log.info("body : {}", response.getBody());

            // 4) 정상 응답이 떨어지면 ResponseEntity의 body에 응답 받은 결과를 넣고 반환한다.
            return ResponseEntity.ok().body(response.getBody());
        } catch (HttpClientErrorException e) {
            log.error("유튜브 데이터 가져오기 실패");

            // 5) 오류가 나면 오류 메세지를 body에 담아 반환한다.
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }
}
 

 

@PathVariable, @RequestBody에 대한 자세한 설명은 아래 링크 확인

2022.10.10 - [Java] - [Spring Boot] Rest API 개념 및 작성 방법

 

 


4. WebClient 특징

  • 싱글 스레드 방식을 사용
  • Non-Blocking 방식을 사용
  • JSON, XML을 쉽게 응답받는다.

 

 


5. WebClient 사용 방법

RestTemplate은 내장 클래스지만 WebClient는 의존성을 추가해줘야 한다.
implementation 'org.springframework.boot:spring-boot-starter-webflux'

 

@Slf4j
@RestController
@RequestMapping("api")
public class ApiController {

    @Value("${YOUTUBE-URL}")
    private String YOUTUBE_URL;
    @Value("${YOUTUBE-KEY}")
    private String YOUTUBE_KEY;


    // 유튜브 데이터 가져오기
    @GetMapping("/youtube/{type}")
    public ResponseEntity<?> youTubeList(@PathVariable(required = false) String type, @RequestBody YouTubeDTO youTubeDTO) {
        try {
        
			/* 1) builder할 WebClient객체 생성
            	- webClient.create(url)로도 생성 가능
            */
            WebClient webClient = WebClient
                    .builder()
                    .baseUrl(YOUTUBE_URL)
                    .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                    .build();

            // 2) Get방식의 요청 결과를 ResponseEntity객체 string 형식의 응답 값으로 받는다.
            ResponseEntity<String> response = webClient.get()
                    .uri(uriBuilder -> uriBuilder
                            .path("/" + type)
                            .queryParam("part", youTubeDTO.getPart())
                            .queryParam("chart", youTubeDTO.getChart())
                            .queryParam("regionCode", youTubeDTO.getRegionCode())
                            .queryParam("maxResults", youTubeDTO.getMaxResults())
                            .queryParam("videoCategoryId", youTubeDTO.getVideoCategoryId())
                            .queryParam("key", YOUTUBE_KEY)
                            .build())
                    .retrieve().toEntity(String.class).block();
        


            log.info("body : {}", response.getStatusCode());
            log.info("body : {}", response.getBody());

            // 3) 정상 응답이 떨어지면 ResponseEntity의 body에 응답 받은 결과를 넣고 반환한다.
            return ResponseEntity.ok().body(response.getBody());
        } catch (HttpClientErrorException e) {
            log.error("유튜브 데이터 가져오기 실패");

            // 4) 오류가 나면 오류 메세지를 body에 담아 반환한다.
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }
}
  • retrieve()  : 응답 값 body를 가져온다.
  • exchange() : 응답 값의 상태 그리고 헤더와 함께 가져온다

 

반응형