Spring Framework와 Spring Boot 차이 – 무엇을 선택해야 할까


Spring Framework와 Spring Boot 차이, 한 번쯤은 헷갈려 보신 적 있지 않으신가요? “Spring 배운다”고 했는데 팀에서는 Spring Boot를 쓰고, 강의에서는 둘 다 나오고, 도대체 무엇이 다른 건지 감이 잡히지 않는 분들이 많습니다. Spring Boot는 Spring Framework를 대체하는 기술이 아닙니다. 오히려 Spring Framework 위에서 동작하며 개발자의 불편함을 해결하기 위해 탄생했습니다. 이 글에서는 두 기술의 탄생 배경부터 실무 선택 기준까지, 코드와 함께 명확하게 비교해 드립니다.


목차

  1. Spring Framework란 무엇인가 – 기초 개념 정리
  2. Spring Boot의 탄생 배경과 핵심 원리
  3. Spring Framework와 Spring Boot 차이 – 항목별 비교
  4. 설정 복잡도와 초기 구성 – 주의해야 할 점
  5. 실전 단계별 활용법 – 언제 무엇을 선택해야 하는가
  6. 전문가 관점과 추천 도구

1. Spring Framework란 무엇인가 – 기초 개념 정리

Spring Framework는 2003년 Rod Johnson이 발표한 Java 기반 오픈소스 애플리케이션 프레임워크입니다. 당시 Java 엔터프라이즈 개발은 EJB(Enterprise JavaBeans)를 중심으로 이루어졌는데, EJB는 설정이 너무 복잡하고 테스트가 어렵다는 치명적인 단점이 있었습니다. Spring Framework는 이 문제를 해결하기 위해 IoC(제어의 역전) 와 DI(의존성 주입) 를 핵심 개념으로 내세우며 등장했습니다.

Spring Framework의 핵심 개념

IoC(Inversion of Control, 제어의 역전) 란 객체의 생성과 의존 관계 관리를 개발자가 직접 하지 않고 Spring 컨테이너(ApplicationContext)가 대신 해주는 개념입니다. 마치 공장에서 부품을 직접 만들지 않고, 공급업체에서 완성된 부품을 받아 조립하는 것과 비슷합니다.

DI(Dependency Injection, 의존성 주입) 는 IoC를 구현하는 구체적인 방법으로, 객체가 필요로 하는 의존 객체를 외부에서 주입해 주는 방식입니다. 생성자 주입, 세터 주입, 필드 주입 세 가지 방식이 있으며, 현재는 생성자 주입이 권장됩니다.

Spring Framework의 주요 모듈 구성

Spring Framework는 단일 라이브러리가 아니라 여러 모듈의 집합입니다. 주요 모듈은 다음과 같습니다.

모듈역할
spring-coreIoC 컨테이너, DI 핵심 기능
spring-webmvcMVC 웹 프레임워크(DispatcherServlet)
spring-data데이터 접근 추상화(JPA, JDBC)
spring-security인증·인가 보안 프레임워크
spring-aop관점 지향 프로그래밍(AOP)
spring-tx트랜잭션 관리

개발자는 필요한 모듈만 골라서 의존성에 추가할 수 있습니다. 이 유연성이 Spring Framework의 큰 강점이지만, 반대로 직접 골라야 한다는 점이 초보자에게 부담이 되기도 합니다.

Spring Framework 설정 방식의 변화

초창기 Spring Framework는 모든 빈(Bean) 설정을 XML 파일로 작성했습니다. 수십 개의 빈을 XML로 일일이 등록하는 작업은 상당히 번거로웠습니다. 이후 @Component@Service@Repository@Controller 같은 어노테이션 기반 설정이 도입되었고, @Configuration과 @Bean을 이용한 자바 기반 설정이 등장하면서 점차 XML 없이도 Spring 애플리케이션을 구성할 수 있게 되었습니다. 그러나 여전히 DispatcherServlet 등록, ViewResolver 설정, DataSource 설정 등 반복적인 초기 설정 코드가 많이 남아 있었습니다.


2. Spring Boot의 탄생 배경과 핵심 원리

Spring Boot는 2014년 Pivotal(현 VMware)에서 발표한 프레임워크로, Spring Framework의 복잡한 설정 문제를 해결하기 위해 탄생했습니다. Spring Boot의 핵심 철학은 “Convention over Configuration(설정보다 관습)” 입니다. 즉, 일반적으로 많이 쓰이는 설정을 미리 준비해두고, 개발자가 별도로 바꾸지 않으면 그 기본값을 그대로 쓰는 방식입니다.

Spring Boot의 세 가지 핵심 원리

① 자동 설정(Auto Configuration)

