Spring Framework
- 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크
- 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스 제공
- 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술
- Spring
Spring 특징
- DI(Dependency Injection)
- 의존성 주입
- 설정 파일이나 어노테이션을 통해 객체간의 의존 관계를 설정하여 개발자가 직접 의존하는 객체를 생성할 필요가 없다.
- Spring AOP
- Aspect Oriented Programming
- 관점 지향 프로그래밍
- 트랜잭션, 로깅, 보안 등 여러 모듈, 여러 계층에서 공통으로 필요로 하는 기능의 경우 해당 기능들을 분리하여 관리한다.
- POJO
- Plain Old Java Object
- 일반적인 J2EE 프레임워크에 비해 특정 라이브러리를 사용할 필요가 없어 개발이 쉬우며, 기존 라이브러리의 지원이 용이하다.
- IOC
- Inversion of Control
- 제어 반전
- 컨트롤의 제어권이 개발자가 아니라 프레임워크에 있다는 뜻으로 객체의 생성부터 모든 생명주기의 관리까지 프레임워크가 주도하고 있다. 객체를 생성하고, 직접 호출하는 프로그램이 아니라, 만들어둔 자원을 호출해서 사용한다.
- Spring JDBC
- Mybatis나 Hibernate 등의 데이터베이스를 처리하는 영속성 프레임워크와 연결할 수 있는 인터페이스를 제공한다.
- Spring MVC
- MVC 디자인 패턴을 통해 웹 어플리케이션의 Model, View, Controller 사이의 의존 관계를 DI 컨테이너에서 관리하여 개발자가 아닌 서버가 객체들을 관리하는 웹 애플리케이션을 구축 할 수 있다.
- PSA
- Portable Service Abstraction
- 스프링은 다른 여러 모듈을 사용함에 있어 별도의 추상화 레이어를 제공한다. 예를 들어 JPA를 사용할 때에서 Spring JPA를 사용하여 추상화하므로 실제 구현에 있어서 Hibernate를 사용하든 EclipseLink를 사용하든 개발자는 이 모듈의 의존 없이 프로그램에 집중할 수 있다.
Spring의 구성 모듈
- Data 접근 계층
- JDBC나 데이터베이스에 연결하는 모듈
- Data 트랜잭션에 해당하는 기능을 담당하여 영속성 프레임워크의 연결을 담당
- Web 계층 (MVC / Remoting)
- Spring Framework에서 Servlet, Struts 등 웹 구현 기술과의 연결점을 Spring MVC 구성으로 지원하기 위해 제공되는 모듈 계층
- 스프링의 리모팅 기술로 RMI, Hessian, Burlap, JAX-WS, HTTP 호출자 그리고 REST API 모듈 제공
- AOP 계층
- Spring에서 각 흐름 간 공통된 코드를 한 쪽으로 빼내어 필요한 시점에 해당 코드를 첨부하게 하기 위해 지원하는 계층
- 별도의 proxy를 두어 동작
- 이를 통해 객체간의 결합도를 낮출 수 있다.
- Core Container
- Spring의 핵심 부분
- 모든 스프링 관련 모듈은 이 Core Container 기반으로 구축
- Spring의 근간이 되는 IoC(또는 DI) 기능을 지원하는 영역을 담당
- BeanFactory를 기반으로 Bean 클래스들을 제어할 수 있는 기능을 지원
Spring 모듈 정리
모듈명 |
내용 |
spring-beans |
스프링 컨테이너를 이용해서 객체를 생성하는 기본기능을 제공 |
spring-context |
객체생성, 라이프 사이클 처리, 스키마 확장 등의 기능을 제공 |
spring-aop |
AOP 기능을 제공 |
spring-web |
REST 클라이언트 데이터 변환 처리, 서블릿 필터, 파일 업로드 지원 등 웹 개발에 필요한 기반 기능을 제공 |
spring-webmvc |
스프링 기반의 MVC 프레임워크, 웹 애플리케이션을 개발하는데필요한 컨트롤러, 뷰 구현을 제공 |
spring-websocket |
스프링 MVC에서 웹 소켓 연동을 처리할 수 있도록 제공 |
spring-oxm |
XML과 자바 객체간의 매핑을 처리하기 위한 API 제공 |
spring-tx |
트랜잭션 처리를 위한 추상 레이어를 제공 |
spring-jdbc |
JDBC 프로그래밍을 보다 쉽게 할 수 있는 템플릿 제공 |
spring-orm |
Hibernate, JPA, Mybatis 등과의 연동을 지원 |
spring-jms |
JMS 서버와 메시지를 쉽게 주고 받을 수 있도록 하기 위한 템플릿 |
spring-context-support |
스케쥴링, 메일발송, 캐시연동, 벨로시티 등 부가 기능을 제공 |
Spring IoC
- Inversion of Control
- 제어 반전
- 프로그램을 구동하는데 필요한 객체에 대한 생성, 변경 등의 관리를 프로그램을 구동하는 컨테이너에서 직접 관리하는 것
- 스프링은 IoC 구조를 통해 구동 시 필요한 객체의 생성부터 생명주기까지 해당 객체에 대한 관리를 직접 수행
IoC 컨테이너
- 스프링에서 관리하는 객체를 ‘Bean(빈)’이라고 하고, 해당 빈들을 관리한다는 의미로 컨테이너를 ‘Bean Factory’라고 한다.
- 객체의 생명주기와 의존성을 관리한다.
- VO (DTO / POJO) 객체의 생성, 초기화, 소멸 등의 처리를 담당한다.
- 개발자가 직접 객체를 생성할 수 있지만 해당 권한을 컨테이너에 맡김으로써 소스 코드 구현의 시간을 단축할 수 있다.
IoC 컨테이너와 Bean 객체
Bean |
스프링이 IoC 방식으로 관리하는 Class.스프링이 직접 생성과 제어를 담당하는 객체 |
Bean Factory |
스프링의 IoC를 담당하는 핵심 컨테이너. Bean을 등록, 생성, 조회, 반환하는 기능을 담당 |
ApplicationContext |
BeanFactory를 확장한 IoC 컨테이너. Bean을 등록하고 관리하는 기능은 BeanFactory와 동일하지만 스프링이 제공하는 각종 부가 서비스를 추가로 제공 |
GenericXmlApplication Context |
ApplicationContext 를 구현한 Class. 일반적인 XML 형태의 문서를 읽어 컨테이너 역할을 수행 |
Configuration metadata 설정 메타 정보 |
ApplicationContext 또는 BeanFactory가 IoC를 적용하기 위해 사용하는 설정 정보. 설정 메타 정보는 IoC 컨테이너에 의해 관리되는 Bean 객체를생성하고 구성할 때 사용 |
Spring DI
- Dependency Injection
- 의존성 주입
- 사용하는 객체를 직접 생성하여 만드는 것이 아니라 컨테이너가 빈의 설정 정보를 읽어와 자동으로 해당 객체에 연결
- 이렇게 의존성을 주입 받게 되면 이후 해당 객체를 수정해야 할 상황이 발생했을 때 소스 코드의 수정 최소화 가능
- 장점
- 간결하고 단순한 코드 작성
- 각 객체 간의 종속 관계(결합도)를 해소 가능
- 결합도: 한 클래스에서 필드 객체를 생성할 때 발생하는 두 객체 간의 관계. 각 객체간의 내용이 수정될 경우 영향을 미치는 정도
Spring DI 종류
- Setter 메소드를 통한 의존성 주입
- 의존성을 주입 받는 Setter 메소드를 만들고, 이를 통해 의존성을 주입
- Setter 메소드를 통해 의존 관계가 있는 Bean을 주입하려면 property 태그를 사용
- 생성자를 통한 의존성 주입
- 필요한 의존성을 포함하는 클래스에 생성자를 만들고, 이를 통해 의존성을 주입
- Constructor를 통해 의존 관계가 있는 Bean을 주입하려면 constructor-arg 태그 사용
- 메소드를 통한 의존성 주입
- 의존성을 입력 받는 일반 메소드를 만들고 이를 통해 의존성을 주입