본문 바로가기
Development/Web

[Web] Spring Framework vs Spring Boot 핵심 차이점 완벽 비교

by 은스타 2022. 9. 24.
반응형
Spring Framework vs Spring Boot 핵심 차이점 완벽 비교

Spring Framework vs Spring Boot 핵심 차이점 완벽 비교

Spring 생태계에서 Spring Framework와 Spring Boot는 자주 혼동되는 개념입니다. Spring Boot는 Spring Framework를 대체하는 것이 아니라, Spring Framework를 더 쉽고 빠르게 사용할 수 있도록 만든 도구입니다.

이 글에서는 Spring Framework의 모듈 구조부터 Spring Boot가 해결한 문제점, 그리고 의존성 관리, 자동 설정, 내장 WAS 등 핵심 차이점을 상세히 비교합니다. Spring을 처음 배우는 개발자부터 실무 개발자까지 모두에게 유용한 내용입니다.

목차
1. Spring Framework 모듈 구조
2. Spring Boot 등장 배경과 철학
3. 의존성 관리 차이점
4. 자동 설정과 내장 WAS
5. 자주 묻는 질문(FAQ)

#1. Spring Framework 모듈 구조

Spring Framework는 기능별로 구분된 약 20여 개의 모듈로 구성되어 있습니다. 개발자는 필요한 모듈만 선택해서 사용할 수 있으며, 이를 경량 컨테이너 설계라고 합니다.

1) 핵심 모듈 분류

Spring Framework의 모듈은 크게 6개 카테고리로 분류됩니다.

(1) Core Container (핵심 컨테이너)

Spring의 근간을 이루는 모듈로, IoC와 DI 기능을 제공합니다.

spring-core: Spring Framework의 기본 기능 제공

spring-beans: Bean Factory와 Bean 관리 기능

spring-context: ApplicationContext 제공, 국제화 지원

spring-expression: SpEL(Spring Expression Language) 지원

(2) AOP (Aspect Oriented Programming)

spring-aop: 관점 지향 프로그래밍 구현

spring-aspects: AspectJ와의 통합 지원

(3) Data Access/Integration

데이터베이스 연동을 위한 모듈입니다.

spring-jdbc: JDBC 추상화 레이어 제공

spring-tx: 트랜잭션 관리 기능

spring-orm: JPA, Hibernate, MyBatis 연동

spring-jms: Java Message Service 지원

(4) Web (MVC/Remoting)

spring-web: 웹 애플리케이션 기본 기능

spring-webmvc: Spring MVC 구현체

spring-websocket: WebSocket 프로토콜 지원

spring-webflux: 리액티브 웹 프레임워크

(5) Test

spring-test: JUnit, TestNG를 이용한 단위/통합 테스트 지원

. . . . .
2) 모듈 선택의 유연성

Spring Framework의 핵심 철학은 필요한 모듈만 선택적으로 사용할 수 있다는 것입니다.

<!-- Maven 예시: 필요한 모듈만 추가 -->
<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>

문제점: 모듈이 많아질수록 버전 호환성 관리와 설정이 복잡해집니다.


#2. Spring Boot 등장 배경과 철학

Spring Framework의 강력한 기능에도 불구하고, 복잡한 설정과 의존성 관리가 개발자들의 큰 부담이었습니다. 이를 해결하기 위해 등장한 것이 Spring Boot입니다.

1) 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 기반 애플리케이션을 쉽게 만들 수 있습니다."

(1) 핵심 목표

복잡한 설정 제거: XML 설정 파일 최소화

의존성 관리 자동화: 호환되는 라이브러리 자동 선택

즉시 실행 가능: 내장 서버로 별도 배포 없이 실행

프로덕션 준비: 모니터링, 헬스체크 기본 제공

. . . . .
2) Spring Framework의 문제점
(1) 복잡한 XML 설정
<!-- Spring Framework의 전통적인 설정 방식 -->
<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>
(2) 수동 의존성 관리
<!-- 각 라이브러리의 호환 버전을 수동으로 찾아야 함 -->
<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>
<!-- 버전 불일치 시 런타임 에러 발생 가능 -->
(3) 외부 WAS 필요