@EnableAutoConfiguration 어노테이션(실제로는 @SpringBootApplication 안에 포함)이 활성화되면, Spring Boot는 클래스패스(classpath)에 존재하는 라이브러리를 스캔합니다. 예를 들어 spring-webmvc가 클래스패스에 있으면 자동으로 DispatcherServlet을 설정하고, H2 인메모리 DB가 있으면 자동으로 DataSource를 구성합니다. 개발자가 직접 설정하지 않아도 애플리케이션이 곧바로 동작하는 이유가 바로 이 자동 설정 덕분입니다.

자동 설정은 spring.factories 파일(Spring Boot 3.x부터는 AutoConfiguration.imports)에 등록된 수백 개의 AutoConfiguration 클래스들이 조건부(@ConditionalOnClass@ConditionalOnMissingBean)로 동작하는 방식으로 구현되어 있습니다.

② 내장 서버(Embedded Server)

기존 Spring Framework에서는 WAR 파일을 빌드한 뒤 외부 WAS(Tomcat, JBoss 등)에 배포하는 방식이 일반적이었습니다. Spring Boot는 Tomcat, Jetty, Undertow 중 하나를 내장(Embedded)하여 JAR 파일 하나로 애플리케이션을 실행할 수 있게 했습니다. java -jar app.jar 명령 하나면 서버가 시작됩니다. 이 방식은 도커(Docker) 컨테이너 기반의 클라우드 배포 환경과 매우 잘 맞아 마이크로서비스 아키텍처(MSA) 시대에 폭발적으로 채택되었습니다.

③ Spring Boot Starter

Starter는 특정 기능을 위해 필요한 의존성들을 하나의 묶음으로 제공하는 편의 의존성입니다. 예를 들어 spring-boot-starter-web 하나만 추가하면, spring-webmvc, jackson, tomcat-embed 등 웹 개발에 필요한 모든 라이브러리가 호환되는 버전으로 함께 추가됩니다. 의존성 충돌로 인한 버전 지옥(dependency hell)을 크게 줄여줍니다.


3. Spring Framework와 Spring Boot 차이 – 항목별 비교

Spring Framework와 Spring Boot 차이를 항목별로 정리하면 다음 표와 같습니다.

비교 항목Spring FrameworkSpring Boot
설정 방식XML, Java Config 직접 작성자동 설정(Auto Configuration)
서버외부 WAS(Tomcat 등) 별도 설치·배포내장 서버(Tomcat/Jetty/Undertow)
의존성 관리개발자가 버전 직접 지정Starter + BOM으로 자동 관리
배포 방식WAR 파일 → WAS 배포JAR 파일 → java -jar 실행
초기 설정 공수높음 (많은 보일러플레이트 코드)낮음 (최소한의 설정으로 시작)
학습 난이도높음 (각 컴포넌트 개별 이해 필요)상대적으로 낮음
유연성매우 높음 (모든 것을 직접 제어)높음 (자동 설정 오버라이드 가능)
운영 모니터링별도 구성 필요Spring Boot Actuator 기본 제공
Spring 포함 여부Spring 자체Spring Framework를 내부에 포함

설정 코드로 보는 차이

같은 기능(Spring MVC 웹 애플리케이션 구성)을 두 방식으로 구현하면 코드량 차이가 극명하게 드러납니다.

Spring Framework – 직접 설정 (Java Config 기준)

java

// WebConfig.java
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "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;
    }
}

// WebAppInitializer.java
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() { return new Class[]{RootConfig.class}; }

    @Override
    protected Class<?>[] getServletConfigClasses() { return new Class[]{WebConfig.class}; }

    @Override
    protected String[] getServletMappings() { return new String[]{"/"}; }
}

Spring Boot – 자동 설정

java

// Application.java
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

yaml

# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html

Spring Boot는 @SpringBootApplication 하나와 application.yml 설정 파일만으로 위의 모든 구성이 자동으로 완료됩니다. 코드량 차이가 한눈에 보이죠.


4. 설정 복잡도와 초기 구성 – 주의해야 할 점

Spring Boot가 편리하다고 해서 단점이 없는 건 아닙니다. 각 방식의 주의점을 명확하게 짚어드립니다.

Spring Framework 사용 시 주의점

보일러플레이트 코드 과다 DispatcherServlet 등록, ViewResolver 설정, DataSource 빈 등록, 트랜잭션 매니저 설정 등 프로젝트 시작 전에 작성해야 할 반복 코드가 많습니다. 설정이 잘못되면 컨텍스트 로딩 자체가 실패하여 디버깅이 어렵습니다.

버전 호환성 관리의 어려움 Spring Framework, Hibernate, Jackson, Tomcat 등 여러 라이브러리의 호환 버전을 개발자가 직접 파악하고 맞춰야 합니다. 버전이 맞지 않으면 런타임 오류가 발생하는데, 원인을 찾기 까다롭습니다.

