Spring

[Spring] Spring VS Spring Boot

cloud-grace 2024. 7. 6. 16:43

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] 스프링의 삼각형(IoC/DI, AOP, PSA)

스프링의 삼각형, 3대 요소(Spring Triangle)스프링의 삼각형(Spring Triangle), 즉, 스프링의 핵심 3요소가 있다. 1. IoC/DIIoC란 제어의 역전으로 스프링 컨테이너가 객체에 대한 제어권을 가지고 있는 것이

cloud-grace.tistory.com

 

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 파일로 배포할 수 있어 설정과 배포가 매우 간편하다.