Spring

엔터프라이즈 Java 어플리케이션을 위한 가장 많이 사용되는 프레임워크입니다. 사실 스프링은 J2EE 개발을 더 쉽게 할 수 있는 단순하고 가벼운 대안으로 시작되었습니다. 그렇다면 스프링을 사용하면 어떤 이점이 있는지 알아보겠습니다.

  • Java POJO(Plain Old Java Object)를 사용하므로 J2EE 이전 버전의 헤비급 EJB에 비해 엔터프라이즈급 어플리케이션을 훨씬 간단하게 구출할 수 있습니다.
    • POJO는 Java 언어 사양에 의해 강제된 것 이외의 제한 사항에 구속되지 않는 Java 개체입니다. 따라서 POJO는 프레임워크에서 미리 지정된 클래스를 확장하거나 미리 지정된 인터페이스를 구현할 필요가 없습니다.
  • DI(Dependency Injection)을 이용하여 느슨한 결합을 촉진합니다. 따라서 객체의 종속성을 하드코딩하는 대신 간단한 configuration 파일 변경을 통해 종속성을 지정하기만 하면 됩니다. 
  • AOP(Aspect Oriented Programming)를 사용합니다. 이를 통해 비즈니스 로직에서 공통 관심 사항을 핵심 관심사항으로부터 분리시켜 핵심 로직을 깔끔하게 유지할 수 있습니다. 그에 따라 코드의 가독성, 유지보수성 등을 높일 수 있습니다.
  • Boilerplate Java code를 최소화시켜줍니다. Boilerplate 코드를 피하기위한 헬퍼 패키지와 클래스 컬렉션이 있으며 필요한 클래스에 대해서만 걱정하고 나머지는 무시할 수 있습니다.
  • 여러 ORM 프로임워크, 로깅 프레임워크, JEE, Quartz 등과 같은 기존 기술을 이용할 수 있습니다.
  • 스프링 프레임워크 핵심 기능은 자바 애플리케이션 개발에 사용될 수 있지만, 자바 EE 플랫폼 위에 웹 애플리케이션을 구축하기 위한 확장 기능이 있습니다.

이제 Spring의 핵심에 해당하는 몇가지 개념을 살펴보겠습니다.

Dependency Injection

IoC(Inversion of Control) 는 시스템의 제어 흐름을 반전시키는 설계 원칙입니다. 의존성 주입이 구체적인 예인 일반적인 개념입니다.

Spring IoC Container는 객체의 종속성을 생성, 관리 및 주입합니다.

종속성 주입은 객체를 종속성과 분리하므로 런타임 중에 주입할 종속성을 결정할 수 있습니다. 이런 결정은 코드를 수정하는 대신 Bean Configuration 파일에 의해 정할 수 있습니다.

public class App {
    private Service service;
    
    // Spring IoC container가 Service 객체를 주입해줍니다.
    public App (Service service) {
        this.service = service;
    }
}

그리고 DI의 이점은 App 클래스를 전혀 변경하지 않고도 Service의 기능을 대체하고 확장할 수 있다는 것입니다.

 

AOP

이를 통해 비즈니스 로직에서 공통 관심 사항을 핵심 관심사항으로부터 분리시켜 핵심 로직을 깔끔하게 유지할 수 있습니다. 예를들어 모든 어플리케이션에서 특정 보안을 고려해야 하는 경우 어떻게 해야할까요? 특히 이 보안 고려 사항이 여러 측면에서 사용되는 경우 더 많은 노력이 필요합니다.

따라서 AOP는 "측면(Aspect)"이라고 하는 독립형 모듈에서 교차 절단 문제를 표현할 수 있도록 하여 이 문제를 해결하고자 합니다.

예를 들어, 보안 모듈 "aspect"는 보안 검사를 수행하는 "advice"(실제로 실행될 코드)와 해당 모듈에서 언제 실행할지 때를 정의하는 "join point"를 뜻합니다.

 

Spring Architecture

Spring은 필요한 모듈에 대해서만 걱정하고 나머지는 무시할 수 있는 모듈 방식으로 구성됩니다.