WAR 배포의 운영 복잡도 외부 WAS를 별도로 관리해야 하므로 서버 설정, WAS 버전 관리, 배포 스크립트 작성 등 운영 부담이 늘어납니다. 특히 여러 애플리케이션을 하나의 WAS에 올릴 경우 라이브러리 충돌 문제가 발생할 수 있습니다.

Spring Boot 사용 시 주의점

자동 설정의 블랙박스화 Auto Configuration이 무엇을 어떻게 설정했는지 처음에는 파악하기 어렵습니다. 예상치 못한 빈이 등록되거나, 의도치 않은 설정이 적용되어도 원인을 찾는 데 시간이 걸릴 수 있습니다. --debug 옵션이나 spring.autoconfigure.exclude를 활용하면 자동 설정 내역을 확인하고 제어할 수 있습니다.

기본 의존성 용량 spring-boot-starter-web 하나만 추가해도 수십 개의 라이브러리가 함께 추가됩니다. 임베디드 환경이나 경량 서비스를 만들 때 불필요한 의존성이 포함될 수 있으므로, spring-boot-starter 대신 필요한 모듈만 선별해서 추가하는 방식을 검토해야 할 때도 있습니다.

Spring Framework 이해 없이 사용하는 문제 Spring Boot가 편리하다는 이유로 Spring Framework의 핵심 원리(IoC, DI, AOP, 트랜잭션 등)를 제대로 이해하지 않고 개발하면, 장애 발생 시 원인 파악과 해결이 매우 어렵습니다. Spring Boot를 잘 쓰려면 결국 Spring Framework를 이해하는 것이 선행되어야 합니다.

버전 마이그레이션의 변화량 Spring Boot 2.x에서 3.x로 업그레이드할 때는 Java 17 이상, Jakarta EE 9+ 네임스페이스 변경(javax.* → jakarta.*) 등 큰 변화가 있었습니다. 자동 설정에 의존하다 보면 마이그레이션 시 예상치 못한 곳에서 오류가 발생할 수 있어 사전 검토가 필요합니다.


5. 실전 단계별 활용법 – 언제 무엇을 선택해야 하는가

Spring Framework와 Spring Boot 차이를 이해했다면, 이제 실제 프로젝트에서 어떤 기준으로 선택해야 하는지 정리해 보겠습니다.

Spring Boot를 선택해야 하는 경우

현재 대부분의 신규 프로젝트에서는 Spring Boot가 사실상 표준이 되었습니다. 다음 상황이라면 Spring Boot를 선택하세요.

① 빠른 개발·배포가 필요한 경우 스타트업이나 MVP(최소 기능 제품) 개발처럼 빠른 속도가 중요한 환경에서는 Spring Boot의 자동 설정과 내장 서버가 큰 강점입니다. spring.io/start에서 프로젝트를 생성하고 수 분 안에 첫 API를 만들 수 있습니다.

② 마이크로서비스 아키텍처(MSA) 각 서비스를 독립적인 JAR로 빌드하고 도커 컨테이너로 배포하는 MSA 환경에서는 Spring Boot의 내장 서버 방식이 자연스럽게 맞아떨어집니다. Spring Cloud와 함께 사용하면 서비스 디스커버리, API 게이트웨이, 분산 설정 관리까지 손쉽게 구현할 수 있습니다.

③ REST API 서버 개발 spring-boot-starter-web에 @RestController를 조합하면 JSON API 서버를 최소한의 설정으로 구축할 수 있습니다. Swagger/OpenAPI 연동도 springdoc-openapi 라이브러리 하나로 간단히 적용됩니다.

Spring Framework(순수)를 고려해야 하는 경우

오늘날 순수 Spring Framework를 선택하는 경우는 많지 않지만, 다음 상황에서는 고려할 수 있습니다.

① 레거시 시스템 유지보수 이미 Spring Framework 기반으로 구축된 레거시 시스템을 유지보수하거나 점진적으로 개선하는 경우, 기존 설정 방식을 이해하고 따라야 합니다.

② 세밀한 설정 제어가 필요한 경우 극히 특수한 엔터프라이즈 환경에서 자동 설정이 제공하지 않는 방식으로 컨텍스트를 구성해야 한다면 순수 Spring Framework를 직접 설정하는 것이 오히려 명확할 수 있습니다.

프로젝트 시작하기 – Spring Boot 실전 설정

bash

# Spring Initializr CLI 방식
curl https://start.spring.io/starter.zip \
  -d type=maven-project \
  -d language=java \
  -d bootVersion=3.3.0 \
  -d groupId=com.example \
  -d artifactId=demo \
  -d dependencies=web,data-jpa,thymeleaf,h2 \
  -o demo.zip

