본문 바로가기
서버 개발/GraphQL

[GraphQL] Link와 Middleware에 대해서

by JIMYEONG 2024. 8. 27.
반응형

GraphQL을 공부하는 중에, 좀 많이 헤맸다.

NodeJS 라던가, Spring이라던가, 내가 일반적으로 접해본, 프레임워크랑 생리가 많이 달라서,

진도가 많이 안나갔다.

특히, Error 메시지가 분명히 클라이언트로 전달되고 있는 것을 확인하는데, (network tab에서도)

비동기 통신을 실행하고 있는 코드까지, 오질 않았다. (참고 https://scribbler-jimmy.tistory.com/60)

중간에 Error 메시지가 변경되고 있었는데, 이런 경험은 또 처음해보는 터라 많이 당황했다.

그러던 중, 

 

이미 GraphQL문서에, 이러한 상황을 다루는 효과적인 API 들이 있음을 알게되었다.

 

Links

최종 endPoint까지 가기 전에, 중간단계에서 필요한 Logic이 실행되는 Middleware 처럼, GraphQL에는 endPoint까지 가기전에, Link라는 것이 있어서, 이것이 중간단계에서 필요한 logic을 수행한다.

용어는 Link라고 명명이 되어있지만,

나에게는 사실상 Middleware 컨셉과 크게 다르지 않아보인다.

 

각종 Error처리도 Link에서 한다.

 

 React Component 안에서도, request에 대한 결과로써

최종적으로 Error처리를 할 수 있지만,

example

const ReactComponent = ({children})=>{

	[{data,ERROR,loading}]=useQuery(...)

	return <>...<>
}

 

 

기본적으로는, Link안에서 우선적으로 다루는 것 같다.

 

결과적으로 request를 하고 있는 React Component가 서버 response를 받기 전에, Link단에서 한번 더 정교한 logic를 수행할 수 있는 장을 마련해주고 있는 셈이다.

 

꽤 확장성이 있어보이는 게,

Additive Compotision

Directional Composition

구성이라고 해서,

 

Middleware지만, 분기(?) 를 지원하는 것 같다. (일률적인 pipeline을 따르는 게 아니라, 다른 Middleware로 보낼 수 있는 듯)

 

또한,

Operation 이라고 해서,

user의 Request가 객체형태로 전달이 되고, 그 객체를 가공하거나, 요청을 거절하거나 등의 작업을 처리할 수 있다.(... 미들웨어처럼)

 

(GraphlQL에서 부터 시작해서, Pipeline처럼, 오른쪽으로 각각의 Link들을 실행하며, Request 객체를 운반한다. Endpoint에 닿으면, 다시 Reponse 객체를 역순으로 Client까지 운반한다.)

 

Link는 Terminating Link과 일반 Link로 구성이 되는데,

express에서 pipleline으로 보내기 위해서 next()함수를 썼다면,

GraphQL에선,

다음으로 보내기 위해서 forward() 라는 함수를 사용한다.

 

end point 가기 직전 마지막 Link는 Terminating Link라고 불리는데, forward를 호출하지 않는다.

 

공식문서에서는 Terminating Link를 설명하면서 HttpLink를 설명하는데,

 

HttpLink는 순서적으로 제일 마지막에 와야하는 것 같다.

 

-

 

Reference : https://www.apollographql.com/docs/react/api/link/introduction/

 

반응형