내장 웹 서버 이해

내장 웹 서버 이해

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

스프링 부트는 톰켓을 자동으로 등록 해줘서 웹 서비스를 이용할 수 있다.

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

댓글

이 블로그의 인기 게시물

데이터 바인딩 추상화 - propertyEditor

[sts] spring boot groovy 적용 실행 하기

2020 LCK 롤챔스 Spring 경기 재개 및 일정