Spring

[Spring 완전 정복 시리즈 - MVC편] 2편 - 서블릿의 기본 개념과 동작 원리

dev-nadan 2025. 8. 7. 18:32

이번 편에서는 스프링 MVC의 기반이 되는 서블릿(Servlet) 개념을 실제 코드와 함께 정리해본다.

 

서블릿을 학습하는 이유는 명확하다.

“스프링 MVC는 서블릿 위에 구현된 프레임워크”이기 때문에, 서블릿의 원리를 이해하지 못하면 결국 스프링 MVC의 핵심을 놓칠 수밖에 없다.


1. 서블릿이란?

서블릿은 자바에서 웹 프로그래밍을 가능하게 하는 표준 기술이다.

HTTP 요청을 받아 응답을 생성하는 역할을 수행하며, HTML을 동적으로 생성할 수 있다.

자바 EE(Jakarta EE)의 일부이며, 스프링 MVC, JSP, Struts 등의 기반이 된다.

2. 서블릿 등록하기

 

스프링 부트를 사용하면 서블릿을 간단히 등록할 수 있다.

@ServletComponentScan // 서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServletApplication.class, args);
    }
}

 

그리고 다음과 같이 서블릿 클래스를 작성한다.

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        String username = request.getParameter("username");
        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        response.getWriter().write("hello " + username);
    }
}

3. HttpServletRequest - 요청 정보 분석

요청 라인 정보

System.out.println("request.getMethod() = " + request.getMethod());
System.out.println("request.getProtocol() = " + request.getProtocol());
System.out.println("request.getRequestURL() = " + request.getRequestURL());

 헤더 정보

request.getHeaderNames().asIterator()
    .forEachRemaining(name -> System.out.println(name + ": " + request.getHeader(name)));

 편의 메서드

request.getServerName(); // Host
request.getLocale(); // 언어 정보
request.getCookies(); // 쿠키

기타 정보

request.getRemoteAddr(); // 클라이언트 IP
request.getLocalPort();  // 서버 포트

4. HTTP 요청 데이터 다루기

서블릿에서는 HTTP 요청 데이터를 다음 세 가지 방식으로 받을 수 있다:

 

① GET 방식 - 쿼리 파라미터

GET /request-param?username=hello&age=20

String username = request.getParameter("username");

 

② POST 방식 - HTML Form

<form action="/request-param" method="post">
    <input name="username"/>
    <input name="age"/>
</form>

 

③ 메시지 바디 - API 방식

POST /request-body-json
Content-Type: application/json

{
  "username": "hello",
  "age": 20
}
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

ObjectMapper objectMapper = new ObjectMapper();
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);

5. 회고

서블릿은 스프링을 배우기 전, 웹의 가장 기초적인 동작 원리를 알려주는 핵심 기술이다.

 

이번 강의를 통해 HttpServletRequest가 단순히 데이터를 꺼내는 도구가 아니라, HTTP 프로토콜의 구조와 의미를 담고 있다는 걸 제대로 알게 되었다.

 

또한 GET과 POST 방식의 요청이 어떻게 다르고, 메시지 바디로 전달되는 JSON을 어떻게 파싱하는지 배우면서 API 설계와 서버 동작에 대한 감각도 생기기 시작했다.

 

서블릿은 이제 실무에서 직접 사용하진 않지만, 그 기반 위에 스프링이 올라가 있다는 점에서, 반드시 알고 있어야 할 기술이라는 걸 다시 느꼈다.