어제 오늘 내일

[Spring Boot] 톰캣(Tomcat)을 따로 설치 안 해도 된다고? 내장 서버의 비밀 본문

IT/SpringBoot

[Spring Boot] 톰캣(Tomcat)을 따로 설치 안 해도 된다고? 내장 서버의 비밀

hi.anna 2026. 3. 4. 07:53

안녕하세요!

오늘은 Spring Boot를 공부하면서 무심코 지나치기 쉽지만,

사실은 스프링 부트의 가장 강력한 무기 중 하나인 "내장 서버(Embedded Server)"에 대해 알아보겠습니다.

"서버를 띄운다"라는 개념이 스프링 부트 이전과 이후로 어떻게 바뀌었는지 알면,

왜 실무에서 스프링 부트를 쓰는지 이해하게 됩니다.


1. 옛날 방식 (Legacy) vs 현재 방식 (Spring Boot)

👴 라떼는 말이야... (외장 서버 방식)

불과 몇 년 전만 해도 웹 애플리케이션을 하나 띄우려면 과정이 험난했습니다.

  1. 컴퓨터에 Tomcat(WAS)을 다운로드해서 설치한다.
  2. 환경 변수(JAVA_HOME, CATALINA_HOME)를 잡는다.
  3. 개발한 코드를 WAR 파일로 빌드한다.
  4. Tomcat의 webapps 폴더에 WAR 파일을 넣는다.
  5. Tomcat의 bin/startup.bat을 실행한다.

비유: "집(Tomcat)을 먼저 지어놓고, 그 안에 가구(내 코드)를 이사시키는 방식"

👶 스프링 부트 방식 (내장 서버)

지금은 어떤가요?

  1. 그냥 main 메서드의 Run(▶) 버튼을 누른다.
  2. 끝.

비유: "가구가 이미 다 들어있는 캠핑카(Spring Boot). 시동만 걸면 어디서든 돌아감!"

 

이게 가능한 이유는 스프링 부트 프로젝트 안에 웹 서버(Tomcat)가 라이브러리 형태로 쏙 들어가 있기 때문입니다. 이를 Embedded Server(내장 서블릿 컨테이너)라고 부릅니다.


2. 어디에 숨어 있나요?

build.gradle에 우리가 무심코 추가했던 의존성을 볼까요?

implementation 'org.springframework.boot:spring-boot-starter-web'

 

starter-web 안을 들여다보면 spring-boot-starter-tomcat이 포함되어 있습니다.
즉, 우리가 코드를 실행하는 순간, 자바 코드가 톰캣을 실행시켜 버리는 구조입니다.

이 덕분에 우리는 java -jar 명령어 한 줄만으로 서버를 배포할 수 있게 되었고, 이 특징 덕분에 Docker클라우드(MSA) 환경에서 스프링 부트가 표준이 될 수 있었습니다.


3. 서버 설정 변경하기 (application.yml)

내장되어 있다고 해서 설정을 못 바꾸는 건 아닙니다. application.yml에서 아주 쉽게 제어할 수 있습니다.

① 포트 바꾸기 (가장 많이 씀)

기본 포트인 8080이 다른 프로그램과 충돌 난다면?

server:
  port: 9090 # 8080 -> 9090으로 변경

② 톰캣 튜닝하기 (스레드 설정)

동시 접속자가 많을 것 같다면 미리 스레드 개수를 늘릴 수 있습니다.

server:
  tomcat:
    threads:
      max: 200 # 최대 스레드 개수 (기본 200)
      min-spare: 10 # 놀고 있을 때도 유지할 최소 스레드
    connection-timeout: 20000 # 20초 동안 응답 없으면 끊기

4. 톰캣 말고 다른 건 없나요? (Undertow, Jetty)

스프링 부트는 기본으로 Tomcat을 쓰지만, 성능이나 특수 목적을 위해 JettyUndertow로 갈아끼울 수도 있습니다.

  • Tomcat: 가장 대중적, 안정적 (추천 👍)
  • Undertow: 논블로킹(Non-blocking) 방식이라 성능이 좋음 (트래픽이 엄청 많은 경우)
  • Jetty: 가볍고 메모리를 적게 먹음

[Undertow로 교체하는 방법]
build.gradle에서 톰캣을 빼고(exclude) 언더토우를 넣으면 됩니다.

dependencies {
    implementation ('org.springframework.boot:spring-boot-starter-web') {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
    }
    implementation 'org.springframework.boot:spring-boot-starter-undertow'
}

🎉 마무리

"서버를 설치하는 게 아니라, 서버를 품고 실행한다."

이것이 Spring Boot 내장 서버의 핵심입니다.
이 덕분에 우리는 복잡한 서버 설정에서 해방되어, 오로지 비즈니스 로직(기능 구현)에만 집중할 수 있게 된 것이죠.

개발자가 할 일은 그저 Run 버튼을 누르는 것뿐입니다! 🚀

 

 

반응형
Comments