공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
서블릿이란?
서블릿은 자바 기반 웹 애플리케이션에서 클라이언트의 요청을 처리하고, 응답을 제공하는 역할을 하는 서버 측 컴포넌트이다. 서블릿은 톰캣과 같은 웹 애플리케이션 서버에 등록되어 실행된다. 과거에는 서블릿을 사용하려면 톰캣 같은 웹 서버를 직접 설치하고, 해당 서버에 서블릿 코드를 빌드하여 올려야 했으나, 스프링 부트는 톰캣 서버를 내장하고 있어서 훨씬 간편하게 서블릿을 실행할 수 있다.
스프링 부트 서블릿 환경 구성
스프링 부트에서는 @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 응답을 반환하는 역할을 한다. 이 과정은 다음과 같은 순서로 이루어진다.
- 클라이언트 요청: 클라이언트가 특정 URL로 HTTP 요청을 보낸다. 예를 들어, http://localhost:8080/hello로 요청을 보내면, 웹 애플리케이션 서버는 해당 요청을 수신한다.
- Request, Response 객체 생성: 웹 애플리케이션 서버는 클라이언트의 요청을 처리하기 위해 request와 response 객체를 생성한다. request 객체는 요청 데이터를 담고, response 객체는 응답 데이터를 담는 데 사용된다.
- 서블릿 처리: 서블릿 컨테이너는 request 객체를 서블릿으로 전달하여 요청을 처리한다. 서블릿은 요청에 따라 비즈니스 로직을 처리하고, 그 결과를 response 객체에 작성한다.
- 응답 반환: 서블릿이 처리를 마치면, 웹 애플리케이션 서버는 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 |