4. Skill of Spring
- 스프링에는 POJO프로그래밍을 손쉽게 할 수 있도록 지원하는 세가지 가능 기술( enaling technology)을 제공한다.
- IoC/DI, AOP, PSA
1) 제어의 역전(Ioc)/ 의존관계 주입(DI)
- DI 사용이유 : 유연한 확장이 가능하게 하기 위함
- A -> B : 확장은 B가 자유롭게 변경될 수 있음, B가 변경돼도 A는 아무런 영향을 받지 않고 그대로 유지 가능
(1) DI의 활용방법
a. 핵심기능의 변경
- 대표적인 적용방법은 의존 대상의 구현을 바꾸는것 (전략패턴)
- A -> B 구조에서 A의 기능 일부를 B에게 위임한다고 했을 때 B의 구현 방식을 필요에 따라 통째로 B1, B2 처럼 통째로 변경
- 예) 서비스 오브젝트가 사용하는 DAD 의 구현 변경-> JDBC, JPA, 하이버네이트, iBatis 등으로 통째로 변경
b. 핵심기능의 동적인 변경
- 일반적인 DI와 다르게 동적으로 매번 다르게 변경 가능
- 예 : 사용자의 등급에 따라서 다르게 DataSource를 사용하게 만들 수도 있다.
- Dao -> DataSource : Dao하나가 여러개의 DataSource에 의존하게 만들 수 있다.
- VIP에 속한 사용자의 등급에 따라서 그때그때 다른 DataSource를 DAO가 사용하게 함(더 빠르게)
- 다이내믹 라우팅 프록시, 프록시 오브젝트 기법을 활용
c. 부가기능의 추가
- 핵심기능은 그래도 둔 채로 부가기능을 추가(데코레이터 패턴)
- 인터페이스를 두고 사용하게 하고, 실제 사용할 오브젝트는 외부에서 주이하는 DI를 적용해두면 데코레이터 패턴을 쉽게 적용
d. 인터페이스의 변경
- 클라이언트가 사용하는 인터페이스와 실제 오브젝트 사이에 인터페이스가 일치하지 않는 경우에도 DI유용
- 예 : A가 C오브젝트를 사용하려 한다고 가정 BUT A -> B 인터페이스만 사용하도록 만들어짐, C는 B인터페이스 구현 안되어있다.
- A가 DI를 통해 B의 구현 오브젝트를 받도록 만들어져 있다면 -> B 인터페이스를 구현했으면서 내부에서 C를 호출 해주는 기능을 가진 어댑터 오브젝트를 만들어 A에 DI 하면됨
-A -> B(C로위임) -> C
- 좀더 응용하면 PSA(서비스 추상화)
e. 프록시
- 프록시 패턴
- 필요한 시점에서 실제 사용할 오브젝트를 초기화하고 리소스를 준비하게 해주는 지연된 로딩(lazy loading)을 적용 하기위한 방법
- 원격 프로시(원격 오브젝트를 로컬처럼 사용할때)
f. 템플릿과 콜백
- 항상 고정적인 작업흐름과 그사이에서 자주 바뀌는 부분을 분리해서 템플릿과 콜백으로 만들고 이를 DI 원리를 응용해 적용하면 지저분한게 매번 만들어야 하는 코드를 간결하게 만듬
g. 싱글콘과 오브젝트 스코프
- DI가 필요한 이유중 한가지는 DI할 오브젝트의 생명주기를 제어 할 수 있다는 것임.
- 전통적인 싱글톤방식보단 IOC방식이 유용하다.
- 스프링 DI는 기본적으로 싱글톤으로 오브젝트를 만들어서 사용
- 스프링에서는 싱글콘 외에도 다양한 스코프를 갖는 오브젝트를 만들어 DI에 사용 할수도있다.
- HTTP 요청당 하나의 오브젝트를 만들거나 HTTP세션단 하나씩 오브젝트가 만들어 질 수 있다.
h. 테스트
- 여타 오브젝트와 협력해서 동작하는 오브젝트를 효과적으로 테스트하는 방법은 가능한 고립시키는 것임
- 다른 오브젝트와 사이에서 일어나는 일을 테스트를 위해 조작할 수 있도록 만든다.
- 스텁, 또는 목 오브젝트 같은 테스트 대역을 활용
- DI를 위해 만든 수정자 메소드를 사용하면 테스트 코드 안에서 수동으로 목 오브젝트를 주입 할수 있다.
2) 에스펙트 지향 프로그래밍(AOP)
- AOP와 OOP는 서로 배타적이 아니다.
- IOC/DI를 이용하여 POJO에 선언적인 엔터프라이즈 서비스를 제공할 수 있지만 일부 서비스는 순수한 객체지향 기법만으로는 POJO의 조건을 유지한 채로 적용하기 힘듬
- AOP는 객체지향 기술의 한계와 단점을 극복 하도록 도와주는 프로그램
(1) AOP의 적용 기법
- AOP를 자바 언어에 적용하는 기법은 크게 두가지로 분류함
a. 스프링과 같이 다이내믹 프록시를 사용하는 방법
- 기존 코드에 영향을 주지 않고 부가기능을 적용하게 해주는 데코레이터 패턴을 응용
- 자바의 객체지향 패턴을 활용, 만들기 쉽고 적용 편리
- 부가기능을 부여할 수 있는 곳이 메소드의 호출이 일어나는 지점뿐이라는 제약
b. 자바 언어의 한계를 넘어서는 언어의 확장을 이용
- AspectJ라는 AOP툴이 존재
- AspectJ는 프록시 방식의 AOP에서는 불가능한 다양한 조인 포인트를 제공, 메소드호출뿐 아니라 인스턴스 생성, 필드 엑세스, 특정 호출 경로를 가진 메소드 호출 등에도 부가기능 추가
(2) AOP의 적용단계
- AOP는 하나의 모듈이 수많은 오브젝트에 보이지 않게 적용되기 때문에 매우 주의해서 사용해야한다.
a. AOP적용 1단계: 미리 준비된 AOP 이용
- 스프링이 제공하는 대표 AOP는 트랜잭션
- DB를 사용하는 애플리케이션이면 트랜잭을 필요로 하니 적용해서 AOP를 관찰
- @Configurable 애노테이션을 이용해서 도메인 오브젝트에 DI를 자동적해주는 AOP기능
b. AOP적용 2단계: 전담팀을 통한 정책 AOP 적용
- 소수의 AOP 전담팀을 가짐
- 오브젝트보안, 특정계층의 오브젝트를 이용 전후의 작업 기록을 남기는 로깅 등
c.AOP 적용 3단계: AOP의 자유로운 이용
- 1단계와 2단계를 거치고 익숙해지면 이제 개발자 스스로 활용
3) 포터블 서비스 추상화(PSA)
- 환경과 세부 기술의 변화에 관계없이 일관됭 방식으로 기술에 접근 할 수 있게 해주는 PSA이다
- 스프링은 JavaEE기술에 의존적일 수 밖에 없다. -> POJO? -> PSA 활용
- 트랜잭션 서비스 추상화 : 코드를 이용해 트랜잭션을 제어하지 않는다면 직접 이용할 이유가 없다. -> AOP를 이용하기 때문 -> 대신 구체적인 서비스 클래스를 빈으로 등록
soucre of post is Spring of Toby3
'Back-End > SpringFrame_1' 카테고리의 다른 글
[Spring] DI_1 (0) | 2016.07.16 |
---|---|
[Spring] AOP_1 (0) | 2016.07.04 |
[Spring]8_2.Purpose of Spring - 스프링의 목적 (0) | 2016.02.28 |
[Spring]8_1.Definition of Spring - 스프링이란? (0) | 2016.02.28 |
[Spring]8_3.POJO Programming (0) | 2016.02.25 |