[GraphQL] GraphQLServletListener

본 포스트는 공식 레퍼런스를 참고해 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에서 확인할 수 있습니다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2021/07/30/GraphQL/graphql-11/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.