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-web 및 spring-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 접근 방식을 단계별로 살펴 보겠습니다 .
- 서블릿 컨테이너 (서버)는 web.xml을 읽습니다 .
- 의 DispatcherServlet 에 정의 의 web.xml은 컨테이너에 의해 인스턴스화됩니다.
- DispatcherServlet 은 WEB-INF / {servletName} -servlet.xml 을 읽어 WebApplicationContext 를 생성 합니다.
- 마지막으로 DispatcherServlet 은 애플리케이션 컨텍스트에 정의 된 Bean을 등록합니다.
다음은 Servlet 3+ 접근 방식을 사용하는 Spring 부트 스트랩 방법입니다.
- 컨테이너는 ServletContainerInitializer를 구현하는 클래스를 검색 하고 실행합니다.
- SpringServletContainerInitializer가 구현하는 모든 클래스 발견 WebApplicationInitializer합니다.
- WebApplicationInitializer은 XML이나와 컨텍스트 생성 @Configuration 클래스를.
- 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, Filter 및 ServletContextInitializer Bean 의 바인딩도 처리합니다 .
Spring Boot의 또 다른 기능은 구성 요소에 대해 Main 클래스의 동일한 패키지 또는 하위 패키지에있는 모든 클래스를 자동으로 스캔한다는 것입니다.
또한 Spring Boot는 외부 컨테이너에 웹 아카이브로 배포하는 옵션을 제공합니다. 이 경우 SpringBootServletInitializer 를 확장해야합니다 .
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
// ...
}
여기서 외부 서블릿 컨테이너는 웹 아카이브의 META-INF 파일에 정의 된 Main-class를 찾고 SpringBootServletInitializer 가 Servlet, Filter 및 ServletContextInitializer 의 바인딩을 처리합니다 .
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 자체의 확장이라고 말할 수 있습니다.
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-vs-spring-boot
'Java' 카테고리의 다른 글
Maven과 실행 가능한 War / Jar로 Spring Boot 앱 실행 (0) | 2021.04.22 |
---|---|
블레이드 – 완벽한 사용방법(예제) 북 (0) | 2021.04.21 |
Morphia 소개 – MongoDB 용 Java ODM (0) | 2021.04.21 |
Spring Cloud App Starter 사용 (0) | 2021.04.21 |
RAML 소개 – RESTful API 모델링 언어 (0) | 2021.04.21 |