Spring Framework 와 Spring Boot 비교

Bruce Han·2022년 8월 7일
1

Spring 튜토리얼

목록 보기
3/3
post-thumbnail

Synopsis

부트캠프를 하면서 예정되어있지 않은 과제로 Spring에서 소스 변경을 통한 Spring Boot로의 Migration을 수행하려고 했었다.
하지만, 둘의 특징도 모른 채 변경을 수행하려니 막히는 부분이 많았었다.
기능 구현도 중요하지만, 지피지기면 백전백승이라고 Migration하기에 앞서 모르는 지식을 쭉 정리한 후에 수행하려고 포스팅을 하게 됐다.

목차

Spring Framework🌱란?

Spring Boot🌻란?

Spring Framework🌱와 Spring Boot🌻 차이

마치면서


Spring Framework🌱란?

Spring, 즉 Spring Framework란 과거 EJB를 대체하는 도구입니다.
Rod Johnson이 2002년에 출판한 자신의 저서인 Expert One-on-One J2EE Design and Development에 있던 3만 줄의 코드를 기반으로 유겐 휠러, 얀 카로프라는 사람이 오픈 소스 프로젝트를 제안하면서 탄생하게 된 프레임워크입니다.

EJB에 비해 많은 부분이 발전된 형태였지만, Spring Framework 역시 프로젝트를 만드는 데에는 설정해야 할 것들이 많습니다.
그런데도 Spring이 Java의 대표 프레임워크로 자리 잡게 된 것은

이러한 장점을 지니고 있어서입니다.

스프링 프레임워크(Spring Framework)는 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로서 간단히 스프링(Spring)이라고도 한다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로서 쓰이고 있다.
-- 위키백과

개발자가 코드 안에 애플리케이션 동작에 관한 내용을 기술하면, 이를 Spring Framework가 해석해서 동작하는 방식입니다.
Spring Framework는 개발자가 비즈니스 로직에 집중할 수 있도록, 대규모 데이터를 처리하거나 트랜잭션을 처리하는 Enterprise Application을 위한 종합적인 기능들을 지원한다고 보시면 됩니다.

즉, 개발자들이 애플리케이션을 조금 더 쉽게 구현할 수 있도록 도와주는 것입니다.

이 Spring이 해결하고자 하는 것은

  • Dependency Injection(DI) - 의존성 주입
    - 객체 간 결합을 느슨하게 만들 수 있음
    - 코드 재사용성이 증가하고 단위테스트(Unit Test)에 용이
  • 중복된 코드 제거
    - 비즈니스 로직에만 집중하기 위함
    - Ex) JDBC Template
  • 다른 프레임워크와의 통합
    - 여러 프레임워크를 통해 해결하고자 하는 문제를 높은 품질로 해결 가능
    - JUnit & Mockito for Unit Testing

가 되겠습니다.


Spring Boot🌻란?

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration.

Spring Boot는 단독적이고 상용화 수준의 "실행만 하면" 되는 Spring기반 Application을 만드는데 용이합니다.
Spring Boot는 최소한의 번거로움으로 스프링 기반의 프로덕션 급 응용 프로그램 및 서비스를 쉽게 만들 수 있도록 하는 것을 목표로 합니다.

-- 스프링 공식문서

간단하게 정리하자면

Spring Boot를 사용하면 최소한의 구성으로 쉽게 실행 가능한 단독적인 스프링 기반 상용화 수준의 애플리케이션을 만들 수 있다!

정도가 되겠습니다.

기존 Spring Framework는 기능이 많은 만큼 개발에 있어 환경설정(엄청난 길이의 pom.xml)이 복잡한 편이었습니다.

이러한 Spring의 단점을 극복하고자 나온 것이 Spring Boot인데요.

공식문서에서 밝히는 이들의 목표는 다음과 같습니다.

  • 모든 Spring 개발에 대해 근본적으로 더 빠르고 광범위하게 액세스할 수 있는 시작 환경을 제공한다.
  • 내장 서버, 보안, Metric, 상태 확인 및 외부 구성 등, 대규모 프로젝트 클래스에 공통적인 기능을 제공한다.
  • 코드 생성 및 XML 구성 요구 사항이 없다.

이 목표에 맞게 Spring Boot의 특징도 다음과 같은데요.

  • Auto Configuration (자동 설정)
  • Easy Dependency Management (쉬운 의존성 관리)
  • Embedded Servlet Container Support (내장 서블릿 컨테이너)

위 세 가지가 스프링의 대표적인 특징이라고 할 수 있겠습니다.


Spring Framework🌱와 Spring Boot🌻 차이

1. Dependency에서의 차이 (Maven pom🍂 vs Gradle🐘)

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

예시 코드를 보겠습니다.


<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>

이 10줄 길이의 Dependency를 Spring Boot에서는

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.4.4</version>
</dependency>

Spring Framework에 비해 길이가 5줄로 줄어든 것을 확인할 수 있습니다😲

Gradle로 본다면?

    implementation 'org.springframework.boot:spring-boot-starter-web'