Tomcat, JBoss 등 별도 설치 필요

② WAR 파일로 패키징하여 WAS에 배포

③ 로컬 개발 환경 구축이 복잡


#3. 의존성 관리 차이점

Spring Boot의 가장 큰 장점 중 하나는 spring-boot-starter를 통한 자동화된 의존성 관리입니다.

1) Spring Boot Starter의 개념

spring-boot-starter관련된 여러 라이브러리를 하나의 의존성으로 묶어놓은 패키지입니다. 개발자는 starter만 추가하면 필요한 모든 라이브러리가 자동으로 포함됩니다.

<!-- Spring Boot: 하나의 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개 이상의 라이브러리 -->
. . . . .
2) 주요 Spring Boot Starter
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 추상화
. . . . .
3) 버전 관리의 마법: spring-boot-starter-parent

spring-boot-starter-parent는 모든 starter의 검증된 버전 조합을 제공합니다.

<!-- pom.xml에서 parent 설정 -->
<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 버전만 업그레이드하면 모든 라이브러리 자동 업데이트

③ 검증된 조합으로 안정성 보장

. . . . .
4) 비교 예시: 동일한 웹 애플리케이션 구성
(1) Spring Framework 방식
<!-- 10개 이상의 의존성을 각각 추가 -->
<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>
<!-- ... 계속 ... -->
(2) Spring Boot 방식
<!-- 단 1개의 의존성으로 해결 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

#4. 자동 설정과 내장 WAS

Spring Boot의 또 다른 핵심 기능은 자동 설정(Auto Configuration)내장 WAS입니다.

1) 자동 설정 (Auto Configuration)

Spring Boot는 애플리케이션에 추가된 라이브러리를 감지하여 자동으로 설정을 생성합니다.

(1) @SpringBootApplication 어노테이션
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

@SpringBootApplication은 3개의 어노테이션을 합친 것입니다.

@SpringBootApplication =
    @SpringBootConfiguration +
    @EnableAutoConfiguration +
    @ComponentScan
(2) 각 어노테이션의 역할

① @SpringBootConfiguration

- Spring의 @Configuration을 대체

- 현재 클래스가 설정 클래스임을 표시

② @ComponentScan

- @Component 계열 어노테이션을 스캔

- @Controller, @Service, @Repository, @Configuration 자동 감지

- 해당 클래스들을 Bean으로 등록

// 자동으로 Bean 등록되는 클래스들
@RestController // ← ComponentScan이 감지
public class UserController { ... }

@Service // ← ComponentScan이 감지
public class UserService { ... }

@Repository // ← ComponentScan이 감지
public class UserRepository { ... }

③ @EnableAutoConfiguration

- spring.factories 파일에 정의된 자동 설정 클래스 로드

- 조건(@Conditional)에 맞는 설정만 적용

- 개발자가 직접 설정하지 않아도 자동으로 Bean 구성

(3) 자동 설정 동작 원리
// spring-boot-autoconfigure/META-INF/spring.factories
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: 특정 속성이 설정되었을 때

. . . . .
2) 내장 WAS (Embedded Web Server)

Spring Boot의 혁신적인 기능 중 하나는 WAS를 애플리케이션 내부에 내장한 것입니다.

(1) 기존 방식 vs Spring Boot
구분 Spring Framework Spring Boot
WAS 설치 Tomcat 등 별도 설치 필요 내장 (설치 불필요)
패키징 WAR 파일 JAR 파일 (실행 가능)
배포 WAS에 WAR 배포 java -jar app.jar
개발 환경 WAS 설정 필요 IDE에서 바로 실행
(2) 내장 Tomcat 사용
// spring-boot-starter-web이 자동으로 포함
<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
(3) 다른 WAS로 변경하기

