이전 post에서 context를 중심으로 설명을 진행하였다. 잠깐 언급을 진행하였는데 header에 대한 값을 가져올 수 있다고 했다.
그렇게 header에 대한 값을 가져오려면 무엇을 사용해야한다고 했을까?
DgsDataFetchingEnvironment
를 사용해서 가져오면 된다.
이렇게 해서 requestData를 가져올 수 있다고 해보자. 해당 requestData는 WebMVC를 사용하는지 WebFlux를 사용하는지에 따라서 다르게 typeCasting을 적용해줘야한다.
그렇다면 어떻게 casting을 하여 우리가 원하는 header값을 불러올 수 있을지 알아보도록하자!!
해당 포스트는 https://netflix.github.io/dgs/datafetching/ 를 기반으로 작성하였으며 자세한 내용 확인이 가능하다.
캐스팅을 해줘야하는데 WebMVC, WebFlux에 대해서 알아야 가능하다. 아래에서 간단히 설명을 하려고한다!
동기적으로 작동되는 블로킹 방식이다.
동기, 비동기 그리고 블로킹과 논블로킹에 대해서 궁금한 사람들은 이전의 OS Posting에서 찾아볼 수 있을 것이다.
thread pool을 생성해놓고 사용자의 요청이 들어오면 1개가 처리될 동안 1개의 thread가 할당되어 처리가 완료될 때까지 다른 요청을 처리하기 위해서 사용되지 않는다.
이때 중요한 것이 무엇일까? thread pool size를 적절히 조정하는 것이다.
하지만 많은 사용자의 요청을 대량으로 받아내는데에는 한계가 존재하는데 이를 WebFlux가 해결해줄 수 있다고 말한다.
Node.js와 같이 반응형 프로그래밍을 사용하며 모든 코드는 non-blocking되어있지 않아서 하나의 요청이 끝나지 않더라도 다른 요청을 처리할 수 있다는 것이다.
DgsRequestData
를 사용해서 request data를 가져올 수 있는데 이는 위에서 언급했듯이 어떤 환경에서 가져오는것이냐에 따라서 casting이 달라진게된다.
DgsWebMvcRequestData
로 type casting을 진행해야한다.
val reqeustData = dfe.getDgsContext().requestData as DgsWebMvcRequestData
위와 같이 사용한다면 DgsWebMvcRequestData
로 타입캐스팅을 진행한 것이다.
DgsReactiveRequestData
로 type casting을 진행한다.
val reqeustData = dfe.getDgsContext().requestData as DgsReactiveRequestData
이렇게 requestData를 가져왔다고 하자.
이 다음으로 각각에 맞게 requestData를 처리해주면 된다.
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를 사용한다는 점에서는 같으니 이해하기는 좋은 것 같다 :)