Spring과 Spring Boot의 비교

1. 개요

이 글에서는 표준 Spring 프레임 워크와 Spring Boot의 차이점을 살펴볼 것입니다.

MVC 및 Security와 같은 Spring 모듈이 코어 Spring에서 사용될 때와 Boot에서 사용될 때 어떻게 다른지에 초점을 맞추고 논의 할 것입니다.

2. 봄이란?

간단히 말해, Spring 프레임 워크는 Java 애플리케이션 개발을위한 포괄적 인 인프라 지원을 제공합니다 .

Dependency Injection과 같은 멋진 기능과 다음과 같은 즉시 사용 가능한 모듈이 포함되어 있습니다.

  • 스프링 JDBC
  • 봄 MVC
  • 봄 보안
  • 봄 AOP
  • 봄 ORM
  • 봄 테스트

이러한 모듈은 애플리케이션의 개발 시간을 대폭 단축 할 수 있습니다.

예를 들어, Java 웹 개발 초기에는 레코드를 데이터 소스에 삽입하기 위해 많은 상용구 코드를 작성해야했습니다. 그러나 Spring JDBC 모듈 의 JDBCTemplate 을 사용하면 몇 줄의 구성으로 몇 줄의 코드로 줄일 수 있습니다.

3. 스프링 부트 란?

Spring Boot는 기본적으로 Spring 애플리케이션을 설정하는 데 필요한 상용구 구성을 제거한 Spring 프레임 워크의 확장입니다.

더 빠르고 효율적인 개발 생태계를위한 길을 닦은 Spring 플랫폼에 대한 견해를 가지고 있습니다 .

다음은 Spring Boot의 몇 가지 기능입니다.

  • 빌드 및 애플리케이션 구성을 단순화하기위한 '스타터'종속성
  • 애플리케이션 배포의 복잡성을 방지하는 임베디드 서버
  • 메트릭, 상태 확인 및 외부화 된 구성
  • Spring 기능을위한 자동 구성 – 가능할 때마다

이 두 프레임 워크에 대해 단계별로 살펴 보겠습니다.

4. Maven 종속성

먼저 Spring을 사용하여 웹 애플리케이션을 만드는 데 필요한 최소 종속성을 살펴 보겠습니다.

 org.springframework spring-web 5.2.9.RELEASE   org.springframework spring-webmvc 5.2.9.RELEASE 

Spring과 달리 Spring Boot는 웹 애플리케이션을 시작하고 실행하는 데 하나의 종속성 만 필요합니다.

 org.springframework.boot spring-boot-starter-web 2.3.4.RELEASE 

다른 모든 종속성은 빌드 시간 동안 최종 아카이브에 자동으로 추가됩니다.

또 다른 좋은 예는 라이브러리 테스트입니다. 일반적으로 Spring Test, JUnit, Hamcrest 및 Mockito 라이브러리 세트를 사용합니다. Spring 프로젝트에서는 이러한 모든 라이브러리를 종속성으로 추가해야합니다.

그러나 Spring Boot에서는 이러한 라이브러리를 자동으로 포함하기 위해 테스트를위한 시작 종속성 만 필요합니다.

Spring Boot는 다양한 Spring 모듈에 대한 여러 스타터 종속성을 제공합니다. 가장 일반적으로 사용되는 방법은 다음과 같습니다.

  • 스프링 부트 스타터 데이터 jpa
  • 스프링 부트 스타터 보안
  • 스프링 부트 스타터 테스트
  • 스프링 부트 스타터 웹
  • 스프링 부트 스타터 타임 리프

전체 시작 목록은 Spring 문서를 확인하십시오.

5. MVC 구성

Spring과 Spring Boot를 모두 사용하여 JSP 웹 애플리케이션을 만드는 데 필요한 구성을 살펴 보겠습니다.

Spring은 디스패처 서블릿, 매핑 및 기타 지원 구성을 정의해야합니다. web.xml 파일 또는 Initializer 클래스를 사용하여이를 수행 할 수 있습니다 .

public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.setConfigLocation("com.baeldung"); container.addListener(new ContextLoaderListener(context)); ServletRegistration.Dynamic dispatcher = container .addServlet("dispatcher", new DispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } }

또한 @Configuration 클래스에 @EnableWebMvc 주석 을 추가 하고 컨트롤러에서 반환 된 뷰를 해결하기 위해 뷰 리졸버를 정의해야합니다.

@EnableWebMvc @Configuration public class ClientWebConfig implements WebMvcConfigurer { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver bean = new InternalResourceViewResolver(); bean.setViewClass(JstlView.class); bean.setPrefix("/WEB-INF/view/"); bean.setSuffix(".jsp"); return bean; } }

이 모든 것에 비해 Spring Boot는 웹 스타터를 추가 한 후 작동하도록 몇 가지 속성 만 필요합니다.

spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp

위의 모든 Spring 구성은 자동 구성이라는 프로세스를 통해 Boot 웹 스타터를 추가하여 자동으로 포함됩니다.

이것이 의미하는 바는 Spring Boot가 애플리케이션에 존재하는 종속성, 속성 및 Bean을 살펴보고이를 기반으로 구성을 활성화한다는 것입니다.

물론 자체 사용자 지정 구성을 추가하려면 Spring Boot 자동 구성이 취소됩니다.

