[두가지 컨셉은 바로 IoC와 AOP]
1. IoC ( Inversion of Control )
“IoC”라고 하면 "컨테이너", "dependency injection"이 연상되면 된다. 객체를 컨테이너에 등록하는 절차 그리고 어떤 dependencies가 어느 위치에서 inject될지에 대한 정보를 configuration을 통해서 Spring에게 알려주면 된다. 따라서 이런 설정 문법을 이해하는 것이 Spring 프레임워크 사용을 이해하는 기본 단계이면서 핵심이라 할 수 있겠다. |
Requst 객체는 Dependency 객체를 참조
//요청객체 public class Request { Dependency dependency = null; public Dependency Dependency { get { return dependency; } set { dependency = value; } } … }
//종속객체 public class Dependency { //... }
|
<!—요청객체--> <object id="objRequest" type="Request "> <property name="Dependency" ref="dependency"/>
</object>
<!-- 종속 객체--> <object id="dependency " type="Dependency"> </object>
|
2. AOP ( Aspect Oriented Programming)
"AOP를 구현한다"는 것은 "분리된 cross concerns을 실제로 코드로 구현하고 그 코드를 필요한 비즈니스 관심 모듈의 적절한 위치에 삽입하는 작업"이라고 할 수 있겠다. Spring에서 AOP 개념은 프락시를 이용하고 있다. 그리고 프락시에 대한 소유권은 프레임워크에서 가지게 된다. 개발자가 타겟 객체를 요구할때 프레임워크에서는 그 객체에 대한 프락시를 반환하는 패턴을 이용하게 된다. |
클라이언트 코드는 직접 타겟 객체를 참조하지 않고 프락시를 통해서 호출하고 있다. 프락시는 클라이언트의 호출을 받으면 바로 타겟 객체의 메소드를 호출하지 않는다. 3번 호출처럼 필요하다면 Aspect 모듈(advice)을 호출한다. 이때 Cross Concerns( advice로 구현된다)에서는 타겟 객체의 메소드를 호출하기 전에 advice의 내용(로깅, 트랜잭션 작업 시작 등)을 수행할 수 있다. 그리고 나서 타겟 객체의 메소드를 호출한다. 또한 타겟 객체로부터의 반환을 바로 클라이언트로 넘기지 않는다. 타겟 객체의 반환이 클라이언트로 넘겨주기 전에 또한 필요하다면 Aspect 모듈을 호출해서 마무리 작업( 호출후의 로깅작업, 트랜잭션 작업 등)을 할 수 있다. 그리고 나서 최종적으로 클라이언트에 반환값을 넘겨준다.
1) advice(또는 interceptor)
advice가 바로 앞에서 말한 "단면"을 구현한 코드이다. 즉 로깅, 트랜잭션등을 구현한 코드를 말한다. 이것을 interceptor라고도 한다. 두 표현 모두 “옆에서 치고 들어오는 것”을 묘사하고 있다. advice 즉 충고 또는 훈수라는 것도 옆에서 갑작스레 치고 들어오는 것은 마찬가지다. 메인 비즈니스 로직에 추가되어 부가적인 훈수를 두는 코드를 말한다.
2)
Joinpoint
advice가 치고
들어올 수
있는 포인트들이다. 비즈니스 로직을
실행하면서 아무곳에서나 advice가 치고 들어와 할 일(구현된 aspect)을 하는 것은 아니다. cross concerns 모듈의 메인 비즈니스 로직에 삽입이 가능한 후보 위치들이 존재한다.
비즈니스
로직을 구현한
메소드가 호출되기
전 또는
후, 반환값이 반환되기 전 , 예외가
던져지는 지점, 클래스가 초기화되는
곳, 필드를 액세스하는 부분등이 모두 advice가 삽입될 수 있는 후보 포인트들이다. 그러나 모든 jointpoint가 실제로 advice가 삽입되는 곳은 아니다.
3)
Pointcut
joinpoint중에서 실제로 advice가 적용될 위치를 나타낸다. joinpoint가 개념적인 것이라면 툴마다 실제로 구현하고 있는 pointcut은 다를 수 있다. 특정 pointcut를 나타내는 타입들이 Spring 에도
이미 구현되어
있다.
4)
Advisor
pointcut + advice를 말한다. 즉 어디서(where, pointcut) 무슨 일(what, advice)이 일이 일어날지를 정의한다. 편의를 위해서 pointcut + advice를 함께 다룰 수도 있다.
참조 : Spring.NET 개발자 가이드