Backend

[Spring] Spring Boot에서 Servlet 사용하기

pebblepark 2022. 1. 11. 01:07
  • 스프링 부트 환경에서 서블릿을 등록하고 사용해보자

스프링 부트는 톰캣 서버를 내장하고 있음 -> 별도의 톰캣 서버 설치 없이 서블릿 코드 실행이 가능함

환경 구성

  • Gradle Project
  • Spring Boot 2.6.2

build.gradle

plugins {
    id 'org.springframework.boot' version '2.6.2'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'war'
}

group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

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

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

}
  • @ServletComponentScan : 서블릿을 직접 등록할 수 있도록 스프링 부트에서 지원

 

서블릿 등록

HelloServlet

package hello.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 req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet.service");
        System.out.println("request = " + req);
        System.out.println("response = " + resp);

        String username = req.getParameter("username");
        System.out.println("username = " + username);

        resp.setContentType("text/plain");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().write("hello " + username);
    }
}
  • @WebServlet: 서블릿 어노테이션
    • name: 서블릿 이름
    • urlPatterns: URL 매핑 주소

 

HTTP 요청 -> 매핑 URL 호출 -> 서블릿 컨테이너가 아래의 메서드 실행
protected void service(HttpServletRequest req, HttpServletResponse resp)

 

실행결과

  • http://localhost:8080/hello?username=world
HelloServlet.service
request = org.apache.catalina.connector.RequestFacade@25780651
response = org.apache.catalina.connector.ResponseFacade@2bbfec8e
username = world

 

서블릿 컨테이너 동작 방식

  • 웹 브라우저에서 요청
  • 웹 애플리케이션 서버(WAS)에서 HTTP 요청 메시지를 기반으로 request, response 생성
  • 해당 request, response를 서블릿 컨테이너에 전달 => service(request, response)
  • 서블릿 컨테이너에서 요청이 종료되면 response 객체 정보를 통해 HTTP 응답 생성
  • 웹 브라우저에 응답 반환