자바(Java) 백엔드 생태계에서 Spring Framework는 절대적인 표준입니다. 수많은 엔터프라이즈 기업과 스타트업이 모두 스프링을 기반으로 거대한 서비스를 구축하고 있습니다. 그러나 과거의 레거시(Legacy) Spring은 초기 세팅이 너무나도 고통스러웠습니다. XML 파일에 빈(Bean)을 등록하고, 톰캣(Tomcat) 서버를 별도로 설치해서 .war 파일을 배포하고, 수십 개의 의존성 버전이 꼬이는 이른바 'XML 지옥(XML Hell)'과 '의존성 지옥(Dependency Hell)'을 겪어야만 했습니다.
이러한 고통을 완벽하게 해결하고 개발자가 오직 '비즈니스 로직(Business Logic)' 작성에만 집중할 수 있도록 혁신을 일으킨 구원자가 바로 Spring Boot(스프링 부트)입니다.
이번 포스팅에서는 레거시 Spring과 Spring Boot의 결정적인 차이점을 해부하고, 실무 관점에서의 완벽한 첫 세팅 방법에 대하여 다뤄보겠습니다.

⚙️ 1. 레거시 Spring의 고통과 Spring Boot의 탄생
과거 전자정부표준프레임워크나 2010년대 초반의 레거시 Spring MVC 프로젝트를 열어보면 web.xml, root-context.xml, servlet-context.xml 등 수많은 설정 파일들이 개발자를 반깁니다. 데이터베이스 연결 하나를 설정하기 위해 수십 줄의 XML 코드를 작성해야 했고, 라이브러리 간의 버전 충돌(예: Hibernate 버전과 Spring 버전의 비호환)을 잡기 위해 며칠 밤을 새우는 일도 비일비재했습니다.

