본문 바로가기
프로젝트/MovMag

[MovMag] WebClient

by JayAlex07 2023. 11. 6.

[MovMag] WebClient

 

처음에는 외부 API를 통해서 JSON 파일로 파싱을 해서 데이터를 가지고 왔다

 

RestTemplate이라는 라이브러리를 추천 받았다

  • 하지만, Spring 문서에서는 Spring 5.0에서부터는 RestTemplate보다는 WebClient를 사용하라고 권고하고 있다

NOTE: As of 5.0 this class is in maintenance mode, with only minor requests for changes and bugs to be accepted going forward. Please, consider using the org.springframework.web.reactive.client.WebClient which has a more modern API and supports sync, async, and streaming scenarios.

 

그래서 WebClient를 한번 사용해보기로 했다

  • WebClient는 비동기 처리가 가능하여, 대규모 데이터 처리 및 대기 시간이 있는 API 경우 유용하다고 해서, WebClient를 사용했다

 

1. build.gradle

  • webflux 의존성을 추가한다
// WebClient 사용
implementation 'org.springframework.boot:spring-boot-starter-webflux'

 

2. TMDB에서 영화 장르 가지고 오기

  • WebClient.builder() 를 통해서 기본적인 WebClient 객체를 가지고 온다
    • baseUrl : 기본 URL
    • codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(-1))
      • DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144 에러
      • 위와 같은 에러가 떠서 codecs를 추가했다 (여기서 -1 은 unlimited 이다)
  • webClient.get() : get 메서드를 통해서 TMDB에서 영화 장르를 가지고 온다
    • uri 에 장르에 관련된 uri와 파라미터를 추가해준다
    • header 에, apikey가 필요함으로 apikey를 넣어준다
    • retrieve().bodyToMono() 에서는 원하는 리턴 클래스를 명시해준다
      • 즉 TMDB에서 제공해주는 데이터 위주로 응답할 클래스를 만들면 된다
@RequiredArgsConstructor
@Service
public class MovieExternalApiClient {

    private static final WebClient webClient = WebClient.builder()
            .baseUrl("https://api.themoviedb.org/3")
            .defaultHeader(HttpHeaders.ACCEPT, "application/json")
            .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(-1))
            .build();

    static MovieExternalApiDto.GenreList getGenre(String apiKey, String language) {

        MovieExternalApiDto.GenreList response = webClient.get()
                .uri(uriBuilder -> uriBuilder
                        .path("/genre/movie/list")
                        .queryParam("language", language)
                        .build())
                .header(HttpHeaders.AUTHORIZATION, apiKey)
                .retrieve()
                .bodyToMono(MovieExternalApiDto.GenreList.class)
                .block();

        return response;
    }
}

 

3. 응답할 클래스

  • 여기서 중요한 것은, API에서 제공해주는 데이터 이름, 그대로 가지고 와야 한다!
  • JsonProperty를 사용하여 외부 API 데이터와 매칭시키면 된다!
public class MovieExternalApiDto {

    @Getter
    @Setter
    public static class GenreList{
        private List<Genre> genres;
    }

    @Getter
    @Setter
    public static class Genre{
        private Long id;
        private String name;
    }
}

'프로젝트 > MovMag' 카테고리의 다른 글

[MovMag] ElasticSearch + MySQL  (0) 2023.11.03
[MovMag] ElasticSearch setup  (0) 2023.11.02
[MovMag] 20231031 오늘 배운 것 (@Asnyc)  (0) 2023.10.31
[MovMag] 오늘 배운 것 - 20231030  (0) 2023.10.31