본문 바로가기
Backend/Spring

[Spring] Spring VS Spring Boot 차이점

by 볼링치는 개발자 2021. 5. 21.
반응형

Spring Framework

Spring은 Java 기반의 오픈소스 Back-end 프레임워크입니다.

 

다음은 Spring 공식 문서의 일부분으로 Spring이 왜 Spring으로 불리는지 설명한 부분입니다.

Whatever happened next, the framework needed a name. In the book it was referred to as the “Interface21 framework” (at that point it used com.interface21 package names), but that was not a name to inspire a community. Fortunately Yann stepped up with a suggestion: “Spring”. His reasoning was association with nature (having noticed that I'd trekked to Everest Base Camp in 2000); and the fact that Spring represented a fresh start after the “winter” of traditional J2EE. We recognized the simplicity and elegance of this name, and quickly agreed on it.

위 내용은, Spring은 봄으로, 개발자에게 겨울은 끝나고 봄이 왔다 라는 내용입니다. 


Spring Framework의 특징

Spring 프레임워크의 대표적인 특징은 다음과 같습니다.

DI(Dependency Injection)

DI란 개발자가 Spring 프레임워크에 의존성을 주입하면서 객체 간 결합을 느슨하게 하는 것입니다.

객체 간 결합이 느슨하면 코드의 재사용성이 증가하고, 단위 테스트가 용이해집니다.

IoC(Invesion of Control)

IoC는 컨트롤의 제어권이 개발자에게 있는 것이 아닌 프레임워크가 대신해서 해주는 것을 말합니다. Servlet이나 Bean 같은 코드를 개발자가 직접 작성하지 않고, 프레임워크가 대신 수행합니다.

제어의 역전이라는 말이 어려울 수 있는데, 기존에는 자바 코드를 작성할 때 객체의 생성, 의존관계 설정 등을 개발자가 해줘야 했지만, 프레임워크가 대신해준다는 의미입니다.

AOP(Aspect Oriented Programming)

AOP는 핵심기능을 제외한 부수적인 기능을 프레임워크가 제공하는 특징입니다. 예를 들어 Spring 프로젝트에 security를 적용하거나, logging 등을 추가하고 싶을 때 기존 비즈니스 로직을 건들지 않고 AOP로 추가할 수 있습니다.

중복 코드 제거

예를 들어 JDBC 같은 템플릿을 사용할 때 중복되는 코드도 많고 복잡합니다. 이를 모두 제거합니다.

다른 프레임워크와의 통합

JUnit, Mockito와 같은 유닛 테스트 프레임워크와 통합이 간단합니다. 이를 통해 개발하는 프로그램의 품질이 향상됩니다.

 


Spring Boot Framework와 Spring Framework의 차이점

다음은 Spring Boot 공식문서의 인용문입니다.

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

이를 해석하면 다음과 같습니다.

스프링 부트는 단독적이고, 상용화 수준의, 스프링 기반 애플리케이션을 단지 실행할 수 있을 정도로 쉽게 만들 수 있다.

첫 번째 차이점, Dependency

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

다음 예시는 Spring Framework에서 web에 대한 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>

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

Spring Boot Framework의 경우 dependency를 Spring Framework보다 쉽게 설정해 줄 수 있습니다. 버전 관리도 자동으로 해줍니다.

다음 예시는 Spring Boot Framework에서 web에 대한 dependency를 추가하는 코드입니다.

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

빌드 툴을 Gradle을 사용하는 경우 위와 같이 build.gradle파일에 dependency를 추가해주면 Spring Boot로 웹 개발을 할 때 필요한 모든 dependency를 자동으로 추가하고 관리해줍니다.

 

또 다른 예시로는 Spring Framework의 경우 test프레임워크를 사용하고자 하는 경우 Spring Test, JUnit, Hamcrest, Mockito 등 모든 라이브러리를 추가해줘야 하지만, Spring Boot에서는 spring-boot-starter-test 만 추가해주면 됩니다.


두 번째 차이점, Configuration

Spring Framework의 경우 configuration설정을 할 때도 매우 길고, 모든 어노테이션 및 빈 등록 등을 설정해 줘야 합니다.

Spring Boot Framework는 application.properties파일이나 application.yml파일에 설정하면 됩니다.

 

예를 들어 Spring Framework에서 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);
    }
}

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

Spring Boot Framework에서 Thymeleaft을 사용하려면 다음과 같은 코드를 작성해야 합니다.

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

눈으로 보기만 해도 확연한 차이를 확인할 수 있습니다.

 

Spring Boot의 강력한 AutoConfiguration

Spring Frame와 달리 Spring Boot에는 AutoConfiguration이라는 것이 있습니다.

Spring Boot로 실행할 수 있는 애플리케이션을 만들기 시작하면 클래스에 @SpringBootApplication이라는 어노테이션을 확인할 수 있습니다.

이 어노테이션을 제거하고 프로그램을 실행하면, 일반적인 자바 프로그램과 동일하게 실행됩니다.

해당 어노테이션 덕분에 많은 외부 라이브러리, 내장 톰캣 서버 등이 실행될 수 있습니다.

어노테이션: 주석, 추후 특정 어노테이션을 처리하는 컴파일러가 어노테이션을 읽으면 알맞은 처리를 진행.
기능이 포함된 건 아니고, 프로그램 곳곳에 분산된 기능을 한 곳에 모아서 처리하고 싶을 때 사용하기도 함.

@SpringBootApplication을 자세히 들여다보면 다음과 같은 코드를 확인할 수 있습니다.

@ComponentScan

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

 

@EnableAutoConfiguration

@ComponentScan 이후 사전에 정의한 라이브러리들을 Bean에 등록해줍니다.

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

하지만 사전에 정의한 라이브러리라고 전부 Bean에 등록되진 않습니다.

External Libraries -> spring-boot-autoconfigure -> META_INF -> spring.factories

spring.factories파일을 보면 다음을 확인할 수 있습니다.

EnableAutoConfiguration을 키로 하는 외부 의존성들을 확인할 수 있습니다. 이 의존성들을 모드 스캔하며 조건에 따라 의존성을 주입해 줍니다.


세 번째 차이점, 편리한 배포

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

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

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

 

결론

결론 적으로 Spring Framework는 기존에 EJB를 대신해 자바 애플리케이션을 더 쉽게 만들 수 있게 해 주고, Spring Boot Framework는 Spring Framework보다 개발자가 더더욱 개발에만 집중할 수 있도록 도와주는 프레임워크입니다.

반응형

댓글