SpringEasy#72
Spring Boot가 Spring Framework와 다른 점은 무엇인가요?
#Spring#SpringBoot#자동설정#핵심개념
힌트
자동 설정, 내장 서버, starter 의존성을 생각해보세요.
정답 및 해설
Spring Boot가 Spring Framework와 다른 점은 무엇인가요?
Spring Framework는 엔터프라이즈 Java 애플리케이션을 위한 강력한 기반을 제공하지만, 설정이 복잡하고 초기 구축에 많은 노력이 필요합니다. Spring Boot는 이런 불편함을 해소하기 위해 등장한 Spring Framework의 확장으로, "설정보다 관례(Convention over Configuration)"를 핵심 철학으로 합니다.
Spring Framework만 사용할 때의 설정 부담
Spring Framework만으로 웹 애플리케이션을 만들려면 다음과 같은 설정이 필요합니다.
<!-- web.xml -->
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
// Java Config 방식
@Configuration
@EnableWebMvc
@ComponentScan("com.example")
public class WebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
ds.setUsername("root");
ds.setPassword("password");
return ds;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
// JPA 설정...
}
@Bean
public PlatformTransactionManager transactionManager() {
// 트랜잭션 매니저 설정...
}
}
그리고 외부 WAS(Tomcat 등)에 war 파일을 배포해야 했습니다.
Spring Boot가 추가하는 것
1. Auto Configuration (자동 설정)
클래스패스에 있는 의존성과 설정 파일을 분석해 필요한 빈을 자동으로 등록합니다.
// spring-boot-autoconfigure 내부 동작 예시
@Configuration
@ConditionalOnClass(DataSource.class) // DataSource 클래스가 클래스패스에 있을 때만
@ConditionalOnMissingBean(DataSource.class) // 직접 정의한 DataSource 빈이 없을 때만
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
@Bean
public DataSource dataSource(DataSourceProperties properties) {
// application.yml의 spring.datasource.* 설정으로 자동 생성
return DataSourceBuilder.create()
.url(properties.getUrl())
.username(properties.getUsername())
.password(properties.getPassword())
.build();
}
}
# application.yml — 이 설정만으로 DataSource 자동 생성
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: password
자동 설정 여부를 확인하려면 --debug 플래그로 실행하거나 Actuator의 /actuator/conditions 엔드포인트를 활용할 수 있습니다.
2. Starter 의존성
목적에 맞는 의존성을 하나의 스타터로 묶어 제공합니다. 버전 충돌 걱정 없이 원하는 기능을 즉시 추가할 수 있습니다.
<!-- Spring Boot 이전: 개별 의존성을 직접 관리 -->
<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>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.63</version>
</dependency>
<!-- ... 수십 개의 의존성 -->
<!-- Spring Boot: starter 하나로 해결 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 버전은 spring-boot-starter-parent가 관리 -->
</dependency>
| 스타터 | 포함하는 기능 |
|---|---|
spring-boot-starter-web | Spring MVC, Jackson, 내장 Tomcat |
spring-boot-starter-data-jpa | Spring Data JPA, Hibernate, HikariCP |
spring-boot-starter-security | Spring Security |
spring-boot-starter-test | JUnit 5, Mockito, AssertJ |
spring-boot-starter-actuator | 운영 모니터링 엔드포인트 |
spring-boot-starter-cache | Spring Cache 추상화 |
3. 내장 서버 (Embedded Server)
별도의 WAS 설치 없이 애플리케이션 자체에 서버가 내장되어 있어 JAR 파일 하나로 실행할 수 있습니다.
# 빌드 및 실행
./mvnw package
java -jar target/my-app-0.0.1-SNAPSHOT.jar
# 또는 개발 시
./mvnw spring-boot:run
// Spring Boot 애플리케이션 진입점
@SpringBootApplication // @Configuration + @EnableAutoConfiguration + @ComponentScan
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
// 내장 Tomcat 시작 → 포트 8080에서 대기
}
}
기본 내장 서버를 변경하려면:
<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-undertow</artifactId>
</dependency>
4. application.yml / application.properties
모든 설정을 하나의 파일에서 관리할 수 있습니다.
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: ${DB_PASSWORD} # 환경변수 참조
jpa:
hibernate:
ddl-auto: validate
show-sql: false
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
data:
redis:
host: localhost
port: 6379
server:
port: 8080
servlet:
context-path: /api
logging:
level:
com.example: DEBUG
org.springframework.web: INFO
프로파일별 설정 분리:
# application.yml (공통)
spring:
profiles:
active: local
---
spring:
config:
activate:
on-profile: local
datasource:
url: jdbc:h2:mem:testdb
---
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mysql://prod-db:3306/mydb
5. Spring Boot Actuator
운영 환경에서 애플리케이션 상태를 모니터링하는 엔드포인트를 제공합니다.
# Actuator 설정
management:
endpoints:
web:
exposure:
include: health, info, metrics, env, beans
endpoint:
health:
show-details: always
| 엔드포인트 | 설명 |
|---|---|
/actuator/health | 애플리케이션 상태 (DB 연결, 디스크 등) |
/actuator/metrics | CPU, 메모리, HTTP 요청 수 등 지표 |
/actuator/env | 환경 변수 및 설정 값 |
/actuator/beans | 등록된 빈 목록 |
/actuator/conditions | Auto Configuration 조건 결과 |
/actuator/httptrace | 최근 HTTP 요청 이력 |
핵심 차이 요약
| 항목 | Spring Framework | Spring Boot |
|---|---|---|
| 설정 방식 | XML 또는 Java Config 직접 작성 | Auto Configuration |
| 의존성 관리 | 개별 의존성 버전 직접 관리 | Starter + BOM으로 자동 관리 |
| 서버 배포 | 외부 WAS(Tomcat) 필요, WAR 배포 | 내장 서버, JAR 단독 실행 |
| 설정 파일 | 여러 설정 파일 분산 | application.yml 중앙 관리 |
| 운영 모니터링 | 직접 구현 필요 | Actuator 기본 제공 |
| 개발 생산성 | 초기 설정 비용 높음 | 즉시 개발 가능 |