Spring Framework
SpringFramework의 구조
1) POjO(Plain Old Java Object) : 특정환경이나 기술에 종속적이지 않은 객체 지향 원리에 충실한 자바객체.
2) PSA(Portable Service Abstraction) : 환경과 세부기술의 변경과 관계없이 일관된 방식으로 기술에 접근할 수 있게 해주는 설계 원칙. 트랜잭션 추상화 등.
3) IoC/DI(Dependecy Injection) : DI는 유연하게 확장 가능한 객체를 만들어 두고 객체 간의 의존관계는 외부에서 다이나믹하게 설정
4) AOP(Aspect Oriendted Programming) : 관심사의 분리를 통해서 소프트웨어의 모듈성을 향상, 공통 모듈을 여러 코드에 쉽게 적용 가능.
특징
1. 경량 컨테이너
- 스프링은 자바객체를 담고 있는 컨테이너이다.
- 스프링 컨테이너는 이들 자바 객체의 생성과 소멸과 같은 라이프사이클을 관리한다.
- 언제든지 스프링 컨테이너로부터 필요한 객체를 가져와서 사용할 수 있다.
2. DI 패턴 지원
- 스프링은 설정 파일이나 어노테이션을 통해서 객체 간의 의존 관계를 설정할 수 있다.
- 따라서 객체는 의존하고 있는 객체를 직접 생성하거나 검색할 필요가 없다.
3. AOP 지원
- AOP는 문제를 바라보는 관점을 기준으로 프로그래밍하는 기법이다.
- 이는 문제를 해결하기 위한 핵심관심 사항과 전체에 적용되는 공통관심 사항을 기준으로 프로그래밍 함으로서 공통 모듈을 여러 코드에 쉽게 적용할 수 있도록 한다.
- 스프링은 자체적으로 프록시 기반의 AOP를 지원하므로 트랜잭션이나, 로깅, 보안과 같이 여러 모듈에서 공통적으로 필요로 하지만 실제 모듈의 핵심이 아닌 기능들을 분리하여 각 모듈에 적용이 가능하다.
4. POJO 지원
- 특정 인터페이스를 구현하거나 또는 클래스를 상속하지 않는 일반 자바 객체를 지원한다.
- 스프링 컨테이너에 저장되는 자바 객체는 특정한 인터페이스를 구현하거나, 클래스 상속 없이도 사용이 가능하다.
- 일반적인 자바 객체를 칭하기 위한 별칭 개념이다.
5. IoC
- IoC는 스프링이 갖고 있는 핵심적인 기능이다.
- 자바의 객체 생성 및 의존관계에 있어 모든 제어권은 개발자에게 있었다.
- servlet과 EJB가 나타나면서 기존의 제어권이 넘어갔다.
- 단, 모든 객체의 제어권이 넘어간 것은 아니고 servlet, EJB에 대한 제어권을 제외한 나머지 객체 제어권은 개발자들이 담당하고 있다.
- 스프링에서도 객체에 대한 생성과 생명주기를 관리할 수 있는 기능을 제공하고 있는데 이런 이유로 Spring container 호은 IoC container라고 부르기도 한다.
6. 스프링은 트랜잭션 처리를 위한 일관된 방법을 제공
- JDBC. JTA 또는 컨테이너가 제공하는 트렌잭션을 사용하든, 설정파일을 통해 트랜잭션 관련 정보를 입력하기 때문에 트랜잭션 구현에 상관없이 동일한 코드를 여러 환경에서 사용이 가능하다.
7. 스프링은 영속성과 관련된 다양한 API를 지원
- 스프링은 JDBC를 비롯하여 iBatis, MyBatis, Hibernate, JPA 등 DB처리를 위해 널리 사용되는 라이브러리와 연동을 지원하고 있다.
SpringFramework Module
Spring Core | Spring Framework의 핵심 기능을 제공 하며, Core 컨테이너의 주요 컴포넌트는 Bean Factory이다. |
Spring Context | Spring 컨테이너로 만든 것이 Spring core의 BeanFactory라면, Spring을 Framework로 만든 것은 Context module이며, 이 module은 국제화된 메시지, application 생명주기 이벤트 , 유효성 검증을 지원함으로써 BeanFactory의 개념을 확장을 한다. |
Spring AOP | 설정 관리 기능을 통해 AOP기능을 Spring Framework와 직접 통합시킨다. |
Spring DAO | Spring JDBC DAO 추상 레이어는 다른 데이터베이스 벤더들의 예외 핸들링과 오류 메시지를 관리하는 중요한 예외 계층을 제공한다. |
Spring ORM | Spring Framework는 여러 ORM Framework에 플러그인되어 Object Relational 툴을 제공한다. |
Spring Web | Web Context module은 application context module 상위에 구현되어 web기방 어플리케이션에 컨텍스ㅡ를 제공한다. |
Spring Web MVC | Spring framework 는 자체적으로 MVC 프레임워크를 제공하고 있으며 스프링만 사용해도 MVC기반의 웹 어플리케이션을 어렵지 않게 개발이 가능하다. |
IoC
- Dependency LookUp
- 컨테이너가 lookup context를 통해서 필요한 resource나 object를 얻는 방식
- lookup한 object를 필요한 타입으로 캐스팅해주어야 함
- naming exception을 처리하기 위한 로직이 필요,,
- Dependecy Injection
- Object에 lookup코드를 사용하지 않고 컨테이너가 직접 의존 구조를 Object에 설정할 수 있도록 지정해주는 방식
- Object가 컨테이너의 존재 여부를 알 필요가 없음
- lookup 관련된 코드들이 object 내에서 사라짐
- setter injection과 constructor injection
Container란?
- 객체의 생성, 사용, 소멸에 해당하는 라이프사이클을 담당
- 라이프사이클을 기본으로 애플리케이션 사용에 필요한 주요 기능을 제공
Container 기능
- 라이프사이클 관리
- dependecy 객체 제공
- thread 관리
- 기타 애플리케이션 실행에 필요한 환경
Container 필요성
- 비즈니스 로직 외에 부가적인 기능들에 대해서는 독립적으로 관리되도록 하기 위함
- 서비스 lookup이나 configuration에 대한 일광성을 갖기 위함
- 서비스 객체를 사용하기 위해 각각 factory 꼬는 singleton패턴을 직접 구현하지 않아도 됨.
- Ioc Container : BeanFactory, Application Context
Spring DI Contatiner
- Spring DI Container가 관리하는 객체를 빈(bean)이라고 하고 이 빈들의 생명주기를 관리하는 의미로 빈팩토리라고 한다.
- bean factory에 여러 가지 컨테이너 기능을 추가하여 application context라 한다.
<<interface>> BeanFactory
- bean을 등록, 생성, 조회, 반환 관리
- 일반적으로 beanfactory보다는 이를 확장한 applicationcontext를 사용
- getbean() 메소드가 정의되어 있음
<<interface>> applicationContext
- bean을 등록, 생성, 조회, 반환 관리
- Spring의 각종 부가 서비스를 추가로 제공
- spring이 제공하는 어플릴케이션 컨텍스트 구현 클래스는 여러가지 종류가 있음
IoC
- 객체간의 결합도를 떨어뜨릴 수 있음 (loose coupling) : 해당 클래스가 유지보수될 때 결합된 다른 클래스도 같이 유지보수
- factory를 통해 결합도를 낮춤 : 각 service를 새성하여 반환하는 factory 사용
Spring DI 용어 정리
- 빈 (bean)
1. 스프링이 IoC방식으로 관리하는 오브젝트를 말한다.
2. 스프링이 직접 그 생성과 제어를 담당하는 오브젝트만을 bean이라고 부른다.
- 빈 팩토리
1. 스프링이 IoC를 담당하는 핵심 컨테이너
2. bean을 등록, 생성, 조회, 반환하는 기능을 담당
3. 일반적으로 BeanFactory를 바로 사용하지 않고 이를 확장한 ApplicationContext를 이용한다.
- 애플리케이션 컨텍스트
1. BeanFactory를 확장한 IoC컨테이너
2. 빈을 등록하고 생성, 조회, 반환하는 기능을 담당
3. 스프링이 제공하는 각종 부가 서비스를 추가로 제공
빈 생성범위
- 싱글톤(Singleton) 빈
- 스프링 빈은 기본적으로 싱글톤으로 만들어짐
- 그러므로 컨테이너가 제공하는 모든 빈의 인스턴스는 항상 동일함
- 컨테이너가 항상 새로운 인스턴스를 반환하게 만들고 싶을 경우 scope를 prototype으로 설정해야 함
빈의 생성범위 지정
singleton | 스프링 컨테인당 하나의 인스턴스 빈만 생성 |
prototype | 컨테이너에 빈을 요청할 때마다 새로운 인스턴스 생성 |
request | HTTP Request별로 새로운 인슨턴스 생성 |
response | Http response 별로 새로운 인스턴스 생성 |
스프링 빈 설정: XML
- XML 문서 형태로 빈의 설정 메타 정보를 기술
- <bean>
:Annotaion
- 어플리케이션의 규모가 커ㄴ지고 빈의 갯수가 많아질 경우
- 빈 스캐닝
- 어노테이션 사용의 경우 반드시 component-scan을 설정해줘야 한다.
- <context:component-scan base-package="com.test.hello.*" />
Stereotype annotaion
@Repository | DAO 또는 Repository클래스에 사용 자동변환과 같은 aop 적용 대상을 선정하기 위해 사용 |
@Service | service layer의 클래스에 사용 |
@Controller | MVC Controller에 사용 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 설정 |
@Component | 위의 layer 구분을 적용하기 ㅇ어려운 일반적인 경우에 설정 |
스프링 설정 :xml (applicationContext.xml)
- 애플리케이션에서 사용할 스프링 자원들을 설정하는 파일
- 기본 설정 : 빈 객체 생성 및 주입
- 주입할 객체를 설정파일에 설정
스프링 빈 의존 관계설정 - xml
- contstructor 이용 <constructor-arg>
- property 이용 setter method (setter를 통해서는 하나의 값만 받을 수 있ㅏ.) <property> xml namespace를 이용하여 주입
어노테이션 동일한 타입의 빈이 여러개일 경우 @Qualifier("name")으로 구별
스프링 빈의 생명 주기
빈 생성 -> 의존성 주입 -> init method 실행 -> 빈 사용 -> destroy-method 실행 -> 빈 소멸