SUMMARY/Spring

[Spring] Servlet, Spring MVC

grammiboii 2025. 6. 6. 00:32

HttpMessage, Servlet

Http message는 3가지로 이루어져있다.

  • start line
  • header
  • body

내 블로그 header를 살펴보면

imageimageimage

Cache hit, age 설정 관련된 정보도 볼 수 있는데,

github pages에서는 10분으로 설정해놓은 듯 하다. (이거 때문에 304 뜨는듯)

소소하지만 캐싱 정책을 커스텀하지 못하는 점을 불평하는 글도 있다.

https://github.com/orgs/community/discussions/11884




image

원문은 이렇게 생겼는데

개발하면서 이런 응답을 직접 작성한다면

반복되는 부분도 많고, 실수할 여지도 많고, 무엇보다 귀찮을 것이다.

이걸 도와주는게 서블릿이다.

한마디로 서블릿이란

클라이언트의 요청을 처리하고, 그 결과를 반환하는 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이다.

image

Spring Boot를 사용시 대부분 추가하는 spring-boot-starter-web 의존성에

spring-webmvc가 포함되어 있다.

뒤에서 자세히 알아보자.



Servlet Container

Tomcat처럼 서블릿을 지원하는 WAS를 Servlet Container라고 한다.

  • 서블릿 객체의 생명주기 관리
  • 서블릿 객체를 singleton으로 관리
  • 동시 요청을 처리하기 위한 멀티 쓰레드 지원

(spring container와 설명이 비슷하다)

image




"서블릿을 지원하는"에서 알수 있듯이

톰캣에서

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