Spring Boot의 탄생 철학은 바로 "Convention over Configuration (설정보다 관례)"입니다. 즉, "대부분의 프로젝트가 사용하는 표준적인 설정(관례)은 스프링 부트가 알아서(Auto Configuration) 해줄 테니, 넌 그냥 코드나 짜!"라는 것입니다. 이를 통해 개발자는 단 몇 분 만에 완벽하게 동작하는 웹 서버를 띄울 수 있게 되었습니다.
🚀 2. Spring Boot의 3가지 핵심 마법 (핵심 특징)
스프링 부트가 레거시 스프링을 압도하는 이유는 크게 세 가지 혁신적인 기능 덕분입니다.
1. 내장 WAS (Embedded Tomcat):
레거시 시절에는 코드를 .war 파일로 압축한 뒤, 별도의 톰캣(Tomcat) 서버 소프트웨어를 설치하고 그 안의 webapps 폴더에 파일을 넣고 서버를 재시작해야 했습니다. 하지만 스프링 부트는 톰캣(또는 Jetty, Undertow)을 라이브러리 형태로 자신 안에 내장(Embedded)해 버렸습니다. 이제 우리는 그저 public static void main(String[] args)가 있는 자바 클래스를 실행(Run)하기만 하면, 자동으로 내장 톰캣이 8080 포트에서 구동됩니다. 배포 파일도 .jar 하나로 끝납니다.
2. 자동 설정 (Auto Configuration):
클래스패스(Classpath)에 특정 라이브러리가 존재하면, 스프링 부트가 이를 감지하고 자동으로 관련된 빈(Bean)을 생성하고 주입합니다. 예를 들어, spring-boot-starter-data-jpa와 h2 데이터베이스 라이브러리를 추가하기만 하면, 젠장맞을 DB 커넥션 풀 설정이나 DataSource XML 작성 없이 곧바로 DB를 쿼리할 수 있습니다. @EnableAutoConfiguration(현재는 @SpringBootApplication에 포함됨) 애노테이션이 이 모든 마법의 시작점입니다.
3. 스타터 의존성 (Starter Dependencies):
과거에는 Spring, Jackson, Hibernate, Slf4j 등 수십 개의 라이브러리를 `pom.xml`이나 `build.gradle`에 일일이 적고 서로 호환되는 버전을 찾느라 고생했습니다. 스프링 부트는 spring-boot-starter-web 하나만 추가하면, 웹 개발에 필요한 톰캣, Spring MVC, JSON 변환기(Jackson) 등 완벽하게 버전 호환성이 검증된 라이브러리 세트(Bundle)를 한 번에 끌어옵니다. 이제 더 이상 버전 충돌을 두려워할 필요가 없습니다.
💡 3. Spring Boot 3.x 세대의 새로운 패러다임
최근 발표된 Spring Boot 3.x 버전은 자바 생태계에 큰 지각 변동을 일으켰습니다. 실무 개발자라면 반드시 알아야 할 3.x의 핵심 변화는 다음과 같습니다.
- Java 17 이상 강제: 기존 Java 8이나 11로는 더 이상 Boot 3.x를 실행할 수 없습니다. Java 17의 레코드(Record), 텍스트 블록(Text Block), 향상된 스위치(Switch) 문법을 적극적으로 활용할 수 있게 되었습니다.
- Jakarta EE 9/10 마이그레이션: 오라클과의 상표권 분쟁으로 인해 Java EE가 Jakarta EE로 이관되면서, 패키지 네임스페이스가
javax.*에서jakarta.*로 전면 교체되었습니다.javax.servlet.http.HttpServletRequest가jakarta.servlet.http.HttpServletRequest로 바뀌는 등 대대적인 코드 수정이 필요합니다. - GraalVM 네이티브 이미지 지원 (AOT): 자바의 고질적인 단점인 '느린 초기 부팅 속도'와 '거대한 메모리 사용량'을 해결하기 위해 미리 컴파일(Ahead-Of-Time)하여 가벼운 바이너리 실행 파일로 만들어버리는 GraalVM 네이티브 이미지가 공식 지원됩니다. 이는 서버리스(Serverless) 환경과 쿠버네티스(Kubernetes) 환경에서 엄청난 비용 절감을 가져옵니다.
💻 4. 완벽한 첫 번째 Application 클래스 해부
아주 단순하지만 모든 마법이 담겨있는 스프링 부트의 진입점(Entry Point) 코드를 살펴봅시다.
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// 🌟 이 어노테이션 하나가 스프링 부트의 3대 핵심 마법을 모두 발동시킵니다.
// 1. @Configuration: 이 클래스를 스프링의 설정 클래스로 지정
// 2. @EnableAutoConfiguration: 자동 설정 마법 발동
// 3. @ComponentScan: 현재 패키지와 하위 패키지의 모든 Bean을 찾아 등록
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
// 내장 톰캣을 띄우고 스프링 컨테이너를 생성하여 애플리케이션을 구동하는 단 한 줄의 코드!
SpringApplication.run(DemoApplication.class, args);
}
}
🎯 5. 마무리 및 다음 단계
지금까지 과거 레거시 스프링의 복잡하고 무거운 설정 지옥에서 벗어나, 개발자에게 비즈니스 로직에 집중할 수 있는 완벽한 자유를 선사한 Spring Boot의 탄생 배경과 핵심 마법 3가지에 대해 다루어 보았습니다. 내장 WAS와 자동 설정은 현대 백엔드 개발의 표준이 되었습니다.
개념을 이해했으니 이제 실제로 프로젝트를 만들어볼 차례입니다. 그런데 막상 인텔리제이(IntelliJ)를 켜서 프로젝트를 생성하려고 하면, Maven과 Gradle 중 무엇을 선택해야 할지, Spring Web 외에 어떤 의존성들을 처음에 추가해 두어야 실무에서 고생하지 않는지 막막하기만 합니다. 이어지는 02단계 포스팅에서는 "클릭 몇 번으로 뼈대를 완성한다!" Spring Initializr를 활용한 완벽한 실무 프로젝트 디렉토리 구조 설계와 필수 의존성(Dependencies) 세팅 가이드에 대해 아주 치밀하게 파헤쳐 보겠습니다!
'Framework > Spring Boot' 카테고리의 다른 글
| [Spring Boot] 의존성 주입(DI)과 IoC 컨테이너: 객체의 생과 사를 스프링에게 맡기다 (0) | 2026.07.23 |
|---|---|
| [Spring Boot] Logback 완벽 가이드: 서버의 유일한 목격자, 로깅(Logging) 마스터하기 (0) | 2026.07.23 |
| [Spring Boot] application.yml 완벽 가이드: Profile을 활용한 무결점 환경 분리 전략 (0) | 2026.07.23 |
| [Spring Boot] Spring Boot MVC 패턴 완벽 해부: Controller, Service, Repository의 분업 (0) | 2026.07.23 |
| [Spring Boot] Spring Initializr: 완벽한 프로젝트 뼈대와 실무 의존성 설계 가이드 (0) | 2026.07.23 |