본문 바로가기
OpenSource/Spring Boot

Spring Boot GraphQL Client

by 태하팍 2024. 7. 3.
반응형

 목표
   이미 제공하는 graphql server가 있으며
   해당 server에서 제공하는 graphql api를 호출하는것이 목표 입니다.

  • GrapQL Client를 구성하는데 있어서 2가지 구성을 검토
    • GraphQL Client(WebClient)
    • RestTemplate client

  • Graphql Client(WebClient) Config
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.graphql.client.HttpGraphQlClient;
import org.springframework.web.reactive.function.client.WebClient;

@Configuration
public class GraphQLClientConfig {
    @Bean
    public HttpGraphQlClient graphQlClient() {
        WebClient webClient = WebClient.builder()
                .baseUrl("http://xxx.xxx.xxx/graphql")
                .build();
        return HttpGraphQlClient.builder(webClient)
                .build();
    }
}
  • RestTemplate Config
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.Charset;
import java.time.Duration;

@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();
    }
}
  • WebClient는 비동기 및 논블로킹, Reactive Streams을 지원
  • RestTemplate은 동기식 호출이며 전통적인 MVC를 사용하여 코드의 가독성과 쉽게 사용이 가능
  • GraphQL Client를 서치하고 적용해본 목적은
    • 잦은 Json 포맷변경이 수월한가에 초점
    • 둘 다 Json 응답을 파싱하고 처리하는데 큰 차이가 없음.
    • 처리방식과 호출방식만 다를뿐이라 비동기처리가 필요한 시점에 변경해도 늦지 않다고 생각함.
      • 호출하는 곳과 받아주는 곳 모두 비동기처리
    • JPA형식으로 GraphQL을 사용하는 소스가 있었는데 해당 소스는 ORM과 연관이 많으며 graphQL Server 구축에 사용함.

결과
내부적으로 논의한 결과 비동기처리가 필요한 서비스가 필요한 시점이 왔을 때 
비동기처리 또는 MSA구조화(서비스 컴포넌트별로 나눔)처리를 하자

 

반응형