| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
- Array
- Java
- 스프링부트
- 인텔리제이
- list
- CSS
- 배열
- java테스트
- Eclipse
- 자바
- IntelliJ
- junit5
- Visual Studio Code
- input
- math
- ArrayList
- 정규식
- 테스트자동화
- HashMap
- string
- vscode
- js
- html
- 자바스크립트
- junit
- SpringBoot
- 문자열
- 자바문법
- 단위테스트
- javascript
- Today
- Total
어제 오늘 내일
[Spring Boot] 톰캣(Tomcat)을 따로 설치 안 해도 된다고? 내장 서버의 비밀 본문
안녕하세요!
오늘은 Spring Boot를 공부하면서 무심코 지나치기 쉽지만,
사실은 스프링 부트의 가장 강력한 무기 중 하나인 "내장 서버(Embedded Server)"에 대해 알아보겠습니다.
"서버를 띄운다"라는 개념이 스프링 부트 이전과 이후로 어떻게 바뀌었는지 알면,
왜 실무에서 스프링 부트를 쓰는지 이해하게 됩니다.
1. 옛날 방식 (Legacy) vs 현재 방식 (Spring Boot)
👴 라떼는 말이야... (외장 서버 방식)
불과 몇 년 전만 해도 웹 애플리케이션을 하나 띄우려면 과정이 험난했습니다.
- 컴퓨터에 Tomcat(WAS)을 다운로드해서 설치한다.
- 환경 변수(JAVA_HOME, CATALINA_HOME)를 잡는다.
- 개발한 코드를 WAR 파일로 빌드한다.
- Tomcat의
webapps폴더에 WAR 파일을 넣는다. - Tomcat의
bin/startup.bat을 실행한다.
비유: "집(Tomcat)을 먼저 지어놓고, 그 안에 가구(내 코드)를 이사시키는 방식"
👶 스프링 부트 방식 (내장 서버)
지금은 어떤가요?
- 그냥
main메서드의 Run(▶) 버튼을 누른다. - 끝.
비유: "가구가 이미 다 들어있는 캠핑카(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을 쓰지만, 성능이나 특수 목적을 위해 Jetty나 Undertow로 갈아끼울 수도 있습니다.
- 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 버튼을 누르는 것뿐입니다! 🚀
'IT > SpringBoot' 카테고리의 다른 글
| [Spring Boot] 빈(Bean)의 탄생과 죽음: 생명주기(Lifecycle)와 스코프(Scope) 완벽 정리 (0) | 2026.03.09 |
|---|---|
| [Spring Boot] "객체 관리는 스프링에게 맡기세요!" 의존성 주입(DI) 완벽 가이드 (0) | 2026.03.08 |
| [Spring Boot] Docker로 3분 만에 모니터링 구축하기 (Prometheus + Grafana) (0) | 2026.03.04 |
| [Spring Boot] 서버의 건강검진 리포트, Actuator 완벽 가이드 (0) | 2026.03.03 |
| [Spring Boot] 마법의 비밀, Auto Configuration (자동 설정) (1) | 2026.03.01 |
