[Spring] Spring VS Spring Boot
Spring VS Spring Boot
Spring과 Spring Boot는 Java 애플리케이션 개발을 위해 널리 사용되는 오픈 소스 프레임워크이다. 둘 다 개발을 위한 강력한 기능을 제공하지만 용도와 접근 방식에서 차이가 있다.
Spring Framework(Spring)
Spring은 엔터프라이즈급 애플리케이션을 개발하기 위한 종합적인 프레임워크이다. 애플리케이션의 다양한 계층(Web, Data Access, Business Logic 등)를 쉽게 관리하고 통합할 수 있게 해준다. Spring의 주요 모듈로는 Spring Core, Spring MVC, Spring Data, Spring Security 등이 있다. 여러 설정 파일과 어노테이션을 통해 애플리케이션 동작을 세밀히 조정한다.
Spring Framework 주요 특징
- IoC(Inversion of Control) - 객체의 생성, 의존 관계 설정 등을 프레임워크가 대신 해주며 개발자 대신 제어권을 가진다.
- DI(Dependency Injection) - 의존성 주입을 통해 객체 간 결합을 느슨하게 한다.
- AOP(Aspect Oriented Programming) - 핵심 기능을 제외하고 반복되는 logging, security 등의 부수 기능들을 추가한다.
- 중복된 코드를 줄여준다.
- JUnit과 같은 단위 테스트 프레임워크와 통합이 쉽다.
Spring의 특징에 대한 글은 아래 포스팅을 통해 작성하였다.
Spring Boot
Spring Boot는 Spring Framework를 더욱 간편히 사용할 수 있도록 도와주는 프레임워크이다. 설정을 최소화하고, 빠르게 애플리케이션을 시작할 수 있도록 해준다. Spring의 기능을 그대로 사용하면서도, 기본 설정과 자동 구성 기능을 제공하여 개발자들이 설정에 신경 쓰지 않고 비즈니스 로직에 집중할 수 있도록 도와준다.
차이점 1) Dependency (Gradle, Maven 모두 비교)
Spring (Maven)
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<!-- 기타 의존성들 -->
</dependencies>
Spring (Gradle)
dependencies {
implementation 'org.springframework:spring-core:5.3.9'
implementation 'org.springframework:spring-context:5.3.9'
implementation 'org.springframework:spring-webmvc:5.3.9'
// 기타 의존성들
}
Spring Boot (Maven)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.1</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 기타 의존성들 -->
</dependencies>
Spring Boot (Gradle)
plugins {
id 'org.springframework.boot' version '3.3.1'
id 'io.spring.dependency-management' version '1.1.5'
id 'java'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
// 기타 의존성들
}
Spring Boot는 spring-boot-starter 의존성만 추가하면 대부분의 필요한 의존성을 자동으로 포함하여 편리하다. 반면, Spring은 필요한 의존성을 직접 추가해야 한다.
차이점 2-1) Configuration
예시로 타임리프를 설정하는 방법을 살펴보자.
Spring의 Java Config
@Configuration
public class WebConfig implements WebMvcConfigurer {
// Thymeleaf Template Engine
@Bean
public SpringResourceTemplateResolver templateResolver(ApplicationContext applicationContext) {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(applicationContext);
templateResolver.setPrefix("classpath:templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
templateEngine.setEnableSpringELCompiler(true);
templateEngine.setTemplateEngineMessageSource(messageSource());
return templateEngine;
}
// Thymeleaf View Resolver
@Bean
public ViewResolver thymeleafViewResolver(ISpringTemplateEngine templateEngine) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine);
viewResolver.setCharacterEncoding("UTF-8");
viewResolver.setOrder(1);
return viewResolver;
}
}
Spring Boot의 설정 파일
application.properties
spring.thymeleaf.prefix=classpath:templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.cache=false
spring.thymeleaf.enabled=true
application.yml
spring:
#thymeleaf
thymeleaf:
prefix: classpath:templates/
suffix: .html
mode: HTML
encoding: UTF-8
cache: false
enabled: true
Spring Boot에서는 application.properties나 application.yml 파일을 사용하여 설정할 수 있어 훨씬 간편하다.
차이점 2-2) AutoConfiguration
Spring의 Java Config인 경우
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
@Bean
public DataSource dataSource() {
return new DriverManagerDataSource("jdbc:h2:mem:testdb", "hi", "hi");
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "com.example" });
return em;
}
}
Spring의 Xml Config인 경우
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:testdb"/>
<property name="username" value="hi"/>
<property name="password" value="hi"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.example"/>
</bean>
</beans>
Spring Boot
Spring Boot의 @SpringBootApplication 어노테이션은 @EnableAutoConfiguration, @ComponentScan, @Configuration을 포함하고 있다.
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
아래는 위와 동일한 코드이다.
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
Spring에서는 XML 또는 Java Config로 설정해야 하지만, Spring Boot에서는 @SpringBootApplication 이라는 어노테이션이 외부 라이브러리, 내장 톰캣 서버 등을 실행시켜준다. 만약, 이 어노테이션을 제거하고 프로그램을 실행하면 기본 자바 프로그램과 같이 실행된다.
@ComponentScan은 @Component, @Controller, @Repository, @Service라는 어노테이션이 붙어 있으면 객체로 스캔하여 자동으로 Bean으로 등록해준다.
@EnableAutoConfiguration은 클래스패스(classpath) 상에 존재하는 의존성들을 기반으로 애플리케이션의 설정을 자동으로 구성해준다.
차이점 3) 배포가 편리하다.
Spring
Spring 애플리케이션을 배포하려면, 보통 War 파일로 패키징하여 이를 서블릿 컨테이너(Tomcat, Jetty)에 배포해야 한다. 이 과정은 설정과 관리가 복잡할 수 있다.
Spring Boot
Spring Boot 애플리케이션은 독립 실행형 Jar 파일로 패키징하여 실행할 수 있다. 내장 서블릿 컨테이너(Tomcat, Jetty) 을 포함하고 있어서 별도의 컨테이너 설치가 필요 없다. 즉, 단일 Jar 파일로 배포할 수 있어 설정과 배포가 매우 간편하다.