모듈식 프로그래밍
프로그램의 기능을 각각 하나의 특정 기능을 포함하는 독립 모듈로 분리하는 소프트웨어 설계 기술입니다.

모듈성 vs AOP
OOP에서 모듈성의 핵심 단위는 클래스인 반면 AOP에서는 모듈성의 단위가 Aspect입니다.

스프링 프레임워크는 약 20개의 모듈을 제공합니다. 모든 모듈은 코어 컨테이너 위에 구축됩니다. 이러한 모듈은 개발자가 엔터프라이즈 어플리케이션 개발에 사용하는 데 필요할 수 있는 모든 것을 제공합니다.

Core Container

  • CoreBeans 모듈은 IoC 및 DI 기능을 포함하여 프레임워크의 기본 부분을 제공합니다.
  • Bean 모듈은 Factory pattern으로 구현된 BeanFactory를 제공합니다. 실제 프로그램 로직에서 종속성의 구성 및 사양을 분리합니다.
  • Context 모듈은 Core 와 Beans 모듈을 기반으로 구축됩니다. 정의되고 구성된 모든 객체에 액세스할 수 있습니다.
  • SpEL 모듈 은 런타임 동안 객체를 쿼리하고 조작하기 위한 강력한 인터페이스를 제공합니다.
Context Module은 BeanFactory를 확장하고 어플리케이션 라이프사이클 이벤트 및 유효성 검사에 대한 지원을 추가합니다. JNDI 액세스, EJB 통합과 같은 많은 엔터프라이즈 서비스를 가능하게 하며, 다른 프레임워크와의 손쉬운 통합도 용이하게 합니다.

 

Data Access/Integration

데이터베이스와 통신하는데 사용됩니다.

  • JDBC : 데이터베이스에 접속할 수 있도록 하는 자바 API입니다.
  • ORM : JPA, DFO, Hibernate, MyBatis를 포함하여 널리 사용되는 API에 대한 통합 계층을 제공합니다.
  • OXM : 객체/XML 매핑 구현을 지원하는 추상화 계층을 제공합니다.
  • JMS(Java Messaging Service) : 메세지를 생성하고 사용하기 위한 기능이 포함되어 있습니다.
  • Transactions : 클래스에 대한 트랜잭션 관리를 지원합니다.

 

Web Module

Spring MVC 프레임워크의 메인 기술입니다. 다른 기술들과 통합하여 사용할 수 있습니다.

  • Web : 파일 업로드 기능, 서블릿 리스너, 웹 어플리케이션 컨텍스트를 사용한 IoC 컨테이너 초기화와 같은 기본적인 웹 지향 통합 기능을 제공합니다.
  • Web-MVC : 웹 어플리케이션을 위한 Spring의 MVC 및 Rest 웹 서비스 구현이 포함되어 있습니다.
  • Web-Sockets : 웹 어플리케이션에서 클라이언트와 서버 간의 WebSocket 기반 양방향 통신을 지원합니다.
  • Web-Portlet : 포틀릿 환경에서 사용할 MVC 구현을 제공하고 Web-MVC 모듈 기능을 미러링합니다.

 

AOP / Instrumentation

  • AOP : Aspect 지향 프로그래밍 구현을 제공하여 비즈니스 로직에서 관심사를 분리할 수 있도록 합니다.
  • Aspect : AspectJ와의 통합을 제공하는 별도의 모듈입니다.
  • Instrumentation : 클래스 진단 지원 및 클래스 로더 구현에 대한 지원을 제공합니다.

 

Messaging

메세징 기반 응용 프로그램의 기반 역할을 합니다. 비동기 메세징 시스템의 기능을 제공하고 메세지를 교환하기 위해 WebSocket에서 사용할 STOMP(Simple Text Oriented Messaging Protocol)를 지원합니다.

 

Test

JUnit을 사용하여 Spring 구성 요소의 단위 테스트와 통합 테스트를 지원합니다. 또한 코드를 별도로 테스트하는데 사용할 수 있는 Mock Objects를 제공합니다.