Spring Framework

스프링 프레임워크 의 가장 중요한 특징은 의존성 주입(Dependency Injection) 이다. 모든 스프링 모듈들의 핵심에는 의존성 주입 이나 IOC(Inversion of Control) 가 있다.

이것이 중요한 이유는 DI나 IOC를 적절히 사용하면 우리는 느슨하게 결합된 애플리케이션들을 개발할 수 있기 때문이다. 또한 느슨하게 결합된 애플리케이션들은 단위테스트를 하기가 쉽다.

간단한 예시…

의존성 주입이 없는 예제

아래의 예제를 보면, WelcomeController 는 welcome 메시지를 얻기위해 WelcomeService 에 의존적이다. 그러면 WelcomeService 인스턴스를 얻기 위해서는 어떤 작업을 진행할까?

WelcomeService service = new WelcomeService();

그것은 WelcomeService 의 인스턴스를 생성하는 것이며, 그것은 그것들이 강하게 결합된다는 것을 의미한다. 예를들어 우리가 WelcomeController 의 단위테스트에서 WelcomeService 에 대한 목(mock)을 생성한다면, 우리는 어떻게 WelcomeController 가 목을 사용하도록 할 수 있을까? 결코 쉽지 않다.

의존성 주입을 이용한 예제

의존성 주입을 이용하면 훨씬 더 단순해 보인다. 우리는 단지 2개의 간단한 애너테이션인 @Component, @Autowired를 사용한다.

아래의 예제에서 스프링 프레임워크는 WelcomeService 인스턴스를 생성하고 WelcomeController 내에 @autowired 가 선언된 곳에 주입한다.

단위테스트시 우리는 스프링 프레임워크에게 WelcomeService 의 목을 WelcomeController 안으로 알아서 주입해 달라고 요청할 수 있다. (스프링 부트는 @MockBean 을 사용해서 이러한 작업을 쉽게 할 수 있도록 해줄 수 있다.)

@Component
public class WelcomeService {
    ...
}

@RestController
public class WelcomeController {
    @Autowired
    private WelcomeService service;
    @RequestMapping("/welcome")
    public String welcome() {
        return service.retrieveWelcomeMessage();
    }
}

그밖에 스프링 프레임워크가 해결하는 것은 무엇이 있을까?

1. Duplication & Plumbing Code

스프링 프레임워크는 의존성 주입만 할까? 그렇지 않다 다음과 같은 많은 스프링 모듈들을 이용해서 의존성 주입의 핵심을 구성한다.

  • Spring JDBC
  • Spring MVC
  • Spring AOP
  • Spring ORM
  • Spring JMS(Java Message Service)
  • Spring Test

Spring JMS와 Spring JDBC를 생각해 보자. 이 모듈들이 어떤 새로운 기능을 제공하는 걸까? No!! 우리는 J2EE 나 Java EE 를 이용해서 이 모듈들이 제공하는 모든 기능들을 사용할 수 있다. 그렇다면 이 모듈들이 제공하는 것은 무엇일까? 이 모듈들은 단순한 추상(abstraction) 을 제공하는데 이 추상들의 목적은 다음과 같다.

  • 반복 코드나 중복코드를 줄임
  • 디커플링(Coupling: 결합도)을 높이고 단위 테스트성을 증가시킨다.

예를들어 과거의 JDBC 나 JMS 에 비해서 JDBCTemplate 나 JMSTemplate 를 사용하면 훨씬 적은 코드를 작성해도 된다.

2. 다른 프레임워크들과의 좋은 통합

스프링 프레임워크가 하는 모든 것은 훌륭한 솔루션을 제공하는 프레임워크들을 훌륭하게 통합해 주는 일이다.

  • Hibernate for ORM
  • iBatis for Object Mapping
  • JUnit and Mockito for Unit Testing

Spring MVC

Spring MVC 프레임워크가 해결하는 핵심 문제는 무엇일까?

Spring MVC 프레임워크는 디커플된 웹 애플리케이션 개발 방법을 제공한다.

Dispatcher Servlet, ModelAndView, View Resolver 과 같은 단순개념을 이용해서 웹 애플리케이션 개발을 쉽게 할 수 있도록 해준다.

Spring Boot

스프링 기반 애플리케이션등은 많은 환경설정을 포함한다.

우리가 Spring MVC 를 사용할 때, 우리는 Component scan, Dispatcher Servlet, View Resolver, Web jar 들(정적 컨텐츠를 제공하기 위한) 를 설정해야 한다.

스프링 부트 는 클래스패스상에 사용가능한 프레임워크와 이미있는 환경설정을 바라본다. 이것들을 기반으로 스프링 부트는 애플리케이션을 이 프레임워크들과 함께 구성하는데 필요한 기본 환경설정을 제공한다. 이것을 “Auto Configuration” 이라고 부른다.

Spring Boot Starter 프로젝트 옵션들

Spring Boot Starter Web 에서 살펴보았듯이 스타터 프로젝트들은 특정 애플리케이션 개발을 빠르게 시작할 수 있도록 도와 준다.

  • spring-boot-starter-web-services: SOAP Web Services
  • spring-boot-starter-web: Web and RESTful applications
  • spring-boot-starter-test: Unit testing and Integration Testing
  • spring-boot-starter-jdbc: Traditional JDBC
  • spring-boot-starter-hateoas: Add HATEOAS features to your services
  • spring-boot-starter-security: Authentication and Authorization using Spring Security
  • spring-boot-starter-data-jpa: Spring Data JPA with Hibernate
  • spring-boot-starter-cache: Enabling Spring Framework’s caching support
  • spring-boot-starter-data-rest: Expose Simple REST Services using Spring Data REST

Spring Boot 의 다른 목표

개발이나 유지보수에 도움을 주는 몇가지 스타터들이 있는데 다음과 같다.

  • spring-boot-starter-actuator: 여러분의 애플리케이션 추적하거나 모니터링하는 등의 기능을 사용할 수 있도록 한다.
  • spring-boot-starter-undertow, spring-boot-starter-jetty, spring-boot-starter-tomcat: 내장된 서블릿 컨테이너를 선택할 수 있도록 해준다.
  • spring-boot-starter-logging: logback 을 사용해서 로깅할 수 있도록 해준다.
  • spring-boot-starter-log4j2: Log4j2 를 사용해서 로깅할 수 있도록 해준다. 스프링부트는 빠른시간에 애플리케이션이 제품이 될 수 있도록 하는 것을 목표로 한다.
  • Actuator: 애플리케이션을 고수준에서 모니터링하고 추적 할 수 있도록 해준다.
  • Embedded Server Integrations: 서버가 애플리케이션에 통합되기 때문에 우리는 서버에 설치되는 별도의 애플리케이션 서버를 가질 필요가 없다.
  • Default Error Handling

결론

Spring MVC 는 말 그대로 MVC 구현을 할 수 있도록 지원해주는 스프링 프레임워크 이다.

Spring Boot 는 Spring에서 제공하는 많은 라이브러리들을 기본 설정 값으로 자동 으로 설정할 수 있도록 해준다. 따라서, Spring Boot는 Spring MVC를 편하게 사용할 수 있도록 해준다는 것 이다.

또한, Spring Boot 는 SpringMVC, Jackson, Validation 등 다양한 종속성들을 각각 패키지해 놓은 것을 함께 가져오기 때문에 개발자들은 이것들의 호환버전에 대해 걱정할 필요가 없다.

Spring MVC와 Spring Boot는 서로의 역할이 전혀 다르기 떄문에 비교 대상이 될 수 없다…

참고문서