동기와 비동기 그리고 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.