donaricano-btn

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
블로그 이미지

리딩리드

,