1. 개요

이 예제에서는 표준 Spring 프레임 워크와 Spring Boot의 차이점을 살펴 보겠습니다.

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

2. Spring이란?

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

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

  • 스프링 JDBC
  • Spring MVC
  • Spring Security
  • Spring AOP
  • Spring ORM
  • Spring 테스트

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

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

3. 스프링 부트 란?

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

더 빠르고 효율적인 개발 생태계를위한 길을 닦는 Spring 플랫폼에 대한 독단적 인 관점을 취합니다 .

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

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

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

4. Maven 의존성

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

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.3.5</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.5</version>
</dependency>

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.4.4</version>
</dependency>

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

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

또는 Spring Boot에서는 이러한 라이브러리를 자동으로 포함하기위한 테스트 용 스타터 의존성 만 필요합니다.

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

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

전체 시작 List은 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 구성은 auto-configuration 이라는 프로세스를 통해 Boot 웹 스타터를 추가하여 자동으로 포함됩니다 .

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

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

5.1. 템플릿 엔진 구성

이제 Spring과 Spring Boot에서 Thymeleaf 템플릿 엔진 을 구성하는 방법을 알아 보겠습니다 .

Spring에서는 뷰 리졸버에 대한 thymeleaf-spring5 의존성 및 일부 구성 을 추가해야합니다 .

@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 은 웹 애플리케이션에서 Thymeleaf 지원 을 활성화하기 위해 spring-boot-starter-thymeleaf  의 의존성 만 필요합니다 . Thymeleaf 3.0  의 새로운 기능으로 인해 Spring Boot 2 웹 애플리케이션의 의존성으로 thymeleaf-layout-dialect 를 추가 해야  합니다. 또는 우리를 위해이 모든 것을 처리 spring-boot-starter-thymeleaf 의존성 을 추가하도록 선택할 수 있습니다 .

의존성이 제자리에 있으면 src / main / resources / templates 폴더에 템플릿을 추가 할 수 있으며 Spring Boot는 템플릿을 자동으로 표시합니다.

6. 스프링 Security 구성

간단하게하기 위해 이러한 프레임 워크를 사용하여 기본 HTTP 기본 인증을 활성화하는 방법을 살펴 보겠습니다.

Spring을 사용하여 Security을 활성화하는 데 필요한 의존성 및 구성부터 살펴 보겠습니다.

Spring은 애플리케이션에서 Security을 설정하기 위해 표준 spring-security-webspring-security-config  의존성 이 모두 필요합니다 .

다음으로 WebSecurityConfigurerAdapter 를 확장 하고 @EnableWebSecurity 어노테이션을 사용 하는 클래스를 추가해야합니다 .

@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();
    }
}

여기서는 inMemoryAuthentication사용 하여 인증을 설정합니다.

Spring Boot는 작동하기 위해 이러한 의존성도 필요하지만 spring-boot-starter-security 의 의존성 만 정의하면 모든 관련 의존성이 클래스 경로에 자동으로 추가됩니다.

Spring Boot의 Security 구성은 위와 동일합니다.

Spring과 Spring Boot 모두에서 JPA 구성을 수행하는 방법을 확인하려면 A Guide to JPA with Spring 문서를 참조하십시오 .

7. 애플리케이션 부트 스트랩

Spring과 Spring Boot에서 애플리케이션을 부트 스트랩하는 기본적인 차이점은 서블릿에 있습니다. Spring은 web.xml  또는 SpringServletContainerInitializer  를 부트 스트랩 진입 점으로 사용합니다.

반면에 Spring Boot는 Servlet 3 기능 만 사용하여 애플리케이션을 부트 스트랩합니다. 이것에 대해 자세히 이야기합시다.

7.1. 어떻게 Spring Bootstraps?

Spring은 레거시 web.xml 부트 스트랩 방식과 최신 Servlet 3+ 방식을 모두 지원합니다 .

web.xml 접근 방식을 단계별로 살펴 보겠습니다  .

  1. 서블릿 컨테이너 (서버)는 web.xml을 읽습니다 .
  2. 의 DispatcherServlet 에 정의 의 web.xml은 컨테이너에 의해 인스턴스화됩니다.
  3. DispatcherServletWEB-INF / {servletName} -servlet.xml 을 읽어 WebApplicationContext생성 합니다.
  4. 마지막으로 DispatcherServlet 은 애플리케이션 컨텍스트에 정의 된 Bean을 등록합니다.

다음은 Servlet 3+ 접근 방식을 사용하는 Spring 부트 스트랩 방법입니다.

  1. 컨테이너는 ServletContainerInitializer를 구현하는 클래스를 검색  하고 실행합니다.
  2. SpringServletContainerInitializer가 구현하는 모든 클래스 발견 WebApplicationInitializer합니다.
  3. WebApplicationInitializer은 XML이나와 컨텍스트 생성 @Configuration 클래스를.
  4. WebApplicationInitializer는 생성 DispatcherServlet에  이전에 생성 된 컨텍스트를.

7.2. 어떻게 Spring Boot Bootstraps?

Spring Boot 애플리케이션의 진입 점은 @SpringBootApplication 어노테이션이 달린 클래스입니다 .

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

기본적으로 Spring Boot는 임베디드 컨테이너를 사용하여 애플리케이션을 실행합니다. 이 경우 Spring Boot는 public static void 기본 진입 점을 사용하여 임베디드 웹 서버를 시작합니다.

또한 애플리케이션 컨텍스트에서 임베디드 서블릿 컨테이너 로의 Servlet, FilterServletContextInitializer Bean 의 바인딩도 처리합니다 .

Spring Boot의 또 다른 기능은 구성 요소에 대해 Main 클래스의 동일한 패키지 또는 하위 패키지에있는 모든 클래스를 자동으로 스캔한다는 것입니다.

또한 Spring Boot는 외부 컨테이너에 웹 아카이브로 배포하는 옵션을 제공합니다. 이 경우 SpringBootServletInitializer 를 확장해야합니다 .

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

여기서 외부 서블릿 컨테이너는 웹 아카이브의 META-INF 파일에 정의 된 Main-class를 찾고 SpringBootServletInitializerServlet, FilterServletContextInitializer 의 바인딩을 처리합니다 .

8. 패키징 및 배포

마지막으로 애플리케이션을 패키징하고 배포하는 방법을 살펴 보겠습니다. 이 두 프레임 워크는 Maven 및 Gradle과 같은 공통 패키지 관리 기술을 지원합니다. 그러나 배포와 관련하여 이러한 프레임 워크는 많이 다릅니다.

예를 들어 Spring Boot Maven 플러그인 은 Maven에서 Spring Boot 지원을 제공합니다. 또한 실행 가능한 jar 또는 war 아카이브를 패키징하고 애플리케이션을 "현재 위치"에서 실행할 수도 있습니다.

배포의 맥락에서 Spring보다 Spring Boot의 장점은 다음과 같습니다.

  • 임베디드 컨테이너 지원 제공
  • java -jar 명령을 사용하여 jar를 독립적으로 실행하도록 프로비저닝
  • 외부 컨테이너에 배포 할 때 잠재적 인 jar 충돌을 방지하기 위해 의존성을 제외하는 옵션
  • 배포시 활성 프로필을 지정하는 옵션
  • 통합 테스트를위한 랜덤 포트 생성

9. 결론

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

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