Blog 프로젝트에서는 graphql을 이용해 backend를 구축하기로 결정했고, 구체적으로는 apollo에서 지원하는 apollo-server를 이용하였다. 기존의 axios 등을 활용하는 restful API 방식에서는 요청을 보낼 때마다 원하는 request 헤더를 자유롭게 실어줄 수 있었는데, graphql을 이용할 때는 request header(특히 authorization)을 어떻게 설정해 주어야 할 지가 server configuration에 있어서 가장 큰 관심사였고, 열심히 구글링을 통해 학습한 결과 아래와 같은 코드를 작성할 수 있었다.
const server = new ApolloServer({
typeDefs,
resolvers,
context: async ({ req, res }) => {
let authToken = null;
let currentUser = null;
try {
authToken = req.headers[HEADER_NAME];
if(authToken) {
currentUser = await decodeToken(authToken); //jwt 토큰을 decode하는 함수
}
} catch (e) {
console.warn(e)
}
return {
authToken,
currentUser,
res
}
},
cors : {
exposedHeaders : 'page_num'
}
});
server.listen().then(() => console.log('graphql server running'));
Apollo server 설정을 할때 사용한 옵션은 다음과 같다.
graphql query 및 mutation의 schema definition에 관한 정보
typeDef에서 정의한 query 및 mutation의 실제 구현
인증과 같은 전처리가 필요할 때 사용하는 객체. 헤더에 원하는 값을 실어줄 수 있고, middleware와 같은 개념이라고 생각하면 될 것 같다.
cors 관련 설정. 여기서는 postList 페이지에서 pagination 기능을 위해 page_num이라는 custom header를 명시적으로 expose 해주도록 설정했다.