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에 대한 자세한 설명은 아래 링크 확인
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() : 응답 값의 상태 그리고 헤더와 함께 가져온다
반응형
'Java' 카테고리의 다른 글
[Spring Boot] Security @AuthenticationPricipal 객체로 로그인 정보 받는 방법 (0) | 2023.03.21 |
---|---|
[Spring Boot] Spring Data JPA에서 Pageable사용한 Pagination 및 정렬 처리 방법 (0) | 2023.03.06 |
[Spring Boot] CORS 설정 방법 (0) | 2022.10.27 |
[Spring Boot] Spring Security 패스워드 암호화 방법 (0) | 2022.10.26 |
[Spring Boot] Spring Security JWT를 사용한 토큰 인증 구현 (0) | 2022.10.25 |