또는 https://start.spring.io에서 다음 항목을 선택합니다.

  • Project: Maven / Gradle
  • Spring Boot 버전: 3.3.x (LTS 권장)
  • Dependencies: Spring Web, Spring Data JPA, Thymeleaf, H2 Database

java

// 메인 클래스 – 이것 하나면 애플리케이션이 시작됩니다
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

java

// 컨트롤러 – Spring Framework 문법 그대로 사용 가능
@RestController
@RequestMapping("/api/hello")
public class HelloController {

    @GetMapping
    public Map<String, String> hello() {
        return Map.of("message", "Spring Boot로 만든 첫 API입니다!");
    }
}

이처럼 Spring Boot에서도 컨트롤러, 서비스, 리포지토리 등의 코드는 Spring Framework 문법을 그대로 사용합니다. Spring Boot는 설정을 편하게 해주는 도구일 뿐, 비즈니스 로직 코드는 Spring Framework와 동일합니다.

application.yml로 자동 설정 오버라이드하기

yaml

server:
  port: 9090                    # 기본 8080 → 9090으로 변경

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/mydb
    username: ${DB_USERNAME}    # 환경변수로 관리 (보안 권장)
    password: ${DB_PASSWORD}
  jpa:
    hibernate:
      ddl-auto: validate        # 운영환경은 validate 권장
    show-sql: false
  thymeleaf:
    cache: true                 # 운영환경은 캐시 활성화

logging:
  level:
    com.example: INFO

자동 설정이 제공하는 기본값을 application.yml(또는 application.properties)에서 간단히 오버라이드할 수 있습니다. 수정하지 않은 항목은 Spring Boot의 기본값이 그대로 적용됩니다.


6. 전문가 관점과 추천 도구

Spring 공식 팀의 입장

Spring 공식 팀은 신규 프로젝트에는 Spring Boot를 강력하게 권장합니다. 공식 문서(spring.io)의 Getting Started 가이드 역시 모두 Spring Boot를 기준으로 작성되어 있습니다. 단, 공식 팀도 “Spring Boot를 잘 이해하려면 Spring Framework의 기반 개념을 먼저 이해해야 한다”는 점을 명시하고 있습니다.

실무 개발자들이 말하는 선택 기준

커뮤니티와 실무 개발자들이 공통적으로 언급하는 선택 기준은 다음과 같습니다.

  • 신규 프로젝트: 특별한 이유가 없다면 무조건 Spring Boot
  • 레거시 마이그레이션: 점진적으로 Spring Boot로 전환 (기존 WAR 구조 유지하며 부분 적용 가능)
  • 학습 목적: Spring Framework 핵심 개념 먼저 → Spring Boot 자동 설정 원리 이해 순서 추천

추천 도구 및 학습 리소스

도구 / 리소스용도
Spring Initializr (start.spring.io)프로젝트 빠른 생성
Spring Boot Actuator애플리케이션 모니터링 (/actuator/health 등)
Spring Boot DevTools코드 변경 시 자동 재시작 (개발 생산성 향상)
IntelliJ IDEA UltimateSpring MVC, Boot 공식 지원, 설정 자동완성
spring.io 공식 가이드기능별 15분 완성 가이드 다수 제공
인프런 김영한 강의 시리즈한국어 Spring Core → MVC → Boot 체계적 학습

Spring Boot Actuator – 운영 모니터링

Spring Boot의 숨겨진 강점 중 하나는 Actuator입니다. spring-boot-starter-actuator 의존성 하나를 추가하면 애플리케이션 상태, 메모리 사용량, HTTP 요청 통계, 빈 목록 등 운영에 필요한 다양한 정보를 REST API로 노출할 수 있습니다.

yaml

management:
  endpoints:
    web:
      exposure:
        include: health, info, metrics, beans
  endpoint:
    health:
      show-details: always

/actuator/health로 상태 확인, /actuator/metrics로 메트릭 수집, Prometheus + Grafana와 연동하면 실시간 대시보드까지 구성할 수 있습니다. 순수 Spring Framework에서는 이 모든 것을 직접 구현해야 합니다.


결론

Spring Framework는 Java 웹 개발의 근간이 되는 프레임워크이고, Spring Boot는 그 위에서 복잡한 설정을 자동화하여 생산성을 극대화한 도구입니다. Spring Framework와 Spring Boot 차이의 핵심은 “무엇을 만드느냐”가 아니라 “어떻게 설정하고 배포하느냐”에 있습니다. 신규 프로젝트라면 Spring Boot를 선택하되, Spring Framework의 IoC·DI·AOP 개념을 반드시 함께 이해하는 것이 실력 있는 개발자로 성장하는 가장 빠른 길입니다. 지금 바로 Spring Initializr에서 프로젝트를 생성하고 첫 API를 만들어 보세요.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다