Java/Spring Boot

[Spring Boot] 내장 웹 서버

hh_lin 2022. 3. 5. 15:04

1. 스프링 부트는 웹 서버가 아니다.

: 스프링 부트는 내장 서블릿 컨테이너를 쉽게 사용할 수 있게 해주는 툴

ex) 웹 서버 : Tomcat, Jetty, Netty, Undertow

 

 

 

 

 

 

 

 

2. 톰캣을 이용해 서버 만들기

  • 톰캣 객체 생성
  • 포트 설정
  • 톰캣에 컨텍스트 추가
  • 서블릿 만들기
  • 톰캣에 서블릿 추가
  • 컨텍스트에 서블릿 매핑
  • 톰캣 실행 및 대기

 

웹 서버는 Java 코드로 서버를 만들 수 있는 기능을 제공함

 

기본적으로 Spring Boot Application을 만들었으면 의존성에 Tomcat이 들어와있음

(없는 경우 dependency에 spring-boot-starter-web 있는지 확인)

 

 

# 실습코드

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;

public class Application {

	public static void main(String[] args) throws LifecycleException {

		Tomcat tomcat = new Tomcat(); // 톰캣 객체 생성
		tomcat.setPort(8080); // 포트 설정

		Context context = tomcat.addContext("/", "/"); // 톰캣에 컨텍스트 추가

		HttpServlet servlet = new HttpServlet() { // 서블릿 만들기
			@Override
			protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
				ServletException,
				IOException {
				PrintWriter writer = resp.getWriter();
				writer.println("<html><head><title>");
				writer.println("Hey, Tomcat");
				writer.println("</title></head>");
				writer.println("<body><h1>Hello Tomcat<h1></body>");
				writer.println("</html>");
			}
		};

		String servletName = "helloServlet";
		tomcat.addServlet("/", servletName, servlet); // 톰캣에 서블릿 추가
		context.addServletMappingDecoded("/hello", servletName); // 컨텍스트에 서블릿 매핑
        
		tomcat.start(); // 톰캣 실행
		// tomcat.getServer().await(); // 톰캣 대기

	}
    
}

 

 

 

 

 

 

 

 

 

 

3. Spring Boot는 자동설정을 통해 위의 모든 과정을 보다 유연하게 설정 및 실행

① ServletWebServerFactoryAutoConfiguration : 서블릿 웹 서버 생성

: spring.factories 내에 자동설정 부분을 보면 ServletWebServerFactoryAutoConfiguration 확인 가능

 

# Auto Configure
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\

 

 

 

# ServletWebServerFactoryAutoConfiguration

@ConditionalOnClass(ServletRequest.class)

: ServletRequest class가 classpath에 있으면 자동설정으로 사용함

 

@Import

: import는 다른 configuration을 같이 사용하는 것

 

 

 

# ServletWebServerFactoryConfiguration

 

@ConditionalOnClass({ Servlet.class, Tomcat.class, UpgradeProtocol.class })

: Servlet, Tomcat, UpgradeProtocol 클래스가 있으면 설정으로 사용함

 

 

 

# TomcatServletWebServerFacotry

: tomcat 생성

 

 

 

 

 

② DispatcherServletAutoConfiguration : 서블릿 만들고 등록

서블릿 기반의 MVC라면 DispatcherSevlet을 만들어야 함

 

마찬가지로 spring.properties 파일 내에서 DispatcherServletAutoConfiguration 확인 가능

# Auto Configure
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\

 

 

# DispatcherServletAutoConfiguration

dispatcherServlet : httpservlet을 상속해서 만든 Spring MVC의 핵심 클래스

DispatcherServletAutoConfiguration에서 dispatcherServlet을 만들고 등록함

 

 

 

# ServletWebServerFactoryAutoConfiguration 과 DispatcherServletAutoConfiguration 이 떨어져 있는 이유

: 서블릿 컨테이너는 pom.xml에 따라 달라질 수 있지만, 서블릿은 변하지 않기 때문에 분리되어 있음

  즉, dispatcherServlet은 어떠한 서블릿 컨테이너를 사용하는지 상관없이 서블릿을 만들고 서블릿 컨테이너에 등록함

 

 

 

 

 

 

 

 

 

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

스프링 부트 개념과 활용 - 인프런 | 강의

스프링 부트의 원리 및 여러 기능을 코딩을 통해 쉽게 이해하고 보다 적극적으로 사용할 수 있는 방법을 학습합니다., - 강의 소개 | 인프런...

www.inflearn.com