Tomcat 대신 Jetty나 Undertow를 사용할 수도 있습니다.

<!-- Tomcat 제외하고 Jetty 사용 -->
<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>
. . . . .
3) Spring Boot Actuator 모니터링

Spring Boot는 운영 환경을 위한 모니터링 도구를 기본 제공합니다.

(1) Actuator 추가
<dependency>
    <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
(2) 제공되는 엔드포인트
엔드포인트 경로 제공 정보
health /actuator/health 애플리케이션 상태
metrics /actuator/metrics 메모리, CPU, 스레드 정보
info /actuator/info 애플리케이션 정보
loggers /actuator/loggers 로그 레벨 확인/변경
httptrace /actuator/httptrace 최근 HTTP 요청 추적
// /actuator/health 응답 예시
{
  "status": "UP",
  "components": {
    "db": {
      "status": "UP",
      "details": {
        "database": "MySQL",
        "validationQuery": "isValid()"
      }
    },
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 499963174912,
        "free": 345678912345
      }
    }
  }
}

#5. 자주 묻는 질문(FAQ)
1) Q: Spring Boot를 사용하면 Spring Framework를 안 배워도 되나요?

A: 아닙니다. Spring Boot는 Spring Framework를 더 쉽게 사용하기 위한 도구입니다. Spring Framework의 핵심 개념(IoC, DI, AOP 등)을 이해해야 Spring Boot도 제대로 사용할 수 있습니다. Spring Boot는 설정을 자동화했을 뿐, 내부적으로는 Spring Framework를 사용합니다.

. . . . .
2) Q: 언제 Spring Framework를 사용하고 언제 Spring Boot를 사용하나요?

A: 현재는 대부분의 경우 Spring Boot를 사용하는 것이 권장됩니다.

Spring Boot 사용 권장

① 새로운 프로젝트 시작

② 빠른 프로토타입 개발

③ MSA(마이크로서비스) 아키텍처

④ RESTful API 서버 개발

Spring Framework 사용 고려

① 레거시 시스템 유지보수

② 매우 특수한 커스터마이징 필요

③ Spring Boot가 지원하지 않는 오래된 기술 사용

. . . . .
3) Q: Spring Boot의 자동 설정을 비활성화할 수 있나요?

A: 네, 가능합니다. 특정 자동 설정을 제외할 수 있습니다.

// 방법 1: @SpringBootApplication에서 제외
@SpringBootApplication(exclude = {
    DataSourceAutoConfiguration.class,
    HibernateJpaAutoConfiguration.class
})
public class MyApplication { ... }

# 방법 2: application.properties에서 제외
spring.autoconfigure.exclude=\
  org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
. . . . .
4) Q: JAR로 패키징된 Spring Boot를 WAR로 변경할 수 있나요?

A: 네, 가능합니다. 외부 Tomcat에 배포해야 하는 경우 WAR로 변경할 수 있습니다.

<!-- pom.xml -->
<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);
    }
}
. . . . .
5) Q: Spring Boot의 자동 설정이 어떻게 동작하는지 확인할 수 있나요?

A: --debug 옵션이나 application.properties 설정으로 확인할 수 있습니다.

# application.properties
debug=true

# 또는 실행 시
java -jar app.jar --debug

실행하면 콘솔에 다음 정보가 출력됩니다.

- Positive matches: 적용된 자동 설정

- Negative matches: 적용되지 않은 자동 설정과 이유

- Exclusions: 제외된 자동 설정

. . . . .
6) Q: Spring Boot Starter를 직접 만들 수 있나요?

A: 네, 커스텀 Starter를 만들 수 있습니다. 회사 내부에서 공통으로 사용하는 설정을 Starter로 만들어 배포할 수 있습니다.

// 1. 자동 설정 클래스 작성
@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
. . . . .
7) Q: Spring Boot 버전을 업그레이드할 때 주의사항은?

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의 강력한 기능들이 숨어 있기 때문입니다.

긴 글 읽어주셔서 감사합니다.

끝.
반응형