HttpMessage, Servlet
Http message는 3가지로 이루어져있다.
- start line
- header
- body
내 블로그 header를 살펴보면
Cache hit, age 설정 관련된 정보도 볼 수 있는데,
github pages에서는 10분으로 설정해놓은 듯 하다. (이거 때문에 304 뜨는듯)
소소하지만 캐싱 정책을 커스텀하지 못하는 점을 불평하는 글도 있다.
https://github.com/orgs/community/discussions/11884
원문은 이렇게 생겼는데
개발하면서 이런 응답을 직접 작성한다면
반복되는 부분도 많고, 실수할 여지도 많고, 무엇보다 귀찮을 것이다.
이걸 도와주는게 서블릿이다.
한마디로 서블릿이란
클라이언트의 요청을 처리하고, 그 결과를 반환하는 java 기반 기술
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
System.out.println("HelloServlet.service");
System.out.println("request = " + request);
System.out.println("response = " + response);
String username = request.getParameter("username");
System.out.println("username = " + username);
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello " + username);
} }
이런식으로 사용된다.
그런데 이런 코드는 보통 본적이 없을 텐데
Spring MVC의 등장 때문이다.
서블릿을 기반으로
비즈니스 로직과 뷰를 분리하기 위해 MVC 패턴이 생겨나고
이를 구현한 프레임워크 중 가장 많이 사용되는 것이 Spring MVC이다.
Spring Boot를 사용시 대부분 추가하는 spring-boot-starter-web 의존성에
spring-webmvc가 포함되어 있다.
뒤에서 자세히 알아보자.
Servlet Container
Tomcat처럼 서블릿을 지원하는 WAS를 Servlet Container라고 한다.
- 서블릿 객체의 생명주기 관리
- 서블릿 객체를 singleton으로 관리
- 동시 요청을 처리하기 위한 멀티 쓰레드 지원
(spring container와 설명이 비슷하다)
"서블릿을 지원하는"에서 알수 있듯이
톰캣에서
Http 요청 메시지로 Request 객체를 만드는 것이다.
내부를 보면
(내장 톰캣의 경우 tomcat-embed-core 패키지)
CoyoteAdapter에서 Connector 객체를 생성자로 받고
public class CoyoteAdapter implements Adapter {
private static final Log log = LogFactory.getLog(CoyoteAdapter.class);
private static final String POWERED_BY;
private static final EnumSet<SessionTrackingMode> SSL_ONLY;
public static final int ADAPTER_NOTES = 1;
private final Connector connector;
protected static final StringManager sm;
}
package org.apache.catalina.connector;
public class Request implements HttpServletRequest {
protected org.apache.coyote.Request coyoteRequest;
protected final Connector connector;
protected final MappingData mappingData;
...
public void setCoyoteRequest(org.apache.coyote.Request coyoteRequest) {
this.coyoteRequest = coyoteRequest;
this.inputBuffer.setRequest(coyoteRequest);
}
}
Spring MVC
지금까지 다룬 서블릿을 기반으로 동작하는 프레임워크가 Spring MVC이다.
그리고 MSA를 찍먹하며 netty를 사용해 봤는데
이는 Spring Web Flux기반으로 작동해 조금 달랐다.
나중에 정리해보겠다.
'SUMMARY > Spring' 카테고리의 다른 글
[Spring] Query DSL! (0) | 2025.06.06 |
---|---|
[Spring Boot] 모니터링 (0) | 2025.06.06 |