5.1. 템플릿 엔진 구성

Let's now learn how to configure a Thymeleaf template engine in both Spring and Spring Boot.

In Spring we need to add the thymeleaf-spring5 dependency and some configurations for the view resolver:

@Configuration @EnableWebMvc public class MvcWebConfig implements WebMvcConfigurer { @Autowired private ApplicationContext applicationContext; @Bean public SpringResourceTemplateResolver templateResolver() { SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setApplicationContext(applicationContext); templateResolver.setPrefix("/WEB-INF/views/"); templateResolver.setSuffix(".html"); return templateResolver; } @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver()); templateEngine.setEnableSpringELCompiler(true); return templateEngine; } @Override public void configureViewResolvers(ViewResolverRegistry registry) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); registry.viewResolver(resolver); } }

Spring Boot 1 required only the dependency of spring-boot-starter-thymeleaf to enable Thymeleaf support in a web application. But because of the new features in Thymeleaf3.0, we have to add thymeleaf-layout-dialect also as a dependency in a Spring Boot 2 web application. Alternatively, we can choose to add a spring-boot-starter-thymeleaf dependency that'll take care of all this for us.

Once the dependencies are in place, we can add the templates to the src/main/resources/templates folder and the Spring Boot will display them automatically.

6. Spring Security Configuration

For the sake of simplicity, we'll see how the default HTTP Basic authentication is enabled using these frameworks.

Let's start by looking at the dependencies and configuration we need to enable Security using Spring.

Spring requires both the standard spring-security-web and spring-security-config dependencies to set up Security in an application.

Next, we need to add a class that extends the WebSecurityConfigurerAdapter and makes use of the @EnableWebSecurity annotation:

@Configuration @EnableWebSecurity public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1") .password(passwordEncoder() .encode("user1Pass")) .authorities("ROLE_USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .httpBasic(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }

Here we're using inMemoryAuthentication to set up the authentication.

Similarly, Spring Boot also requires these dependencies to make it work. But we need to define only the dependency ofspring-boot-starter-security as this will automatically add all the relevant dependencies to the classpath.

The security configuration in Spring Boot is the same as the one above.

If you need to know how the JPA configuration can be achieved in both Spring and Spring Boot, then check out our article A Guide to JPA with Spring.

7. Application Bootstrap

The basic difference in bootstrapping of an application in Spring and Spring Boot lies with the servlet. Spring uses either the web.xml or SpringServletContainerInitializer as its bootstrap entry point.

On the other hand, Spring Boot uses only Servlet 3 features to bootstrap an application. Let's talk about this in detail.

7.1. How Spring Bootstraps?

Spring supports both the legacy web.xml way of bootstrapping as well as the latest Servlet 3+ method.

Let's see the web.xml approach in steps:

  1. Servlet container (the server) reads web.xml
  2. The DispatcherServlet defined in the web.xml is instantiated by the container
  3. DispatcherServlet creates WebApplicationContext by reading WEB-INF/{servletName}-servlet.xml
  4. Finally, the DispatcherServlet registers the beans defined in the application context

Here's how Spring bootstraps using Servlet 3+ approach:

  1. The container searches for classes implementing ServletContainerInitializer and executes
  2. The SpringServletContainerInitializer finds all classes implementing WebApplicationInitializer
  3. The WebApplicationInitializer creates the context with XML or @Configuration classes
  4. The WebApplicationInitializer creates the DispatcherServlet with the previously created context.

7.2. How Spring Boot Bootstraps?

The entry point of a Spring Boot application is the class which is annotated with @SpringBootApplication:

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

By default, Spring Boot uses an embedded container to run the application. In this case, Spring Boot uses the public static void main entry-point to launch an embedded web server.

Also, it takes care of the binding of the Servlet, Filter, and ServletContextInitializer beans from the application context to the embedded servlet container.

Another feature of Spring Boot is that it automatically scans all the classes in the same package or sub packages of the Main-class for components.

Spring Boot provides the option of deploying it as a web archive in an external container as well. In this case, we have to extend the SpringBootServletInitializer:

@SpringBootApplication public class Application extends SpringBootServletInitializer { // ... }

Here the external servlet container looks for the Main-class defined in the META-INF file of the web archive and the SpringBootServletInitializer will take care of binding the Servlet, Filter, and ServletContextInitializer.

8. Packaging and Deployment

Finally, let's see how an application can be packaged and deployed. Both of these frameworks support the common package managing technologies like Maven and Gradle. But when it comes to deployment, these frameworks differ a lot.

For instance, the Spring Boot Maven Plugin provides Spring Boot support in Maven. It also allows packaging executable jar or war archives and running an application “in-place”.

Some of the advantages of Spring Boot over Spring in the context of deployment include:

  • Provides embedded container support
  • Provision to run the jars independently using the command java -jar
  • Option to exclude dependencies to avoid potential jar conflicts when deploying in an external container
  • Option to specify active profiles when deploying
  • Random port generation for integration tests

9. Conclusion

이 튜토리얼에서 우리는 Spring과 Spring Boot의 차이점에 대해 배웠습니다.

간단히 말해서, Spring Boot는 개발, 테스트 및 배포를보다 편리하게하기 위해 단순히 Spring 자체의 확장이라고 말할 수 있습니다.