본 포스트는 공식 레퍼런스를 참고해 GraphQL을 공부하며 직접 작성한 가이드 입니다. 본 포스트는 2021년 7월 최신 버전인 v16.2를 기준으로 작성되어 있습니다.
GraphQLServletListener
GraphQLServletListener
는 GraphQL 서블릿 요청에 실행에 대한 훅을 제공한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public interface GraphQLServletListener { default GraphQLServletListener.RequestCallback onRequest (HttpServletRequest request, HttpServletResponse response) { return null ; } public interface RequestCallback { default void onSuccess (HttpServletRequest request, HttpServletResponse response) { } default void onError (HttpServletRequest request, HttpServletResponse response, Throwable throwable) { } default void onFinally (HttpServletRequest request, HttpServletResponse response) { } } }
인터페이스에서 보다시피 요청과 응답에 대한 콜백 훅을 통해 이벤트나 로깅 메세지 버스에 다양한 정보를 실어 보낼 수 있다. 우리는 간단하게 쿠키 값을 세팅해보자. RequestCallBack
은 간단하게 익명 클래스로 만들자. 세션에는 쿠키 값이 처음 생성된 시간을 넣어준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 @Slf4j @Component @RequiredArgsConstructor public class GraphQLListener implements GraphQLServletListener { private final Clock clock; @Override public RequestCallback onRequest (HttpServletRequest request, HttpServletResponse response) { String key = CookieUtil.getCookieValue(request, "key" ).orElse(null ); HttpSession session = request.getSession(); log.info("Received GraphQL Request at {}" , Instant.now(clock), key); if (Objects.isNull(key)) { final String uuid = UUID.randomUUID().toString(); session.setAttribute(uuid, Instant.now(clock)); response.addCookie(new Cookie ("key" , uuid)); log.info("GraphQLListener set Cookie {}" , uuid); } else { log.info("Get Session {}" , session.getAttribute(key)); } return new RequestCallback () { @Override public void onSuccess (HttpServletRequest request, HttpServletResponse response) { } @Override public void onError (HttpServletRequest request, HttpServletResponse response, Throwable throwable) { } @Override public void onFinally (HttpServletRequest request, HttpServletResponse response) { log.info("Completed GraphQL Request at {}" , Instant.now(clock)); } }; } }
요청을 보내보면 처음 요청엔 쿠키값을 세팅해주고 그 이후엔 세션에서 정보를 잘 불러오는걸 볼 수 있다.
1 2 3 4 5 6 2021-07-30 01:28:22.587 INFO 19842 --- [nio-8080-exec-1] c.s.graphql.listener.GraphQLListener : Received GraphQL Request at 2021-07-29T16:28:22.587Z 2021-07-30 01:28:22.588 INFO 19842 --- [nio-8080-exec-1] c.s.graphql.listener.GraphQLListener : GraphQLListener set Cookie 4d1b5054-ee26-45ec-8102-a7d4ce246d3f 2021-07-30 01:28:22.668 INFO 19842 --- [nio-8080-exec-2] c.s.graphql.listener.GraphQLListener : Completed GraphQL Request at 2021-07-29T16:28:22.668Z 2021-07-30 01:28:24.162 INFO 19842 --- [nio-8080-exec-4] c.s.graphql.listener.GraphQLListener : Received GraphQL Request at 2021-07-29T16:28:24.162Z 2021-07-30 01:28:24.162 INFO 19842 --- [nio-8080-exec-4] c.s.graphql.listener.GraphQLListener : Get Session 2021-07-29T16:28:22.588Z 2021-07-30 01:28:24.170 INFO 19842 --- [nTaskExecutor-4] c.s.graphql.listener.GraphQLListener : Completed GraphQL Request at 2021-07-29T16:28:24.170Z
Repository
모든 가이드의 예제 코드는 SongHayoung/springboot-graphql-tutorial 에서 확인할 수 있습니다.