본문 바로가기
Spring

스프링부트에서 톰캣이 어떻게 자동으로 설정되어 실행되는가

by devLog by Ronnie's 2023. 1. 16.

스프링부트를 이용하면 내장 서블릿 컨테이너인 톰캣이 기본적으로 내장되어 있다. 근데 여기서 어떻게 톰캣이 자동으로 설정되어 기본 서버로서의 역할을 하는지 궁금하여 알아본 내용을 정리한다.

 

스프링부트에서 톰캣이 어떻게 자동으로 설정되어 실행되는가

 

스프링부트에서 톰캣이 어떻게 자동으로 설정되어 실행되는가

 

서블릿 컨텐이너 - 톰캣


스프링부트에서 스프링 웹을 사용하게 되면 프로젝트에는 톰캣이 기본적으로 내장되어 있다.

근데 여기서 톰캣이 어떻게 자동으로 설정되어 기본 서버로 실행이 되는 것일까?

 

이것을 알기위해서는 먼저 스프링부트에서 빈을 어떻게 설정하는지 알아야한다. 스프링부트에서 빈은 두번의 단계를 거쳐서 생성된다.

 

첫번째로 @ComponentScan 하위 패키지에서 @Component, @Service, @Controller 등의 컴포넌트를 먼저 스캔해서 빈을 생성한다. (@ComponentScan은 @SpringBootApplication 안에 있음)

두번째로 @EnableAutoConfiguration에서 추가적인 빈들을 생성하게 된다. @EnableAutoConfiguration도 마찬가지로 @SpringBootApplication 안에 존재한다.

 

 

@EnableAutoConfiguration는 spring-boot-autoconfigure 모듈 안에 spring.factories 라는 파일이 존재하는데 그 파일 안에는 자동 설정을 위한  클래스들이 지정되어 있다. @EnableAutoConfiguration를 사용함으로써 해당 파일에 선언되어 있는 것들을 빈으로 등록하게 된다.

그 중에서 org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration 이 선언되어 있어 해당 클래스도 빈으로 등록하게 된다.

해당 클래스를 들어가보자. 그러면 다음과 같이 웹서버에 대한 설정이 있는 것을 확인할 수 있다.

여기서 ServletWebServerFactoryConfiguration 클래스에 들어가보자.

 

그러면 다음과 같이 tomcat / jetty / undertow의 설정을 볼 수 있게 된다. 뭔가 이상한 것이 보이는가?

바로 @ConditionalOnClass 어노테이션을 보면 Tomcat에 대한 설정만 활성화 되어 있는 것을 확인 할 수 있다.

@ConditionalOnClass 어노테이션은 지정된 클래스가 classpath에 존재해야 구성 요소로 등록해주는 역할을 한다.

그래서 해당 조건을 만족하는 EmbeddedTomcat을 통해 TomcatServletWebServerFactory를 빈으로 등록하게 된다.

추가적으로 만약 기본 내장 WAS인 톰캣을 사용하고 싶지 않다면 톰캣에 대한 설정을 지우고 다른 WAS의 의존성을 추가하면 된다.

 

 

혹시 WAS와 Web Server에 차이를 정확히 알고 싶다면 아래 글을 참고 바랍니다.

WAS와 Web Server 차이

 

아파치와 톰캣 및 WAS와 WebServer

서버에 관한 공부를 할때 헷갈릴 수 있는 내용인 아파치와 톰캣의 관한 차이점과 웹서버와 와스(WAS)에 대한 차이점을 정리한다. 아파치와 톰캣 및 WAS와 WebServer 아파치(apache) & 톰캣(tomcat) 먼저 아

sjparkk-dev1og.tistory.com

# application.yml (적어놓은 값은 default)

server:
	tomcat:
		threads:
			max: 200 # 생성할 수 있는 thread의 총 개수
			min-spare: 10 # 항상 활성화 되어있는(idle) thread의 개수
		max-connections: 8192 # 수립가능한 connection의 총 개수
		accept-count: 100 # 작업큐의 사이즈
		connection-timeout: 20000 # timeout 판단 기준 시간, 20초
	port: 8080 # 서버를 띄울 포트번호

해당 설정이 궁금하다면 ServerProperties Class 에서 tomcat을 검색해서 찾아볼 수 있다.

 

 

댓글