본문 바로가기

Spring

Spring vs Spring boot

등장 배경

기존  Spring framework는 다양한 프레임워크와 기술을 지원함과 동시에 개발자가 처리해야 하는 설정도 많아지고 복잡해졌다. 따라서 Spring을 처음 접하는 개발자 입장에서는 이러한 복잡한 설정에 부담을 느낄 수 밖에 없어 개발자가 보다 더 개발에 집중할 수 있도록 Spring boot가 새롭게 나왔다.


장점

1) 라이브러리 관리 자동화
- Maven의 기능과 ‘starter’ 컴포넌트들을 이용해 라이브러리 의존성을 간단히 처리
2) 설정 자동화
- 프로젝트에 추가된 라이브러리를 기반으로, 실행에 필요한 환경을 자동 설정
3) 라이브러리 버전 자동 관리
- Spring 라이브러리 뿐만 아니라 Third-party 라이브러리까지 호환되는 버전으로 자동 다운로드
4) 테스트 환경
- JUnit을 비롯한 테스트 라이브러리가 내장되어 있음
5) 서버 내장
- 내장형 Tomcat, Jetty 또는 Undertow 를 지원 (war 배포시 불필요)
- 내장형 서버를 기반으로 main 메서드를 실행하는 방식으로 서버를 구동할 수 있어, 보다 빠르게 실행 결과 확인 가능
5) 독립적으로 실행 가능한 JAR
- 단독 실행이 가능한 스프링 어플리케이션을 생성
- War가 아닌 Jar파일로 패키징하여 배포 및 실행 가능
6) 설정을 위한 XML 코드 대신에 properties 및 yaml 파일 사용
7) 상용화 수준의 통계 (metrics), 상태 점검 (health check) 및 외부 설정 제공

 

위와 같은 장점이 있는데, 이 중에서 배포, 의존성, 설정에 관해서 알아보자


Dependency

Spring Framework의 경우 dependency를 설정해줄 때 설정 파일이 매우 길고, 모든 dependency에 대해 버전 관리도 하나하나 해줘야 한다.

//Spring Framework
<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 boot
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.4.4</version>
</dependency>

위의 코드는 스프링 웹어플리케이션을 생성하는데 필요한 최소 dependency로 spring과는 다르게 spring boot에서는 자동으로 웹 개발시 필요한 의존성을 위의 한 코드로 모두 추가해준다.

비슷한 예로 test 프레임워크를 사용해야할 때 spring인 경우 Spring Test, JUnit, Hamcrest, Mockito 등 모든 라이브러리를 추가해줘야 하지만 spring boot를 이용할 경우 spring-boot-starter-test 만 추가해주면 된다.

 

Configuration

JSP 웹 어플리케이션을 만드는 상황을 예로 들어보자

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

@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에서는 dispatcher servlit, mapping, 등에 관한 configuration이 필요하며 viewResolver를 이용해 컨트롤러에서 반환되는 view를 설정해 주어야 한다.

하지만 spring boot를 이용한다면 다음과 같이 줄일 수 있다.

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

 spring에서 했던 설정은 모두 위의 코드로 설정이 가능하며 spring-boot의 auto-configuration에 의해서 자동으로 추가가 된다.

배포

Spring Framework로 개발한 애플리케이션의 경우, war파일을 Web Application Server에 담아 배포했다.

하지만 Spring Boot Framework의 경우, Tomcat 이나 Jetty 같은 내장 WAS를 가지고 있기 때문에 jar 파일로 간편하게 배포할 수 있게 되었다.

Spring Framework로 WAS를 정하고, 모든 설정을 마쳐 배포를 하는 것보다 훨씬 간단한 배포 방법이다.

 

참고

'Spring' 카테고리의 다른 글

Servlet과 Spring MVC  (0) 2023.03.06
AOP의 개념  (0) 2023.02.05
Maven & Gradle  (0) 2022.11.08
BeanFactory & ApplicationContext  (0) 2022.11.08
Spring Bean life cycle  (0) 2022.11.08