본문 바로가기
Spring MVC

[MVC] 서블릿(1)

by 개발 Blog 2024. 10. 10.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

서블릿이란?

서블릿은 자바 기반 웹 애플리케이션에서 클라이언트의 요청을 처리하고, 응답을 제공하는 역할을 하는 서버 측 컴포넌트이다. 서블릿은 톰캣과 같은 웹 애플리케이션 서버에 등록되어 실행된다. 과거에는 서블릿을 사용하려면 톰캣 같은 웹 서버를 직접 설치하고, 해당 서버에 서블릿 코드를 빌드하여 올려야 했으나, 스프링 부트는 톰캣 서버를 내장하고 있어서 훨씬 간편하게 서블릿을 실행할 수 있다.

 

스프링 부트 서블릿 환경 구성

스프링 부트에서는 @ServletComponentScan 애노테이션을 사용하여 서블릿을 자동으로 등록할 수 있다. 이 애노테이션을 추가하면, 스프링 부트는 서블릿을 자동으로 스캔하고 등록하여 실행한다.

 

hello.servlet.ServletApplication

package hello.servlet;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan // 서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {

	public static void main(String[] args) {
		SpringApplication.run(ServletApplication.class, args);
	}

}

 

서블릿 등록하기

서블릿을 직접 등록하여 실행해보자. 서블릿 클래스는 HttpServlet을 상속받으며, HTTP 요청과 응답을 처리하기 위해 service 메서드를 오버라이드한다.

 

hello.servlet.basic.HelloServlet

package hello.servlet.basic;


import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@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);

    }
}
  • @WebServlet: 서블릿을 등록하고 URL 매핑을 설정하는 애노테이션이다.
    • name: 서블릿 이름.
    • urlPatterns: 매핑할 URL 패턴을 지정한다.

브라우저 실행

브라우저에서 다음 URL을 입력하면 서블릿이 실행된다.

URL: http://localhost:8080/hello?username=world

브라우저 화면과 콘솔에는 다음과 같은 응답이 출력된다.

 

HTTP 요청 메시지 로그로 확인하기

 

HTTP 요청 메시지와 응답 메시지를 로그로 확인할 수 있다.

이를 위해 application.properties에 다음 설정을 추가한다.

logging.level.org.apache.coyote.http11=trace

이 설정을 통해 서버에서 받은 HTTP 요청 메시지를 로그에 출력할 수 있다. 개발 중에는 이 설정이 유용하지만, 운영 서버에서는 성능 저하를 유발할 수 있으므로 주의해야 한다.

 

서버를 다시 시작하고, 요청해보면 서버가 받은 HTTP 요청 메시지를 출력하는 것을 확인할 있다.

 

서블릿 컨테이너 동작 방식

스프링 부트는 내장 톰캣 서버를 사용하여 서블릿을 실행한다. 서블릿 컨테이너는 클라이언트의 HTTP 요청을 처리하고 응답을 반환하는 데 중요한 역할을 한다. 서블릿 컨테이너는 서블릿 객체를 생성하고, 그 객체를 통해 요청과 응답을 처리하는 동작 방식을 따른다.

 

  • 내장 톰캣 서버 생성: 스프링 부트는 톰캣과 같은 웹 서버를 애플리케이션 내부에 내장하고 실행한다. 스프링 부트가 실행되면 내장 톰캣 서버가 함께 시작된다.
  • 서블릿 생성: 서블릿 컨테이너는 클라이언트 요청이 있을 때 서블릿 객체를 생성한다. 생성된 서블릿은 HTTP 요청을 처리하는 데 사용된다.
  • 요청 처리: 클라이언트로부터 요청이 들어오면, 웹 애플리케이션 서버는 request와 response 객체를 생성하여 서블릿에 전달한다. 서블릿은 이 객체들을 이용해 요청을 처리하고, 응답 데이터를 작성한다.
  • 응답 반환: 서블릿이 응답 데이터를 작성하면, 웹 애플리케이션 서버는 해당 데이터를 클라이언트에 응답으로 반환한다.

 

HTTP 요청, HTTP 응답 메시지

 

애플리케이션 서버의 요청 응답 구조

웹 애플리케이션 서버는 클라이언트의 HTTP 요청을 받아 이를 처리한 후, HTTP 응답을 반환하는 역할을 한다. 이 과정은 다음과 같은 순서로 이루어진다.

  1. 클라이언트 요청: 클라이언트가 특정 URL로 HTTP 요청을 보낸다. 예를 들어, http://localhost:8080/hello로 요청을 보내면, 웹 애플리케이션 서버는 해당 요청을 수신한다.
  2. Request, Response 객체 생성: 웹 애플리케이션 서버는 클라이언트의 요청을 처리하기 위해 request와 response 객체를 생성한다. request 객체는 요청 데이터를 담고, response 객체는 응답 데이터를 담는 데 사용된다.
  3. 서블릿 처리: 서블릿 컨테이너는 request 객체를 서블릿으로 전달하여 요청을 처리한다. 서블릿은 요청에 따라 비즈니스 로직을 처리하고, 그 결과를 response 객체에 작성한다.
  4. 응답 반환: 서블릿이 처리를 마치면, 웹 애플리케이션 서버는 response 객체에 담긴 내용을 바탕으로 HTTP 응답을 생성하고, 이를 클라이언트로 전송한다.

참고

HTTP 응답에서 Content-Length 애플리케이션 서버가 자동으로 생성해준다.

 

welcome 페이지 추가

개발 진행 상황을 확인하기 위한 간단한 Welcome 페이지를 만들어보자. webapp 폴더에 index.html 파일을 추가하면, http://localhost:8080 에 접속할 때 해당 페이지가 열린다.

 

main/webapp/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    <li><a href="basic.html">서블릿 basic</a></li>
</ul>
</body>
</html>

 

기본 페이지 구성

서블릿의 기능을 테스트하기 위해 여러 기능을 담은 페이지를 추가할 수 있다. 예를 들어, basic.html 페이지에 서블릿과 HTTP 요청/응답 관련 기능을 링크로 연결한다.

 

main/webapp/basic.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    <li>hello 서블릿
        <ul>
            <li><a href="/hello?username=servlet">hello 서블릿 호출</a></li>
        </ul>
    </li>
    <li>HttpServletRequest
        <ul>
            <li><a href="/request-header">기본 사용법, Header 조회</a></li>
            <li>HTTP 요청 메시지 바디 조회
                <ul>
                    <li><a href="/request-param?username=hello&age=20">GET - 쿼리
                        파라미터</a></li>
                    <li><a href="/basic/hello-form.html">POST - HTML Form</a></li>
                    <li>HTTP API - MessageBody -> Postman 테스트</li>
                </ul>
            </li>
        </ul>
    </li>
    <li>HttpServletResponse
        <ul>
            <li><a href="/response-header">기본 사용법, Header 조회</a></li>
            <li>HTTP 응답 메시지 바디 조회
                <ul>
                    <li><a href="/response-html">HTML 응답</a></li>
                    <li><a href="/response-json">HTTP API JSON 응답</a></li>
                </ul>
            </li>
        </ul>
    </li>
</ul>
</body>
</html>

'Spring MVC' 카테고리의 다른 글

[MVC] 서블릿(4)  (0) 2024.10.15
[MVC] 서블릿(3)  (0) 2024.10.14
[MVC] 서블릿(2)  (1) 2024.10.11
[MVC] 웹 애플리케이션 이해  (0) 2024.10.10