전체 목록
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-webSpring MVC, Jackson, 내장 Tomcat
spring-boot-starter-data-jpaSpring Data JPA, Hibernate, HikariCP
spring-boot-starter-securitySpring Security
spring-boot-starter-testJUnit 5, Mockito, AssertJ
spring-boot-starter-actuator운영 모니터링 엔드포인트
spring-boot-starter-cacheSpring 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/metricsCPU, 메모리, HTTP 요청 수 등 지표
/actuator/env환경 변수 및 설정 값
/actuator/beans등록된 빈 목록
/actuator/conditionsAuto Configuration 조건 결과
/actuator/httptrace최근 HTTP 요청 이력

핵심 차이 요약

항목Spring FrameworkSpring Boot
설정 방식XML 또는 Java Config 직접 작성Auto Configuration
의존성 관리개별 의존성 버전 직접 관리Starter + BOM으로 자동 관리
서버 배포외부 WAS(Tomcat) 필요, WAR 배포내장 서버, JAR 단독 실행
설정 파일여러 설정 파일 분산application.yml 중앙 관리
운영 모니터링직접 구현 필요Actuator 기본 제공
개발 생산성초기 설정 비용 높음즉시 개발 가능