Spring Framework vs Spring Boot 핵심 차이점 완벽 비교
Spring 생태계에서 Spring Framework와 Spring Boot는 자주 혼동되는 개념입니다. Spring Boot는 Spring Framework를 대체하는 것이 아니라, Spring Framework를 더 쉽고 빠르게 사용할 수 있도록 만든 도구입니다.
이 글에서는 Spring Framework의 모듈 구조부터 Spring Boot가 해결한 문제점, 그리고 의존성 관리, 자동 설정, 내장 WAS 등 핵심 차이점을 상세히 비교합니다. Spring을 처음 배우는 개발자부터 실무 개발자까지 모두에게 유용한 내용입니다.

Spring Framework는 기능별로 구분된 약 20여 개의 모듈로 구성되어 있습니다. 개발자는 필요한 모듈만 선택해서 사용할 수 있으며, 이를 경량 컨테이너 설계라고 합니다.
Spring Framework의 모듈은 크게 6개 카테고리로 분류됩니다.
Spring의 근간을 이루는 모듈로, IoC와 DI 기능을 제공합니다.
① spring-core: Spring Framework의 기본 기능 제공
② spring-beans: Bean Factory와 Bean 관리 기능
③ spring-context: ApplicationContext 제공, 국제화 지원
④ spring-expression: SpEL(Spring Expression Language) 지원
① spring-aop: 관점 지향 프로그래밍 구현
② spring-aspects: AspectJ와의 통합 지원
데이터베이스 연동을 위한 모듈입니다.
① spring-jdbc: JDBC 추상화 레이어 제공
② spring-tx: 트랜잭션 관리 기능
③ spring-orm: JPA, Hibernate, MyBatis 연동
④ spring-jms: Java Message Service 지원
① spring-web: 웹 애플리케이션 기본 기능
② spring-webmvc: Spring MVC 구현체
③ spring-websocket: WebSocket 프로토콜 지원
④ spring-webflux: 리액티브 웹 프레임워크
① spring-test: JUnit, TestNG를 이용한 단위/통합 테스트 지원
Spring Framework의 핵심 철학은 필요한 모듈만 선택적으로 사용할 수 있다는 것입니다.
<dependencies>
<!-- Core Container -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.20</version>
</dependency>
<!-- Web MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<!-- JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.20</version>
</dependency>
</dependencies>
문제점: 모듈이 많아질수록 버전 호환성 관리와 설정이 복잡해집니다.
Spring Framework의 강력한 기능에도 불구하고, 복잡한 설정과 의존성 관리가 개발자들의 큰 부담이었습니다. 이를 해결하기 위해 등장한 것이 Spring Boot입니다.
Spring Boot 공식 사이트의 핵심 문구입니다.
"Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can just run."
해석: "Spring Boot를 이용하면 단독으로 실행 가능한 상용 수준의 Spring 기반 애플리케이션을 쉽게 만들 수 있습니다."
① 복잡한 설정 제거: XML 설정 파일 최소화
② 의존성 관리 자동화: 호환되는 라이브러리 자동 선택
③ 즉시 실행 가능: 내장 서버로 별도 배포 없이 실행
④ 프로덕션 준비: 모니터링, 헬스체크 기본 제공
<beans>
<context:component-scan base-package="com.example"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!-- 수십 줄의 설정 계속... -->
</beans>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version> <-- 버전 직접 지정
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version> <-- 호환 버전 직접 확인 필요
</dependency>
<!-- 버전 불일치 시 런타임 에러 발생 가능 -->
① Tomcat, JBoss 등 별도 설치 필요
② WAR 파일로 패키징하여 WAS에 배포
③ 로컬 개발 환경 구축이 복잡
Spring Boot의 가장 큰 장점 중 하나는 spring-boot-starter를 통한 자동화된 의존성 관리입니다.
spring-boot-starter는 관련된 여러 라이브러리를 하나의 의존성으로 묶어놓은 패키지입니다. 개발자는 starter만 추가하면 필요한 모든 라이브러리가 자동으로 포함됩니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 버전 명시 불필요 -->
</dependency>
<!-- 이 하나의 의존성이 자동으로 포함하는 것들:
- spring-web, spring-webmvc
- jackson-databind (JSON 처리)
- tomcat-embed-core (내장 Tomcat)
- hibernate-validator (검증)
- 기타 20개 이상의 라이브러리 -->
| Starter | 용도 | 포함 라이브러리 |
|---|---|---|
| spring-boot-starter-web | RESTful 웹 애플리케이션 | Spring MVC, 내장 Tomcat, JSON |
| spring-boot-starter-data-jpa | JPA를 이용한 DB 접근 | Hibernate, Spring Data JPA |
| spring-boot-starter-security | 보안 기능 | Spring Security, 인증/인가 |
| spring-boot-starter-test | 테스트 | JUnit5, Mockito, AssertJ |
| spring-boot-starter-jdbc | JDBC 연결 | HikariCP, Spring JDBC |
| spring-boot-starter-cache | 캐싱 | Spring Cache 추상화 |
spring-boot-starter-parent는 모든 starter의 검증된 버전 조합을 제공합니다.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
<!-- 이제 모든 starter에서 버전 생략 가능 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- version 태그 없음 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<!-- version 태그 없음 -->
</dependency>
</dependencies>
장점
① 버전 충돌 걱정 없음
② Spring Boot 버전만 업그레이드하면 모든 라이브러리 자동 업데이트
③ 검증된 조합으로 안정성 보장
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
<!-- ... 계속 ... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Boot의 또 다른 핵심 기능은 자동 설정(Auto Configuration)과 내장 WAS입니다.
Spring Boot는 애플리케이션에 추가된 라이브러리를 감지하여 자동으로 설정을 생성합니다.
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@SpringBootApplication은 3개의 어노테이션을 합친 것입니다.
@SpringBootConfiguration +
@EnableAutoConfiguration +
@ComponentScan
① @SpringBootConfiguration
- Spring의 @Configuration을 대체
- 현재 클래스가 설정 클래스임을 표시
② @ComponentScan
- @Component 계열 어노테이션을 스캔
- @Controller, @Service, @Repository, @Configuration 자동 감지
- 해당 클래스들을 Bean으로 등록
@RestController // ← ComponentScan이 감지
public class UserController { ... }
@Service // ← ComponentScan이 감지
public class UserService { ... }
@Repository // ← ComponentScan이 감지
public class UserRepository { ... }
③ @EnableAutoConfiguration
- spring.factories 파일에 정의된 자동 설정 클래스 로드
- 조건(@Conditional)에 맞는 설정만 적용
- 개발자가 직접 설정하지 않아도 자동으로 Bean 구성
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
...
// 각 설정 클래스는 @Conditional로 조건부 실행
@Configuration
@ConditionalOnClass(DataSource.class) // DataSource 클래스 존재 시
@ConditionalOnMissingBean(DataSource.class) // 사용자가 정의 안 했을 때
public class DataSourceAutoConfiguration {
// DataSource Bean 자동 생성
}
조건부 어노테이션 예시
- @ConditionalOnClass: 특정 클래스가 classpath에 존재할 때
- @ConditionalOnMissingBean: 해당 Bean이 없을 때
- @ConditionalOnProperty: 특정 속성이 설정되었을 때
Spring Boot의 혁신적인 기능 중 하나는 WAS를 애플리케이션 내부에 내장한 것입니다.
| 구분 | Spring Framework | Spring Boot |
|---|---|---|
| WAS 설치 | Tomcat 등 별도 설치 필요 | 내장 (설치 불필요) |
| 패키징 | WAR 파일 | JAR 파일 (실행 가능) |
| 배포 | WAS에 WAR 배포 | java -jar app.jar |
| 개발 환경 | WAS 설정 필요 | IDE에서 바로 실행 |
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- tomcat-embed-core 자동 포함 -->
</dependency>
// application.properties로 간단히 설정
server.port=8080
server.servlet.context-path=/api
server.tomcat.max-threads=200
Tomcat 대신 Jetty나 Undertow를 사용할 수도 있습니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
Spring Boot는 운영 환경을 위한 모니터링 도구를 기본 제공합니다.
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
# application.properties
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
| 엔드포인트 | 경로 | 제공 정보 |
|---|---|---|
| health | /actuator/health | 애플리케이션 상태 |
| metrics | /actuator/metrics | 메모리, CPU, 스레드 정보 |
| info | /actuator/info | 애플리케이션 정보 |
| loggers | /actuator/loggers | 로그 레벨 확인/변경 |
| httptrace | /actuator/httptrace | 최근 HTTP 요청 추적 |
{
"status": "UP",
"components": {
"db": {
"status": "UP",
"details": {
"database": "MySQL",
"validationQuery": "isValid()"
}
},
"diskSpace": {
"status": "UP",
"details": {
"total": 499963174912,
"free": 345678912345
}
}
}
}
A: 아닙니다. Spring Boot는 Spring Framework를 더 쉽게 사용하기 위한 도구입니다. Spring Framework의 핵심 개념(IoC, DI, AOP 등)을 이해해야 Spring Boot도 제대로 사용할 수 있습니다. Spring Boot는 설정을 자동화했을 뿐, 내부적으로는 Spring Framework를 사용합니다.
A: 현재는 대부분의 경우 Spring Boot를 사용하는 것이 권장됩니다.
Spring Boot 사용 권장
① 새로운 프로젝트 시작
② 빠른 프로토타입 개발
③ MSA(마이크로서비스) 아키텍처
④ RESTful API 서버 개발
Spring Framework 사용 고려
① 레거시 시스템 유지보수
② 매우 특수한 커스터마이징 필요
③ Spring Boot가 지원하지 않는 오래된 기술 사용
A: 네, 가능합니다. 특정 자동 설정을 제외할 수 있습니다.
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
HibernateJpaAutoConfiguration.class
})
public class MyApplication { ... }
# 방법 2: application.properties에서 제외
spring.autoconfigure.exclude=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
A: 네, 가능합니다. 외부 Tomcat에 배포해야 하는 경우 WAR로 변경할 수 있습니다.
<packaging>war</packaging>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope> <-- 외부 Tomcat 사용
</dependency>
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(MyApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
A: --debug 옵션이나 application.properties 설정으로 확인할 수 있습니다.
debug=true
# 또는 실행 시
java -jar app.jar --debug
실행하면 콘솔에 다음 정보가 출력됩니다.
- Positive matches: 적용된 자동 설정
- Negative matches: 적용되지 않은 자동 설정과 이유
- Exclusions: 제외된 자동 설정
A: 네, 커스텀 Starter를 만들 수 있습니다. 회사 내부에서 공통으로 사용하는 설정을 Starter로 만들어 배포할 수 있습니다.
@Configuration
@ConditionalOnClass(MyService.class)
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService() {
return new MyService();
}
}
// 2. META-INF/spring.factories에 등록
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration
A: 메이저 버전 업그레이드 시 주의가 필요합니다.
확인 사항
① 공식 릴리즈 노트 확인 (Breaking Changes)
② Java 버전 호환성 (Spring Boot 3.x는 Java 17 이상 필요)
③ 사용 중인 라이브러리 호환성 확인
④ 테스트 환경에서 충분한 검증
권장 절차
① 마이너 버전씩 순차적으로 업그레이드 (2.5 → 2.6 → 2.7)
② deprecated 코드 수정 후 다음 버전으로
③ 전체 테스트 통과 확인
Spring Framework와 Spring Boot의 차이를 정확히 이해하면 적재적소에 올바른 기술을 선택할 수 있습니다.
핵심 요약
① Spring Boot는 Spring Framework를 대체하는 것이 아니라 더 쉽게 사용하도록 돕는 도구
② spring-boot-starter로 의존성 관리를 자동화하여 버전 충돌 해결
③ @SpringBootApplication으로 자동 설정을 통해 복잡한 XML 설정 제거
④ 내장 WAS로 JAR 파일 하나만으로 실행 가능
⑤ Actuator로 프로덕션 환경 모니터링 기본 제공
선택 기준
① 신규 프로젝트: Spring Boot (권장)
② 레거시 유지보수: Spring Framework
③ MSA/RESTful API: Spring Boot
④ 특수한 커스터마이징: 상황에 따라 판단
현재는 Spring Boot가 사실상 표준이 되었지만, Spring Framework의 핵심 개념을 이해하는 것이 여전히 중요합니다. Spring Boot의 자동 설정 뒤에는 Spring Framework의 강력한 기능들이 숨어 있기 때문입니다.
끝.
'Development > Web' 카테고리의 다른 글
| [Web] JEUS DB Connection Leak 완벽 해결 방법 (0) | 2024.07.24 |
|---|---|
| [Web] Spring Dispatcher Servlet 정의와 동작 원리 (0) | 2022.09.24 |
| [Web] Spring Framework 3가지 핵심 특징 - IoC, DI, AOP 완벽 이해 (0) | 2022.09.24 |
| [Web] 크로스 도메인 문제 원인부터 해결책까지 총정리 (0) | 2022.09.23 |
| [Web] 뷰 컴포넌트 통신 (0) | 2022.09.19 |