Spring Framework
- 엔터프라이즈 급 애플리케이션을 만들기 위한 모든 기능을 종합적으로 제공하는 경량화 된 솔루션
- JEE(Java Enterprise Edition)가 제공하는 다수의 기능을 지원하고 있기 때문에, JEE를 대체하는 프레임워크로 자리잡았다.
- 스프링의 핵심 기능은 DI(Dependency Injection), AOP(Aspect Oriented Programming)이다.
- 스프링은 개발자가 복잡하고 실수하기 쉬운 Low level에 신경 쓰지 않고 비즈니스 로직개발에만 전념할 수 있도록 도와주는 도구라고 생각하면 쉽다.
Enterprise Application 개발 시 복잡함을 해결해주는 핵심
- POJO(Plain Old Java Object)
- 특정 환경이나 기술에 종속적이지 않은 객체
- 테스트하기 용이하며, 객체지향 설계에 자유롭게 적용가능
- PSA(Portable Service Abstraction)
- 환경이나 세부기술의 변경과 관계없이 일관된 방식으로 기술에 접근할 수 있게 만들어주는 설게 원칙
- 기술적인 복잡함은 추상화를 통해 Low Level의 기술 구현 부분과 기술을 사용하는 인터페이스로 분리
- ex) DB에 관계없이 동일하게 적용할 수 있는 트랜잭션 처리방식
- Ioc/DI(Dependency Injection)
- 유연하게 확장 가능한 객체를 만들어 두고 객체 간의 의존관계는 외부에서 다이나믹하게 설정
- AOP(Aspect Oriented Programming)
- 관심사의 분리를 통해 소프트웨어의 모듈성 향상
- 공통 모듈을 여러 코드에 쉽게 적용가능
스프링의 특징
경량컨테이너
- 스프링은 자바객체를 담고 있는 컨테이너
- 스프링 컨테이너는 자바 객체의 생성과 소멸과 같은 라이프사이클을 관리
- 언제든지 컨테이너로부터 필요한 객체를 가져와 사용할 수 있도록 지원
DI 패턴 지원
- 스프링은 설정 파일이나, Annotation을 통해 객체간의 의존 관계를 설정 가능
- 따라서, 객체는 의존하고 있는 객체를 직접 생성하거나 검색할 필요가 없다.
AOP(관점 지향 프로그래밍) 지원
- AOP는 문제를 바라보는 관점을 기준으로 프로그래밍하는 기법
- 스프링은 자체적으로 프록시 기반의 AOP를 지원하므로 트랜잭션이나, 로깅, 보안과 같이 여러 모듈에서 공통으로 필요로 하지만 실제 모듈의 핵심이 아닌 기능들을 분리해 각 모듈에 적용이 가능
POJO 지원
- 특정 인터페이스를 구현하거나 클래스를 상속하지 않는 일반 자바 객체지원
- 스프링 컨테이너에 저장되는 자바객체는 특정한 인터페이스를 구현하거나, 클래스 상속이 없이도 사용이 가능
IoC(Inversion of Control)
- IoC는 스프링의 핵심 기능
- 자바의 객체 생성 및 의존관계에 있어 모든 제어권은 개발자에게 있었으나, Servlet과 EJB가 나타나면서 기존의 제어권이 Servlet Container 및 EJB Container에게 넘어가게 되었다.
- 모든 객체의 제어권이 넘어간 것은 아니고 Servlet, EJB에 대한 제어권을 제외한 나머지 객체 제어권은 개발자에게 있다.