Post

동기와 비동기 그리고 ServletHttp~ 와 ServerHttp~ 의 차이 알아보기

동기와 비동기, 그리고 이번에 알게된 ServerHttp~ 에 대해 알려드려요.

1. ServeletHttpResponse 와 ServeletHttpRequest

Stomp 를 사용하여 실시간 서비스 개발하기 글을 보면, 아래와 같은 코드가 있습니다.

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
42
43
@Slf4j
@RequiredArgsConstructor
@Component
public class CustomHandshakeHandler implements HandshakeHandler {
    private final TokenExtractor tokenExtractor;
    private final TokenAuthenticator tokenAuthenticator;
    private final TokenValidator tokenValidator;

    @Override
    public boolean doHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws HandshakeFailureException {
        try {
            String accessToken = tokenExtractor.getAccessTokenFromRequest(request);
            tokenValidator.validateAccessToken(accessToken);
            tokenAuthenticator.getAuthenticationUsingToken(accessToken);

            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

            log.info("===========================================================================");
            log.info("Authentication: " + authentication.toString());
            log.info("===========================================================================");

        } catch (ExpiredJwtException | InsufficientAuthenticationException exception) {
            try {
                setResponse(response, HttpStatus.UNAUTHORIZED, "TOKEN_01");

            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            return false;
        }

        return true;
    }

    private void setResponse(ServerHttpResponse response, HttpStatus status, String errorCode) throws IOException {
        response.setStatusCode(status);
        response.getHeaders().add("Content-Type", "application/json");
        String errorMessage = "{\"errorCode\": \"" + errorCode + "\"}";
        response.getBody().write(errorMessage.getBytes(StandardCharsets.UTF_8));
        response.getBody().flush();
    }
}

일반적으로 우리가 익숙한건, HttpServletRequest 와 HttpServletResponse 입니다. 하지만 이곳에서는 ServerHttpResponse 와 ServerHttpRequest 가 쓰였습니다. 이들의 차이는 뭘까요? 🤔

1.1. HttpServletRequest/Response

  • Java Servlet API 의 일부입니다.
  • 전통적인 동기식 웹 애플리케이션에서 사용됩니다.
    • 동기식 프로그래밍 모델에서는 요청이 처리되는 동안 클라이언트는 응답을 기다립니다.
    • 서버가 요청을 처리하고 응답을 반환할 때 까지 클라이언트는 대기 상태에 있습니다.

1.2. ServerHttpRequest/Response

  • Spring Framework의 org.springframework.http.server 에서 제공됩니다.
  • 비동기 및 반응형 프로그래밍 모델에서 주로 사용됩니다.
    • 비동기식 프로그래밍 모델에서는 요청이 비동기적으로 처리됩니다.
    • 클라이언트는 요청을 보낸 후 즉시 다른 작업을 수행할 수 있습니다.
    • 서버는 요청을 비동기적으로 준비하고, 준비가 되면 응답을 반환합니다.
  • HttpServletRequest/Response 처럼 헤더에 토큰을 넣을 수 없습니다!



2. 결론

웹소켓 핸드셰이크 과정에서는 ServerHttpRequest/Response 를 사용해야 합니다. 웹소켓 연결 자체가 비동기적이 때문입니다.

This post is licensed under CC BY 4.0 by the author.