내장 웹 서버 이해
내장 웹 서버 이해
스프링 부트는 웹 서버가 아니다.
스프링 부트는 톰켓을 자동으로 등록 해줘서 웹 서비스를 이용할 수 있다.
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(""); writer.println("Hey Tomcat"); writer.println(""); writer.println("Hello Tomcat"); writer.println(""); } }; String servletName = "helloServelet"; tomcat.addServlet("/",servletName,servlet); context.addServletMappingDecoded("/hello",servletName); tomcat.start(); tomcat.getServer().await(); }
이 코드를 실행해 보면(나는 실행이 안되지만... 된다고 한다면...)
웹서버를 실행 시킬 수 있다. 그러면 위에서 말했듯이 스프링 부트는 이러한 코드를 어딘가에 등록을 해줬다는 건데
이 사진은 AutoConfigure 즉, 스프링 부트의 자동 설정 기능 중 하나를 나타낸다.
Spring.factories라는 파일을 열어 보면
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
이런식으로 Servlet과 DispatcherServlet이 등록이 되있다는 걸 확인 할 수 있다.
더 자세히 들어가보면
다양한 웹서버들이 등록이 되있는 걸 확인 할 수 있다.
스프링부트는 tomcat객체를 가져와서 사용하는 것을 확인 할 수 있다.
또한 tomcat뿐만아니라 스프링의 핵심이라고 할 수 있는 DispatcherServlet도 되있는 걸 확인 할 수 있다.
결론은 스프링부트는 톰캣(웹서버), DispatcherServlet을 각자 자동 설정 해주는 것을 알 수 있다.
스프링 부트는 기본적으로 톰캣을 실행한다. 톰캣이 아니라 다른 웹서버로 실행 시켜주고 싶다면 어떻게 해야할까?
기본적으로 톰캣을 실행하기 때문에 다른 웹서버로 실행을 하려고 한다면 강제로 톰캣을 받지?않게 해야한다.
먼저
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat
톰캣의 의존성을 지워주고
org.springframework.boot spring-boot-starter-jetty
jetty를 등록해주면 된다. jetty역시 스프링 부트에서 의존성 관리를 해주기 때문에 version을 입력하지 않아도 된다.
그러면 jetty로 실행이 된다는걸 확인 할 수 있다.
또한 application.properties에 spring.main.web-application-type=none 를 입력해주게 되면 웹서버를 사용하지 않고 main문만 실행이 된다. 즉, 웹서버를 이용하지 않고 종료된다.
server.port=7070로 입력하게 되면 7070으로 포트를 바꿀 수 있다.
저 포트를 0으로 주게된다면 어떤 일이 발생할까?
이런식으로 알아서 사용하지 않는 포트로 이동한다고 한다.
@Component public class PortListener implements ApplicationListener{ @Override public void onApplicationEvent(ServletWebServerInitializedEvent event) { ServletWebServerApplicationContext applicationContext = event.getApplicationContext(); System.out.println( applicationContext.getWebServer().getPort()); } }
이건 port번호를 가져오는 코드다.
이런식으로 같다는 걸 확인 할 수 있다.
from http://b-programmer.tistory.com/14 by ccl(A) rewrite - 2020-03-20 20:20:27
댓글
댓글 쓰기