OpenSource/Spring Boot
Spring Boot GraphQL Client
태하팍
2024. 7. 3. 15:38
반응형
목표
이미 제공하는 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구조화(서비스 컴포넌트별로 나눔)처리를 하자
반응형