본문으로 건너뛰기

2.1 왜 스프링 부트인가? — Spring vs Spring Boot

스프링 프레임워크는 엔터프라이즈 자바 생태계를 장악한 최강의 도구였지만, "설정이 너무 길고 어렵다"는 치명적인 진입 장벽(XML 지옥)을 가지고 있었습니다. 새로운 웹 프로젝트 하나를 세팅하는 데만 며칠씩 허비되는 불편함을 극복하기 위해 혁명적인 서브 프로젝트가 등장했으니, 이것이 바로 Spring Boot 입니다.


🆚 1. 레거시 Spring Framework의 3대 고통 포인트

과거 순수 Spring Web MVC를 띄우려면 개발자는 다음 고난을 이겨내야 했습니다.

  1. 복잡한 의존성 버전 관리 지옥: Spring Core 4.x, Jackson 2.x, Hibernate 버전을 일일이 pom.xml에 입력하고, 서로 간에 터지는 라이브러리 충돌을 수동으로 잡아내야(Version Hell) 했습니다.
  2. 외장 웹 서버(Tomcat) 연동: 프로젝트를 WAR(웹 아카이브) 파일로 압축한 뒤, 로컬 PC에 깐 외장 Tomcat(톰캣) webapps 폴더 안에 집어넣고 서버를 다시 리스타트하는 원시적인 구동 방식이 불가피했습니다.
  3. 지독한 Boilerplate XML 설정: web.xml, dispatcher-servlet.xml 등 눈앞을 가득 채우는 XML에 설정을 타이핑해야 했습니다.
<!-- 과거의 불편했던 XML 설정 지옥의 예시 -->
<beans>
<!-- DB 연결 정보 하나를 설정하려고 개발자가 모든 패키지를 다 알아서 쳐야함 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mydb" />
<property name="username" value="root" />
<property name="password" value="1234" />
</bean>
<!-- 패키지 스캔, 어노테이션 드라이븐 등 수십 줄의 세팅이 필수 -->
<context:component-scan base-package="com.example.app" />
<mvc:annotation-driven />
</beans>

이 모든 과정을 겪고 나면 정작 비즈니스 코드를 짜기도 전에 기운이 빠집니다.


⚡ 2. 게임 체인저: Spring Boot의 파괴적 차별점 3가지

Pivotal 팀(현 VMware)은 "그냥 아무런 보일러플레이트 코드 작성 없이, 곧장 메인 클래스 하나 딱 돌리면 0.5초 만에 상용화 가능한 수준의 서버가 빵 하고 켜져야 한다"는 철학(Opinionated Defaults)으로 스프링 부트를 릴리즈했습니다.

① 스타터(Starter)를 통한 완벽한 의존성 일괄 주입

웹 서버 구축에 필요한 버전들을 일일이 명시할 필요 없이, 단 한 줄의 세트 묶음을 호출합니다.

// build.gradle에 이 마법의 주문 1줄만 넣으면 약 30개의 안전한 라이브러리가 깔립니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}

② 내장형 톰캣 (Embedded Tomcat)

더 이상 PC에 무거운 외장 톰캣 서버를 다운받아 설치할 필요가 없습니다. 스프링 부트는 톰캣 엔진 자체를 자기 배 속에 라이브러리로 움켜쥐고 다닙니다.

@SpringBootApplication
public class MyBootApp {
// 런버튼(세모)를 누르면 알아서 톰캣 서버가 8080 포트로 띄워집니다!
public static void main(String[] args) {
SpringApplication.run(MyBootApp.class, args);
}
}

배포할 때도 실행 가능한 Fat JAR 파일 단 한 개로 구워져 나옵니다. 터미널에서 java -jar app.jar 명령만 치면 우주 어디서든 곧장 서버가 켜집니다.

③ 오토 컨피규레이션 (Auto-Configuration)

개발자 대신 스프링 부트가 프레임워크 환경 설정을 100% 자동 추론해 줍니다. 구멍 난 빈과 설정을 꽉 채워주어, 개발자는 위의 XML 지옥 대신 아주 상냥한 application.yml 파일 하나만 만지면 됩니다.

# application.yml : 과거 100줄짜리 XML을 4줄로 함축시켜 줌
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 1234
# 이 3줄만 쓰면 부트가 알아서 DB 커넥션 풀을 런타임에 싱글톤으로 만들어버립니다.

💡 3. 고수 팁 (Pro Tips)

💡 Spring Boot는 "스프링 프레임워크를 대체"하는 것이 아닙니다

많은 입문자가 "저는 스프링 프레임워크는 백지인데(모르는데) 당장 취업하려고 스프링 부트만 팝니다."라고 질문합니다. 이는 "저는 자동차(Spring) 운전은 못하지만 페라리(Spring Boot)는 몰 수 있습니다"와 같은 모순입니다.

Spring Boot는 Spring Framework의 껍데기(래퍼이자 익스텐션) 일 뿐입니다. 부트가 기를 쓰고 덮어 가려놓은 자동 설정과 의존성 주입의 근간 코어(IoC, AOP, Bean Lifecycle)는 100% 레거시 Spring Framework 엔진 똑같이 굴러갑니다. 실무 에러 빈 파괴, 서블릿 톰캣 필터 라이프사이클 지연 등의 근본 에러 트러블슈팅을 하려면 결국 이 껍데기를 뜯고 내부의 스프링 프레임워크의 코어 철학으로 거슬러 올라가야만 원인을 해결할 수 있습니다.