ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring vs Spring boot
    기술 면접/Spring 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

    '기술 면접 > Spring' 카테고리의 다른 글

    Stomp, SockJS를 이용하여 채팅 구현하기  (0) 2022.08.11
    Json Web Token  (0) 2022.04.30
Designed by Tistory.