oguri's garage

Spring vs Spring Boot 핵심 차이점 본문

개발하다/Spring

Spring vs Spring Boot 핵심 차이점

oguri 2025. 10. 3. 20:55

1. 관계 이해하기

비유: 자동차 vs 자율주행차

  • Spring Framework = 고성능 스포츠카 🏎️
    • 모든 걸 직접 조작해야 함 (수동 기어, 클러치 등)
    • 강력하지만 숙련된 운전자가 필요
  • Spring Boot = 자율주행 전기차 🚗⚡
    • 대부분 자동으로 처리됨
    • 목적지만 입력하면 알아서 운전
Spring Boot ⊂ Spring Framework
(Spring Boot는 Spring Framework 위에 구축된 편의 기능)

 

 


2. 핵심 차이점

2.1 구성(Configuration) 방식

Spring Framework - 수동 설정
<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans">
    <!-- 데이터베이스 설정 -->
    <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/mydb"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
    </bean>

    <!-- JPA 설정 -->
    <bean id="entityManagerFactory" 
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="com.example.entity"/>
    </bean>

    <!-- 트랜잭션 매니저 설정 -->
    <bean id="transactionManager" 
          class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <!-- 컴포넌트 스캔 설정 -->
    <context:component-scan base-package="com.example"/>

    <!-- 웹 MVC 설정 -->
    <mvc:annotation-driven/>
</beans>
 
Spring Boot - 자동 설정
# application.properties (이게 전부!)
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
@SpringBootApplication  // 이 하나로 모든 설정 완료!
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

 

2.2 서버 실행 방식

Spring Framework
// 1. 톰캣을 별도로 설치해야 함
// 2. WAR 파일로 패키징
// 3. 톰캣에 배포
// 4. 복잡한 서버 설정 필요

public class WebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) {
        // 복잡한 초기화 코드...
    }
}
 
Spring Boot
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);  // 끝!
        // 내장 톰캣이 자동으로 시작됨
    }
}

 

2.3 의존성 관리

Spring Framework
<!-- pom.xml - 각각의 버전을 다 맞춰야 함 -->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.21</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.21</version>  <!-- 버전 호환성 체크 필요 -->
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.3.21</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.21</version>
    </dependency>
    <!-- 데이터베이스 관련 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>5.3.21</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.6.9.Final</version>  <!-- 호환성 체크 필요 -->
    </dependency>
    <!-- ... 수십 개의 의존성 ... -->
</dependencies>
 
Spring Boot
<!-- pom.xml - 스타터 의존성으로 간단하게 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- 버전 명시 불필요! 자동 관리됨 -->
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>

 

 


3. 기능별 구분 기준

3.1 Spring Framework 고유 기능

핵심 엔진 기능들 - "자동차의 엔진, 바퀴, 브레이크"

// 1. 의존성 주입 (DI/IoC)
@Component
@Service 
@Repository
@Autowired

// 2. 관점 지향 프로그래밍 (AOP)
@Aspect
@Before
@After
@Around

// 3. 트랜잭션 관리
@Transactional

// 4. MVC 패턴
@Controller
@RequestMapping
@ResponseBody

// 5. 데이터 액세스
@Repository
JdbcTemplate

 

3.2 Spring Boot 추가 기능

 

편의 기능들 - "자율주행, 자동 주차, 스마트 키"

// 1. 자동 구성 (Auto Configuration)
@SpringBootApplication
@EnableAutoConfiguration

// 2. 스타터 의존성
spring-boot-starter-web
spring-boot-starter-data-jpa
spring-boot-starter-security

// 3. 내장 서버
// 별도 설정 없이 Tomcat, Jetty 실행

// 4. 외부 설정 관리
@ConfigurationProperties
application.yml, application.properties

// 5. 액추에이터 (모니터링)
@Endpoint
/actuator/health
/actuator/metrics

// 6. 개발자 도구
spring-boot-devtools (핫 리로드)

// 7. 테스트 지원
@SpringBootTest
@WebMvcTest
@DataJpaTest

 

 


4. 실제 프로젝트 비교

4.1 간단한 REST API 만들기

Spring Framework (약 200줄)
// 1. WebConfig.java
@Configuration
@EnableWebMvc
@ComponentScan("com.example")
public class WebConfig implements WebMvcConfigurer {
    // ViewResolver, MessageConverter 등 설정
}

// 2. RootConfig.java  
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("com.example.repository")
public class RootConfig {
    @Bean
    public DataSource dataSource() {
        // 데이터베이스 연결 설정
    }

    @Bean 
    public EntityManagerFactory entityManagerFactory() {
        // JPA 설정
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        // 트랜잭션 매니저 설정
    }
}

// 3. WebAppInitializer.java
public class WebAppInitializer implements WebApplicationInitializer {
    // 서블릿 초기화 코드
}

// 4. 컨트롤러는 동일
@Controller
public class UserController { ... }
 
Spring Boot (약 10줄)
// 1. Application.java (이게 전부!)
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

// 2. 컨트롤러는 동일
@RestController
public class UserController { ... }

// 3. application.yml
spring:
  datasource:
    url: jdbc:h2:mem:testdb
  jpa:
    hibernate:
      ddl-auto: update

 

 


5. 언제 무엇을 사용해야 할까?

5.1 Spring Boot를 사용해야 하는 경우 (90%)

✅ 새로운 프로젝트 시작
✅ 빠른 프로토타이핑
✅ 마이크로서비스 아키텍처  
✅ REST API 개발
✅ 표준적인 웹 애플리케이션
✅ 스타트업이나 작은 팀

 

5.2 Spring Framework를 직접 사용하는 경우 (10%)

✅ 매우 세밀한 설정이 필요한 경우
✅ 레거시 시스템과 통합
✅ 특별한 아키텍처 요구사항
✅ Spring Boot의 자동 설정이 방해되는 경우
✅ 메모리나 성능이 극도로 중요한 시스템

 

 


6. 핵심 정리

구분 Spring Framework Spring Boot
역할 핵심 엔진 편의 기능 추가
설정 수동 (XML/Java Config) 자동 (Convention over Configuration)
시작 시간 복잡한 설정 필요 즉시 실행 가능
서버 외부 서버 필요 내장 서버 포함
의존성 수동 버전 관리 자동 버전 관리
학습 곡선 가파름 완만함
유연성 매우 높음 높음 (일부 제약)

 

결론:

  • Spring Boot는 Spring Framework를 더 쉽게, 더 빠르게 사용할 수 있게 해주는 상위 레이어이다.
  • 마치 수동차에 자동 기능을 추가한 것처럼, 핵심 기능은 그대로 두고 편의성을 대폭 향상시킨 것