라이브러리를 가져오는 데 힘 쓸 필요 없도록 가독성 좋게 표현할 수 있습니다.
build.gradle 파일에 저 한 줄을 추가하면 위의 10줄에서 가져올 Dependency를 한꺼번에 가져올 수 있습니다. 또한 자동으로 관리까지 해주죠.

2. Configuration 방식

Spring Framework의 경우에는 위 Dependency와 마찬가지로 설정할 때 짜야 할 코드가 길고, 관련 Annotation 및 Bean을 등록해야 합니다.

반면에, Spring Boot는 application.properties 파일이나 application.yml 파일에서 설정하면 끝입니다.

예시로, Thymeleaf🍃를 사용했을 때를 비교해보겠습니다.

Spring Framework

@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

Maven pom🍂

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Gradle🐘

    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

가독성 면에서 쉽게 차이가 남을 알 수 있습니다.

Spring Boot의 강력한 Auto Configuration

또한, Spring Boot에는 Auto Configuration이라는 특징이 있습니다.

Main Method

Spring Boot 프로젝트를 생성하면 맨 처음 보이는 main() 입니다.

@SpringBootApplication라는 어노테이션 덕분에 많은 외부 라이브러리를 가져올 수 있고, Tomcat 서버를 내장된 채로 실행시킬 수 있습니다.

@SpringBootApplication을 더 들어가보면

SpringBootApplication

이렇게 미리 설정되어있는 코드들을 볼 수 있습니다.
몇 가지 어노테이션을 살펴보겠습니다.

@ComponentScan

이 어노테이션은 @Component, @Controller, @Repository, @Service 라는 어노테이션이 붙어있는 객체를 스캔해 자동으로 Bean에 등록합니다.

@EnableAutoConfiguration

이 어노테이션은 @ComponentScan 이후 미리 정의한 라이브러리들을 Bean에 등록합니다.

미리 정의한 라이브러리들은 다음 경로에서 확인할 수 있습니다.

IntelliJ IDEA

Spring Tool Suite(Eclipse)


그 중에서 spring.factories 파일을 살펴보겠습니다.

EnableAutoConfiguration을 Key로 하는 외부 의존성들을 확인할 수 있습니다. 이 의존성들을 모두 스캔하여 상황에 맞게 주입합니다.

3. Server의 내장 여부 & 배포 방식

Spring Framework

Spring Framework로 개발한 애플리케이션의 경우 WAR(Web application ARchive)파일로 배포할 수 있습니다. 하지만, 웹 애플리케이션이 압축된 WAR파일과
이 WAR 파일의 프로그램을 실행하기 위해 설정한 WAS가 필요합니다.

Spring Boot

Spring Boot의 경우에는 Tomcat이나 Jetty 같은 내장 WAS를 가지고 있으므로 독립적으로 실행할 수 있는 JAR 파일만으로 간편하게 배포할 수 있습니다.
Tomcat과 같은 서버를 내장하면서, Servlet Container에 종속되던 WebApplication이 역으로 WebApplication에 Servlet Container가 종속될 수 있도록 해줍니다.

개인적으로 Spring MVC에서 Tomcat 서버 설치 후 실행시키고, Java 코드 바뀔 때마다 Restart 하는 그 번거로움을 겪다가, Spring Boot에서 시작만 누르면 알아서 애플리케이션을 실행시켜주는 그 감동을 잊을 수 없었습니다(?)


마치면서

점점 많은 곳에서 Spring Framework(Spring MVC)보다 Spring Boot를 사용하고 있습니다.

관련 설문 조사에서도 2017년까지는 Spring MVC의 비중이 높았지만, 시간이 지날수록 Spring Boot의 더 발전된 특징에 비율이 바뀌고 있다고 합니다.

그러면 Spring Boot가 좋으니까 Boot로 모든 기업이 바꾸면 되지 않나?

그것도 아닌 것이, 각 기업마다의 상황이 있습니다.
Spring Boot에서도 알아서 다 해주지만, Spring Framework에서 일일이 설정해야 하는 상황이 있을 수 있습니다. 굳이 이런 설정은 필요 없는데 해주면 그것도 나름대로 부담이 될 수 있습니다.

또한, 처음 배우는 스프링 부트 2라는 책의 리뷰에서는

기존 스프링 환경을 사용하시는 분들께서 스프링 부트로 넘어가지 않는 이유로 2가지를 얘기합니다. 하나는 대규모 트래픽에서 버틸 수 있는가 하는 것이고, 다른 하나는 내가 모르는 설정이 되어 있는 것 아닌지 불안하다는 겁니다.
-- 前 우아한형제들 서버 개발자 이동욱님

이런 말이 있을 정도로 장점만 보고 바로 Migration을 하지 않는 이유가 있습니다.

웬만해서는 Spring Boot를 사용하겠지만, 혹여 특수한 상황이 발생했을 때는 이 점을 상기하면서 다시 고려하면 좋을 듯합니다.


References

만약 혼동되거나 틀린 내용이 있다면 지적해주시면 감사드리겠습니다 🙇‍♂️

profile
만 가지 발차기를 한 번씩 연습하는 사람은 두렵지 않다. 내가 두려워 하는 사람은 한 가지 발차기를 만 번씩 연습하는 사람이다. - Bruce Lee

0개의 댓글