Spring이란 무엇일까?
위키백과에서 '자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크'라고 한다.
즉 JAVA로 만든 프레임워크의 일종이다.
스프링을 한마디로 정의하는 건 상당히 어려워서
스프링의 등장배경을 이해하고스프링의 특징과 스프링에서 제공하는 여러 모듈들을 배운 후
'XX 한 것들을 제공하면서 XX한 특징이 있는 JAVA로 만든 프레임워크다'
정도로 이해하면 될 것이다.
Spring 등장 배경
spring이 등장하기전 자바엔터프라이즈개발(기업환경의 애플리케이션을 만드는 개발)에서는
EJB가 사용되었다. EJB란 분산 애플리케이션을 지원하는 컴포넌트 기반의 객체다.
Servlet이 TOMCAT 같은 Servlet Container에 올려서
서비스 되는 것과 같이 EJB는 JBoss와 같은 EJB Container에 올려서 서비스된다.
엔터프라이즈개발이라하면 서버에서 동작하며 기업과 조직의 업무를 처리해주는 시스템을
만드는 것이라 할 수 있다. 이런 시스템을 만들려면
- 많은 사용자의 요청
- 보안
- 안전성
- 트랜잭션
등과 같은 엔터프라이즈 기술을 고려해야된다.
인터넷이 발전하면서 기업 내 모든 업무가 점점 엔터프라이즈 시스템을 적용하기 시작했다.
대표적으로 ERP같은 것들말이다.
모든 업무를 엔터프라이즈시스템,
즉 웹으로 만들려 하다보니 비즈니스 로직이 상당히 복잡해지게 되었다.
이제 개발자는 엔터프라이즈 기술뿐만 아니라
비즈니스 로직 2마리 토끼를 다 잡아야만 하게 되었다.
이런 2마리 토끼를 한번에 잡기는 힘들어서
따로 따로 개발할 수 있도록 하는 기술인 EJB가 등장했었다.
이 EJB는 비즈니스로직과 엔터프라이즈 기술을 분리해서
개발자는 비즈니스로직에만 집중할 수 있게 되었다.
처음에는 좋았다.
저런 엔터프라이즈 기술이 구현 된 클래스,인터페이스를 상속 받기만 해서
비즈니스로직에 집중할 수 있었다.
근데 EJB에서는 엔터프라이즈 기술 하나의 기능을 구현하기 위해
클래스 간 상속, 인터페이스 구현 등 각 클래스간의 의존도가 점점 커지게 되었다.
EJB초기에는 클래스간의 의존도가 그리 크지 않았지만,
여러기능들이 추가되면서
간단한 기능을 하는 클래스를 만들려고 해도
EJB환경에서 수많은 클래스를 상속받고 인터페이스의 구현체들을
만들어야 하는 상황이 오면서 배보다 배꼽이 커지는 상황이 생기게 되었다.
이런 상황에서 마틴파울러라는 개발자가
EJB방식(수많은 클래스와 인터페이스를 상속받는 방식)에 반발해
특정 자바 모델이나 기능, 프레임워크 등을 따르지 않는 JAVA객체
사용을 권하기 위해 이 간단한 객체에 POJO라는 이름을 붙이게 되었다.
POJO는 Plain Old JAVA Object의 약자이다.
즉 EJB에서 수많은 클래스와 인터페이스를 상속받던
무거운 객체들의 반대개념으로 POJO가 등장하게 된 것이다.
이 때가 대략 2000년대이다.
그리고 2002년 로드존슨이 POJO방식으로도
엔터프라이즈개발을 할 수 있다고 주장하는 책을 발매했다.
30,000라인의 예제 코드에는 현재 스프링의 핵심 개념과 기반 코드인
BeanFactory, ApplicationContext, POJO, IoC(제어의 역전) , DI(의존성 주입)등 이 포함되었다.
로드 존슨의 책 출간 직후 유겐 휠러(Juergen Hoeller)와 Yann Caroff(얀 카로프)가
오픈소스 프로젝트를 제안,
이렇게 만들어진 오픈소스 프로젝트가 Spring이라고 불리게 된다.
지금까지도 Spring의핵심 코드는 유겐 휠러가 개발하고 있다.
스프링의 모듈은 다음과 같이 구성되어있다.
스프링 모듈은 필요할 때 필요한 기능만 사용하기 때문에 경량 컨테이너이다.
우리는 이 모듈중에서 필요한 것들만 가져와서 웹 프로젝트를 만들면 된다.
Spring 주요 특징
1. IoC(Inversion of Control, 제어 반전)
- 이는 Spring만이 아닌 프레임워크의 일반적인 특징이다.
코드의 실행에 대한 제어권이 개발자가 아닌 프레임워크에
있으며 프레임워크가 개발자의 코드를 호출한다.
2. DI(Dependency Injection, 의존성 주입)
- 프로그래밍에서 구성요소 간의 의존 관계가 소스코드 내부가 아닌
외부의 설정파일을 통해 정의되는 방식이다.
- 코드 재사용을 높여 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있으며
모듈간의 결합도도 낮출 수 있다.
3. AOP(Aspect Object Programming, 관점 지향 프로그래밍)
- 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는
기능을 분리하여 관리 할 수 있다.
- 여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을
높여주는 프로그래밍 기법이다.
4. POJO(Plain Old Java Object) 방식
- POJO는 Java EE를 사용하면서 해당 플랫폼에 종속되어 있는 무거운
객체들을 만드는 것에 반발하여 나타난 용어이다.
- 별도의 프레임 워크 없이 Java EE를 사용할 때에 비해 인터페이스를
직접 구현하거나 상속받을 필요가 없어 기존 라이브러리를 지원하기 용이하고, 객체가 가볍다.