기술 면접/Spring

Spring vs Spring boot

yxnxj 2022. 8. 9. 21:58

Spring을 처음 시작할 때 Spring이라고 한다면 Spring boot를 나타내는 줄 알았다. 하지만 둘은 분명한 차이가 있다. Spring이 무엇인지, Spring boot와 서로 차이점은 무엇인지 알아볼 것이다.

 

# Spring?

Spring은 경량화된(lightweight) 자바 오픈 소스 개발 프레임워크다. Spring은 기업 수준의 자바 앱 개발을 위한 구성 모델과 포괄적인 프로그래밍을 지원한다. 간단하게 말하자면 기업 용 자바 개발을 심플하게 만들어주고 효과적, 효율적으로 하기 위함을 목표로 한다.

 

Spring은 본래 넓은 분야에 앱 개발을 지원하기 때문에 많은 모듈들을 가지고 있다.

  • Spring MVC
  • Spring JDBC
  • Spring Security
  • Spring ORM
  • Spring AOP
  • Spring Test

이 모듈들은 앱 개발 시간을 드라마틱하게 줄여준다. 예를 들어 예전 자바 웹 개발에서는 data source에 record를 넣기 위해 많은 표준적인(boilderplate) 코드를 작성해야 햇다. Spring JDBC의 JDBCTemplate을 사용함으로써 몇 줄만으로 configuration을 마칠 수 있다.

 

# Spring Boot?

Spring Boot는 기본적으로 Spring 프레임워크의 확장이라고 볼 수 있다. 위에서 언급한 boilderplate 코드 작성 없이 Spring 앱 설정을 마칠 수 있다.

 

더 빠르고 효율적으로 개발을 환경을 구축할 수 있도록 Spring의 독단적인(Opinionated) 방법을 사용한다.

 

Spring Boot의 대표적인 기능은 다음과 같다.

 

1. starter 라이브러리들을 추가하여 독단적인 앱 빌드와 설정을 간단하게 만든다.

Spring Boot 는 'starter'를 제공한다. 스타터는 특정 목적을 위한 라이브러리 Dependency 그룹이다. 개발자는 필요한 모든 라이브러리의 Dependency를 찾아볼 필요가 없고 빌드 구성 코드를 간소화할 수 있다.

 

starter에 포함된 라이브러리들은 다음과 같다.

  • spring-boot-starter-data-jpa
  • spring-boot-starter-security
  • spring-boot-starter-test
  • spring-boot-starter-web
  • spring-boot-starter-thymeleaf

 

이 중 spring-boot-start-thymeleaf 모듈이 없을 때 Spring에서 설정하던 예시를 설명하겠다.

 

spring starter thymeleaf 가 있지 않을 때는 다음 코드들을 작성하여 설정 해주어야 했다.

@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의 spring-boot-starter-thymeleaf dependency를 gradle이든 maven으로 설정해주기만 하면 위와 같은 설정들은 할 필요가 없다.

 

이는 thymeleaf만이 아닌 다른 라이브러리들도 마찬가지다.

 

 

2. tomcat, jetty 같은 서버가 내장되어 있어 복잡한 배포를 피할 수 있다.

jar와 war는 둘 다 jdk에 포함된 jar.exe라는 유틸리티를 이용해 생성되는 자바 애플리케이션 압축 파일이다. 그 중 war형식은 웹 애플리케이션 파일들을 패키징 한다. jre(Java Runtime Environment)에서 실행되는 jar와 달리 war 압출 파일을 실행하려면 Tomcat, Jetty등의 웹 서버 또는 웹 애플리케이션 서버를 설치해야 한다. 

 

Spring Boot는 Tomcat과 Jetty같은 웹 서버를 내장하고 있어서 jar 형식을 사용해 배포할 수 있다. 또한 dependency 설정을 수정하여 내장 서버를 사용하지 않을 수 있다. 

 

 

3. Metrics, Health check, externalized configuration

Spring Boot는 애플리케이션 모니터링을 위한 상태 점검 기능(Spring Boot Acuator)을 제공한다.

 

#결론

Spring은 기존 엔터프라이즈 앱 개발을 위해 범용성 높고 넓게 활용되는 것에 초점을 두었다면 Spring Boot은 개발자들이 좀 더 개발 로직 구현에만 초점을 두고 집중하는데 초점을 두었다.

 

개발자라면 개발 환경 세팅에 하루를 쏟는 경험을 해봤을 것이다. Spring Boot는 이런 힘든 노력을 줄이기 위해 나타났다고 할 수 있다. Spring Boot를 사용하여 코드의 길이와 설정을 줄이고 간단하고 쉬운 방법으로 개발을 시작할 수 있다.

 

Ref: 

https://www.baeldung.com/spring-vs-spring-boot

https://rollbar.com/blog/spring-vs-spring-boot-whats-the-difference/

https://gasungbilife.tistory.com/8

https://hianna.tistory.com/655