[인프런 강의] 스프링 부트 개념과 활용 - 2

2020. 5. 26. 21:34강의/스프링 부트 개념과 활용

1. 내장 웹서버 이해

지난 정리때 스프링 부트를 통해 프로젝트를 만들고 실행해 보았다. 이때, 이 애플리케이션을 실행하는 것만으로 포트를 통해 웹사이트가 열려서 스프링 부트 자체가 서버라고 착각하기 쉽다고 한다. 하지만, 스프링 부트는 웹 서버가 아니다. 스프링 부트는 tomcat 라이브러리를 알아서 사용하게끔 되어있을 뿐이다. 강의에서는 따라할 필요가 없다고 했지만 스프링 부트의 기능이 아닌 tomcat객체를만들어서 웹 사이트를 열어 보았다. 아래와 같은 코드로 포트8080을 열어 웹사이트를 열 수 있다.

 

스프링 부트는 위와같은 코드가 따로 자동으로 설정되어 있기 때문에, 애플리케이션을 실행만 하더라도 포트를 열고 웹에 연결이 되는 것이다. (spring.factories 에 들어가면 ServletWebServerFactoryAutoConfiguration등을 통해 확인할 수 있다.)

단, 위의 서블릿이 스프링의 핵심인 DispatcherServlet으로 생성된다는 차이가 있다. (그 외 수많은 설정이 더해진다.) 의문이 드는 것은 서블릿 컨테이너를 만드는 일과 서블릿을 만들어 등록하는 일이 나누어서 이루어진다는 것이었는데, 그 이유는 서블릿 컨테이너는 pom.xml에 무엇을 등록하는지에 따라 바뀔 수 있지만 DispatcherServlet은 필수적인 요소이기 때문에 이것을 한곳에서 관리하지 않고 따로 떨어뜨려서 사용하는 것이었다. 

 

2. 내장 서블릿 컨테이너 응용

위에서 살펴본것처럼 스프링부트는 자동설정을 통해 tomcat을 사용한다. (tomcat이 서블릿 컨테이너이다.) 이때, 스프링 부트에서 다른 서블릿 컨테이너를 사용하는 방법에 대한 강의 내용이 있어서 정리하려고 한다.

1) 스프링 부트에서 사용하고 있던 tomcat의존성을 제거한다.

이것은 spring boot starter web이 다른 의존성들과 함께 가져오는 것이므로 <excliusions>태그를 이용하여 tomcat의존성은 가져오지 않도록 설정해준다. 

2) 다른 서블릿 컨테이너의 의존성을 추가해준다. (여기에서는 jetty사용)

 

tomcat을 제외시키고 jetty추가

* spring.properties에 web-application-type을 none으로 주면 웹으로 안띄운다.

* server.port=0 으로 설정하면 랜덤포트를 적용할 수 있다. (사용할 수 있는 포트를 랜덤으로 할당해서 띄워준다.)

 

3. ApplicationListener<ServletWebServerInitializedEvent>

위의 인터페이스를 구현한 컴포넌트는 웹서버가 실행되면 호출된다.

이를 통해 본 코드에서 서버의 정보들을 받아서 활용할 수 있다.

 

4. 독립적으로 실행가능한 JAR

저번 정리에서도 살펴보았듯이, 지금까지 실습하고 있는 내용들은 사실 애플리케이션을 실행시키지 않고 jar파일을 실행시킴으로서도 동작한다. mvn package 명령어를 실행하면 jar파일이 생기게 되는데(spring-maven-plugin이 해줌) 이것을 java -jar 를 통하여 실행시키면 되는 것이다. 이것이 가능한 이유는 jar파일 안에 프로젝트의 모든것이 다 들어있기 때문이다.

실제로 jar파일의 압축을 풀어서 내용물을 확인하면 프로젝트에 들어있는 것들이 모두 들어있다.

그렇다면 스프링 부트는 내장되어있는 JAR파일을 어떻게 실행하는 것일까? 기본적으로 자바에는 내장된  JAR파일을 로딩하는 표준적인 방법이 존재하지 않는다. 따라서 스프링 부트는 애플리케이션 클래스와 라이브러리 위치 구분한다. (org.springframework.boot.loader.jar.JarFile을 사용해서 내장 JAR를 읽고, org.springframework.boot.loader.Launcher를 사용해서 실행한다.) 이와같은 과정으로 스프링 부트는 독립적으로 실행가능한 애플리케이션이라는 goal을 이룰 수 있게 되었다.

 

5. 스프링부트 원리 파트의 핵심

  • 의존성 관리
  • 자동 설정
  • 내장 웹 서버