본문 바로가기
Spring/Spring MVC

[Spring MVC] 6. 서블릿 등록과 사용(Spring Boot 환경)

by Kloong 2022. 11. 23.
더보기

Spring Boot & Thymeleaf 시리즈는 김영한 님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의를 정리한 글입니다. 글에 첨부된 사진은 해당 강의의 강의 자료에서 캡쳐한 것입니다. 제 Github에만 올려뒀다가, 정보 공유와 강의 홍보(?)를 위해 블로그에도 업로드합니다.

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com

 

마크다운 형식으로 작성한 글을 블로그에 다시 올리는 거라 가독성이 많이 떨어집니다. 조금더 편하게 보시려면 아래의 Github repository에서 보시면 됩니다.

 

GitHub - Kloong1/TIL: Today I Learned.

Today I Learned. Contribute to Kloong1/TIL development by creating an account on GitHub.

github.com

서블릿 등록과 사용 (스프링 부트 환경)

서블릿은 스프링과 관계 없이 등록하고 사용할 수 있다. Tomcat 같은 WAS를 직접 설치하고, 그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린 다음, Tomcat 서버를 실행하면 된다. 하지만 이 과정은 매우 번거롭다. 스프링 부트를 사용하면 내장 Tomcat 서버를 활용해서 편리하게 서블릿 코드를 실행할 수 있다.

Spring Boot 서블릿 환경 구성

@ServletComponentScan

Spring boot는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan을 지원한다. 현재 패키지를 포함한 하위 패키지의 모든 서블릿을 찾아서 등록해준다.

ServletApplication.java
package com.kloong.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);
    }

}

서블릿 등록하기

HelloServlet.java
package com.kloong.servlet.basic;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.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"); //Content-Type 헤더 설정
        response.setCharacterEncoding("utf-8"); //Content-Type 헤더 설정
        response.getWriter().write("Hello " + username); //응답 메시지 바디
    }
}
  • @WebServlet(name = "helloServlet", urlPatterns = "/hello")
    • name: 서블릿 이름
    • urlPatterns: Mapping 할 URL
    • name과 urlPatterns은 다른 서블릿과 중복되어선 안된다.

Mapping해둔 URL로 HTTP 요청이 오면 서블릿 컨테이너는 해당 서블릿의 다음 메소드를 호출한다.
protected void service(HttpServletRequest request, HttpServletResponse response)

localhost:8080/hello?username=kloong 요청에 대한 실행 결과는 다음과 같다.

실행 결과 - 콘솔
HelloServlet.service
request = org.apache.catalina.connector.RequestFacade@2b6f38b3
response = org.apache.catalina.connector.ResponseFacade@bf59210
username = kloong
  • HttpServletRequest 객체와 HttpServletResponse 객체를 직접 출력하면 구현체에 대한 정보가 출력된다.
    • HttpServletRequestHttpServletResponse 는 자바 진영에서의 표준 인터페이스이다.
    • 두 인터페이스에 대한 여러 구현체가 있지만, Spring boot에는 Tomcat이 내장되어 있으므로 Tomcat이 사용하는 구현 클래스 정보가 나타나는 것이다.
  • 쿼리 파라미터로 보내진 username=kloong 이 잘 출력되는 것을 확인할 수 있다.
실행 결과 - 웹 브라우저

  • 웹 브라우저 화면에는 response.getWriter().write("Hello " + username) 에 의해 응답 메시지 바디에 들어간 "Hello kloong"이 그대로 출력된다.
  • 응답 헤더를 보면 Content-Type 헤더가 의도한 대로 잘 설정된 것을 확인할 수 있다.

참고: HTTP request 메시지 전문을 로그로 확인하기

프로젝트의 application.properties에 다음 설정을 추가하면 된다.

application.properties
logging.level.org.apache.coyote.http11=debug

요청을 보내보면 서버가 받은 HTTP request 메시지 전문이 콘솔에 출력되는 것을 확인할 수 있다. 물론 개발 단계에서 유용하게 쓰이는 것일 뿐, 실제 운영 서버에서 이와 같이 모든 요청 정보를 로깅하면 성능 저하를 발생시킬 수 있다.

서블릿 컨테이너 동작 방식

내장 Tomcat 서버

  • Spring boot로 어플리케이션을 실행을 하면 (ServletApplication@SpringBootApplication annotation이 붙어있는 것을 확인할 수 있다) Spring boot가 내장 Tomcat 서버를 같이 올린다.
  • Tomcat 서버는 내부에 서블릿 컨테이너를 가지고 있다. 따라서 Tomcat이 실행되면서 서블릿 컨테이너에 서블릿을 생성한다.
HTTP 요청 메시지에 대한 응답

  • Tomcat이 HTTP 요청을 기반으로 HttpServletRequest, HttpServletResponse 객체를 만든다.
  • 서블릿 컨테이너에 싱글톤으로 생성되어 있는 서블릿의 service method를 호출하면서, 해당 객체를 파라미터로 넘겨준다.
  • 서블릿에서 로직을 실행하며 response 객체에 값을 설정해서 응답 메시지를 만든다.
  • Tomcat이 response 객체 정보로 HTTP 응답 메시지를 만들어 반환한다.

참고: HTTP 응답에서 Content-Length는 WAS가 자동으로 생성해준다.

참고: Welcome page 추가

앞으로 개발할 기능들을 웹 브라우저에서 편하게 확인할 수 있도록 welcome 페이지를 만들어두자.

프로젝트의 src/main/webapp/ 디렉토리에 index.htmlbasic.html을 추가해두자.

댓글