본문 바로가기

Language/Spring

Spring Framework와 Spring Boot Framework

Spring Framework란?

  • Java 기반의 오픈소스 Backend 프레임워크
  • 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션
    → 엔터프라이즈 : 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로부터 행해지는 매우 큰 규모의 환경

 

Spring Framework의 특징

DI(Dependency Injection)

  • 개발자가 Spring 프레임워크에 의존성을 주입하면서 객체 간 결합을 느슨하게 하는 것
  • 객체 간 결합이 느슨하면 코드의 재사용성 증가, 단위 테스트가 용이

IoC(Invesion of Control)

  • 컨트롤의 제어권이 개발자에게 있는 것이 아닌 프레임워크가 대신해서 해주는 것을 의미
  • Servlet이나 Bean 같은 코드를 개발자가 직접 작성하지 않고 프레임워크가 대신 수행
  • 제어의 역전이라는 말이 어려울 수 있는데 기존에는 자바 코드를 작성할 때 객체의 생성, 의존관계 설정 등을 개발자가 해줘야 했지만 프레임워크가 대신 해준다는 의미

AOP(Aspect Oriented Programming)

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

 

중복 코드 제거

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

 

다른 프레임워크와의 통합

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

Spring Framework vs Spring Boot Framework

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

 

  • 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 만 추가

2. 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);
    }
}
  • Spring Boot Framework에서 Thymeleaf를 사용하려면 다음과 같은 코드를 작성
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf

3. Spring Boot의 강력한 AutoConfiguration

  • Spring Framework와 달리 Spring Boot에는 AutoConfiguration이라는 것이 존재
  • Spring Boot로 실행할 수 있는 애플리케이션을 만들기 시작하면 클래스에 @SpringBootApplication 어노테이션을 확인 가능
  • 이 어노테이션을 제거하고 프로그램을 실행하면 일반적인 자바 프로그램과 동일하게 실행
  • 해당 어노테이션 덕분에 많은 외부 라이브러리, 내장 톰캣 서버 등이 실행 가능
    • 어노테이션 : 주석, 추후 특정 어노테이션을 처리하는 컴파일러가 어노테이션을 읽으면 알맞은 처리를 진행
    • 기능이 포함된 건 아니고 프로그램 곳곳에 분산된 기능을 한 곳에 모아서 처리하고 싶을 때 사용하기도 함

  • @SpringBootApplication 상세 내용

@ComponentScan

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

 

@EnableAutoConfiguration

  • @ComponentScan 이후 사전에 정의한 라이브러리들을 Bean에 등록
  • 사전에 정의한 라이브러리들은 다음 경로에서 확인 가능
    경로 : External Libraries → spring-boot-autoconfigure → META_INF → spring.factories
    단, 사전에 정의한 라이브러리라고 전부 Bean에 등록되지는 않음
  • spring.factories파일을 보면 다음을 확인 가능

  • EnableAutoConfiguration을 키로 하는 외부 의존성들을 확인 가능
  • 이 의존성들을 모두 스캔하며 조건에 따라 의존성을 주입

4. 편리한 배포

  • Spring Framework의 경우 war파일을 Web Application Server에 담아 배포
  • Spring Boot Framework의 경우 Tomcat 이나 Jetty 같은 내장 WAS를 가지고 있기 때문에 jar 파일로 간편하게 배포 가능
    • Spring Framework로 WAS를 정하고 모든 설정을 마치고 배포를 하는 것보다 훨씬 간단한 배포 방법

결론

  • Spring Framework기존에 EJB(Enterprise Java Bean)를 대신해 자바 애플리케이션을 더 쉽게 만들 수 있음
  • Spring Boot Framework는 Spring Framework보다 개발자가 더더욱 개발에만 집중할 수 있도록 도와주는 프레임워크