1. 개요
이 튜토리얼에서는 표준 Spring 프레임워크와 Spring Boot의 차이점을 살펴보겠습니다.
MVC 및 보안과 같은 Spring 모듈이 Core 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. 메이븐 종속성
먼저 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 모듈에 대한 많은 스타터 종속성을 제공합니다. 가장 일반적으로 사용되는 것 중 일부는 다음과 같습니다.
spring-boot-starter-data-jpa
스프링 부트 스타터 보안
스프링 부트 스타터 테스트
스프링 부트 스타터 웹
spring-boot-starter-thymeleaf
초보자의 전체 목록은 Spring 문서도 확인하십시오.
spring-boot-starter-data-jpa
spring-boot-starter-security
spring-boot-starter-test
spring-boot-starter-web
spring-boot-starter-thymeleaf
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가 애플리케이션에 존재하는 종속성, 속성 및 빈을 살펴보고 이를 기반으로 구성을 활성화한다는 것입니다.
물론 우리만의 커스텀 구성을 추가하고 싶다면 Spring Boot 자동 구성은 뒤로 물러날 것입니다.
5.1. 템플릿 엔진 구성
이제 Spring과 Spring Boot 모두에서 Thymeleaf 템플릿 엔진을 구성하는 방법을 알아보겠습니다.
Spring에서는 thymeleaf-spring5 의존성과 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은 웹 애플리케이션에서 Thymeleaf 지원을 활성화하기 위해 spring-boot-starter-thymeleaf의 종속성만 필요합니다. Thymeleaf3.0의 새로운 기능으로 인해 Spring Boot 2 웹 애플리케이션의 종속성으로 thymeleaf-layout-dialect도 추가해야 합니다. 또는 이 모든 것을 처리할 spring-boot-starter-thymeleaf 종속성을 추가하도록 선택할 수 있습니다.
종속성이 제자리에 있으면 템플릿을 src/main/resources/templates 폴더에 추가할 수 있으며 Spring Boot는 템플릿을 자동으로 표시합니다.
6. 스프링 시큐리티 설정
단순화를 위해 이러한 프레임워크를 사용하여 기본 HTTP 기본 인증을 활성화하는 방법을 살펴보겠습니다.
Spring을 사용하여 보안을 활성화하는 데 필요한 종속성과 구성을 살펴보는 것으로 시작하겠습니다.
Spring은 애플리케이션에서 보안을 설정하기 위해 표준 spring-security-web 및 spring-security-config 종속성을 모두 필요로 합니다.
다음으로 SecurityFilterChain 빈을 생성하고 @EnableWebSecurity 주석을 사용하는 클래스를 추가해야 합니다.
@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user1")
.password(passwordEncoder()
.encode("user1Pass"))
.authorities("ROLE_USER");
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic();
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
여기에서는 inMemoryAuthentication을 사용하여 인증을 설정합니다.
Spring Boot도 작동하려면 이러한 종속성이 필요하지만 spring-boot-starter-security의 종속성을 정의하기만 하면 모든 관련 종속성이 클래스 경로에 자동으로 추가됩니다.
Spring Boot의 보안 설정은 위와 동일합니다.
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은 부트스트래핑의 레거시 web.xml 방식과 최신 Servlet 3+ 방식을 모두 지원합니다.
단계별로 web.xml 접근 방식을 살펴보겠습니다.
서블릿 컨테이너(서버)는 web.xml을 읽습니다.
web.xml에 정의된 DispatcherServlet은 컨테이너에 의해 인스턴스화됩니다.
DispatcherServlet은 WEB-INF/{servletName}-servlet.xml을 읽어 WebApplicationContext를 생성합니다.
마지막으로 DispatcherServlet은 애플리케이션 컨텍스트에 정의된 빈을 등록합니다.
다음은 Servlet 3+ 접근 방식을 사용하는 Spring 부트스트랩 방법입니다.
컨테이너는 ServletContainerInitializer를 구현하는 클래스를 검색하고 실행합니다.
SpringServletContainerInitializer는 WebApplicationInitializer를 구현하는 모든 클래스를 찾습니다.
WebApplicationInitializer는 XML 또는 @Configuration 클래스로 컨텍스트를 생성합니다.
WebApplicationInitializer는 이전에 생성된 컨텍스트로 DispatcherServlet을 생성합니다.
7.2. 스프링 부트 부트스트랩은 어떻게?
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 빈 바인딩을 처리합니다.
Spring Boot의 또 다른 기능은 구성 요소에 대한 Main-class의 동일한 패키지 또는 하위 패키지의 모든 클래스를 자동으로 스캔한다는 것입니다.
또한 Spring Boot는 외부 컨테이너에 웹 아카이브로 배포하는 옵션을 제공합니다. 이 경우 SpringBootServletInitializer를 확장해야 합니다.
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
// ...
}
여기서 외부 서블릿 컨테이너는 웹 아카이브의 META-INF 파일에 정의된 Main-class를 찾고 SpringBootServletInitializer는 Servlet, Filter 및 ServletContextInitializer 바인딩을 처리합니다.
8. 패키징 및 배포
마지막으로 애플리케이션을 패키징하고 배포하는 방법을 살펴보겠습니다. 이 두 프레임워크는 모두 Maven 및 Gradle과 같은 공통 패키지 관리 기술을 지원합니다. 그러나 배포와 관련하여 이러한 프레임워크는 많이 다릅니다.
예를 들어 Spring Boot Maven Plugin은 Maven에서 Spring Boot 지원을 제공합니다. 또한 실행 가능한 jar 또는 war 아카이브를 패키징하고 애플리케이션을 "인플레이스"에서 실행할 수 있습니다.
배포 컨텍스트에서 Spring에 비해 Spring Boot의 몇 가지 장점은 다음과 같습니다.
임베디드 컨테이너 지원 제공
java -jar 명령을 사용하여 jar를 독립적으로 실행하도록 프로비저닝
외부 컨테이너에 배포할 때 잠재적인 jar 충돌을 방지하기 위해 종속성을 제외하는 옵션
배포 시 활성 프로필을 지정하는 옵션
통합 테스트를 위한 임의 포트 생성
9. 결론
이 기사에서는 Spring과 Spring Boot의 차이점에 대해 배웠습니다.
간단히 말해서 Spring Boot는 개발, 테스트 및 배포를 보다 편리하게 하기 위한 Spring 자체의 확장이라고 말할 수 있습니다.
출처 : https://www.baeldung.com/spring-vs-spring-boot
'IT > 자바' 카테고리의 다른 글
[JAVA] 문자 to Double 형 변환 (0) | 2023.10.18 |
---|---|
[JAVA] MultiData for문 사용시 데이터 추출 방법 (0) | 2023.10.18 |
decorators.xml 파일 사용 방법 (0) | 2023.03.03 |
decorators.xml 와 sitemash 의 관계 (0) | 2023.03.03 |
decorators.xml 파일의 역활 (0) | 2023.03.03 |