[graphql] @DgsRequestData를 사용하여 HTTP 요청 개체 가져오고 다루기

sujin·2023년 6월 14일
0

grapqhl

목록 보기
2/2

0. Intro

이전 post에서 context를 중심으로 설명을 진행하였다. 잠깐 언급을 진행하였는데 header에 대한 값을 가져올 수 있다고 했다.

그렇게 header에 대한 값을 가져오려면 무엇을 사용해야한다고 했을까?
DgsDataFetchingEnvironment 를 사용해서 가져오면 된다.

이렇게 해서 requestData를 가져올 수 있다고 해보자. 해당 requestData는 WebMVC를 사용하는지 WebFlux를 사용하는지에 따라서 다르게 typeCasting을 적용해줘야한다.

그렇다면 어떻게 casting을 하여 우리가 원하는 header값을 불러올 수 있을지 알아보도록하자!!

해당 포스트는 https://netflix.github.io/dgs/datafetching/ 를 기반으로 작성하였으며 자세한 내용 확인이 가능하다.

1. 사전지식

캐스팅을 해줘야하는데 WebMVC, WebFlux에 대해서 알아야 가능하다. 아래에서 간단히 설명을 하려고한다!

  • spring WebMVC

동기적으로 작동되는 블로킹 방식이다.

동기, 비동기 그리고 블로킹과 논블로킹에 대해서 궁금한 사람들은 이전의 OS Posting에서 찾아볼 수 있을 것이다.

thread pool을 생성해놓고 사용자의 요청이 들어오면 1개가 처리될 동안 1개의 thread가 할당되어 처리가 완료될 때까지 다른 요청을 처리하기 위해서 사용되지 않는다.
이때 중요한 것이 무엇일까? thread pool size를 적절히 조정하는 것이다.
하지만 많은 사용자의 요청을 대량으로 받아내는데에는 한계가 존재하는데 이를 WebFlux가 해결해줄 수 있다고 말한다.

  • spring WebFlux

Node.js와 같이 반응형 프로그래밍을 사용하며 모든 코드는 non-blocking되어있지 않아서 하나의 요청이 끝나지 않더라도 다른 요청을 처리할 수 있다는 것이다.

  • 추가
    최근에는 kotlin으로 개발하기 위해서 kotlin을 공부하고 있는데 java에서는 제공하지 않는 Coroutine을 제공한다. 이는 thread를 전환하지 않고도 Non-Blocking이 되어있기에 엄청난 속도로 왔다갔다 하며 작업을 처리해주기에 동시에 진행이 되는 것처럼 보인다고 한다.

2. DgsRequestData

DgsRequestData를 사용해서 request data를 가져올 수 있는데 이는 위에서 언급했듯이 어떤 환경에서 가져오는것이냐에 따라서 casting이 달라진게된다.

  1. DgsWebMvcRequestData
    MVC 기반의 requestData를 가져올 경우에는 DgsWebMvcRequestData로 type casting을 진행해야한다.

val reqeustData = dfe.getDgsContext().requestData as DgsWebMvcRequestData

위와 같이 사용한다면 DgsWebMvcRequestData로 타입캐스팅을 진행한 것이다.

  1. DgsReactiveRequestData
    Webflux 기반의 requestData로 type casting을 진행하는 경우에는 DgsReactiveRequestData로 type casting을 진행한다.

val reqeustData = dfe.getDgsContext().requestData as DgsReactiveRequestData

이렇게 requestData를 가져왔다고 하자.

이 다음으로 각각에 맞게 requestData를 처리해주면 된다.

3. cookie넣기

DgsWebMvcRequestData로 casting을 진행했다고 해보자!

webRequest를 ServletWebRequest로 형변환을 진행하고 webRequest의 response에 cookie를 넣을 수 있게된다!

val webRequest = requestData.webRequest as ServletWebRequest

다음과 같이 ServletWebRequest로 변환을 진행한다.

그렇다면 ServletRequestAttributes에서 제공하는 getResponse method를 사용할 수 있을 것이고 response에 cookie를 addCookie 매서드를 활용해서 넣으면 될 것이다!!

마무리

spring, java, restapi의 조합으로 프로젝트를 진행했을 때는 HttpServeltRequest에서 바로 getRequest를 진행했는데 spring, kotlin, graphql의 조합으로 공부를 진행하고 있는데 로직에 있어서 차이점들이 점점 많이 보이는 것 같다!
그래도 결국 servlet 기반의 http response, request를 사용한다는 점에서는 같으니 이해하기는 좋은 것 같다 :)

0개의 댓글