★ 스프링 AOP(Aspect Oriented Programming) - 관점지향프로그램
          OOP(Object Oriented Programming) - 객체지향프로그램


Aspect란
어플리케이션의 핵심 기능은 아니지만, 어플리케이션을 구성하는 중요한 요소이고, 부가적인 기능을 담당하는 요소

Aspect = Advice + Pointcut
어드바이저는 단순한 형태의 애스펙트라고 볼 수 있다

AOP란
어플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 애스펙트라는 모듈로 만들어서 설계하고 개발하는 방법을 AOP(Aspect Oriented Programming)이라고 한다

AOP는 새로운 프로그래밍 패러다임이 아니라, OOP를 돕는 보조적인 기술이다

어플리케이션의 핵심기능을 따라 코딩하지 않고, 핵심기능 대신, 부가적인 기능을 바라보고 집중해서 설계하고 개발할 수 있다
어플리케이션을 부가기능 관점에서, 새롭게 바라볼 수 있게 해준다라는 의미로 AOP를 관점 지향 프로그래밍이라고도 한다

스프링이 제공하는 AOP는 프록시를 이용한다
프록시를 통해 타겟 오브젝트의 메소드가 호출될 경우, 프록시가 제어를 가로채고, InvocationHandler와 같은 오브젝트를 통해 타겟 메소드의 실행 전 후로 부가적인 기능을 실행한다


AOP 기술의 원조인 AspectJ는 프록시를 사용하지 않는 대표적인 AOP 기술이다
타깃 오브젝트를 뜯어고쳐서 부가기능을 직접 넣어주는 방식을 사용한다
소스코드를 고치는 것이 아니라, 컴파일된 타깃 클래스의 파일 자체를 수정하거나 클래스가 JVM에 로딩되는 시점을 가로채서 바이트코드를 조작한다

프록시를 사용하지 않고 클래스 파일 조작과 같은 복잡한 방법을 사용하는 이유는
1. 스프링과 같은 DI컨테이너의 도움이 필요없다
스프링과 같은 컨테이너가 사용되지 않는 환경에서 AOP 적용이 가능하다

2. 프록시보다 훨씬 강력하고 유연하다
프록시 방식은 타깃 오브젝트가 생성되고 난 후부터 적용이 가능하다
하지만 AspectJ는 어떤 순간에든지 적용이 가능하다
클래스 바이트코드를 직접 조작하는 것이기 때문에 거의 제한이 없다

대부분의 부가기능은 프록시 방식을 사용해 메소드의 호출 시점에 부여하는 것으로도 충분하다
AspectJ와 같은 고급AOP 기술은 바이트코드 조작을 위해 JVM의 실행옵션을 변경하고, 별도의 바이트코드 컴파일러를 사용하고, 특별한 클래스 로더를 사용하는 등 번거로운 작업이 필요하다

: 일반적으로 스프링의 AOP를 사용하고, 스프링의 AOP 수준을 넘어서는 기능이 필요하다면 AspectJ를 사용하는 것이다

: 핵심관심사항과 공통관심사항을 기준으로 프로그래밍함으로써 공통 모듈을 여러 코드에 쉽게 적용

: 공통관심사항을 구현한 코드를 핵심 로직을 구현한 코드에 삽입하는 것

: 핵심로직을 구현할 때 트랜잭션 적용이나 보안 검사와 공통 기능을 삽입할 필요가 없다


※ AOP 용어
1. Target : 부가기능을 부여할 대상, 핵심기능이 담긴 클래스

2. Advice : 부가기능을 담음 모듈

3. Joinpoint : Advice를 적용 가능한 지점을 의미
               메소드 호출, 필드 값 변경 등
               스프링의 프록시 AOP에서 조인 포인트는 메소드의 실행 단계뿐이다
               타깃 오브젝트가 구현한 인터페이스의 모든 메소드가 조인 포인트가 된다

4. Pointcut : 조인 포인트를 선별하는 기능을 정의한 모듈
              가능한 조인 포인트들 중에 실제로 부가기능을 적용할 것들을 선별한다
              클래스를 선정하고, 그 안의 메소드를 선정하는 과정을 거친다
              실제로 Advice가 적용되는 Joinpoint를 나타낸다


5. Proxy : 클라이언트와 타깃 사이에 존재하면서 부가기능을 제공하는 오브젝트
           클라이언트는 타깃을 요청하지만, 클라이언트에게는 DI를 통해 타깃 대신 프록시가 주입된다
           클라이언트의 메소드 호출을 대신 받아서 타깃에게 위임하며, 그 과정에서 부가기능을 부여한다
           스프링 AOP는 프록시를 이용한다

6. Advisor : 포인트컷과 어드바이스를 하나씩 갖고 있는 오브젝트
             AOP의 가장 기본이 되는 모듈이다
             스프링은 자동 프록시 생성기가 어드바이저 단위로 검색해서 AOP를 적용한다

7. Aspect : 다수의 포인트컷과 어드바이스의 조합으로 만들어진다
            보통 싱글톤 형태의 오브젝트로 존재한다
            어드바이저는 아주 단순한 애스펙트라고 볼 수 있다

8. Weaving : Advice를 핵심로직코드에 적용하는 것을 Weaving라고 한다.


: Advice를 Weaving하는 3가지 방식
- 컴파일 시에 Weaving
  AspectJ에서 사용하는 방식
  AOP가 적용된 클래스 파일이 생성된다

- 클래스 로딩 시에 Weaving
  AspectJ 5/6 버전이 컴파일 방식과 클래스 로딩방식을 함께 지원

- 런타임 시에 Weaving
  소스코드나 클래스 정보 자체를 변경하지 않는다
  프록시를 이용한다(핵심로직을 구현한 객체에 직접 접근하는 것이 아니라 중간에 프록시를 생성하여 프록시를 통해서 핵심로직을 구현한 객체에 접근한다.)
  프록시는 메소드가 호출될 때에만 적용할 수 있다(필드값 변경에 대해서는 적용 불가능)


: 스프링은 자체적으로 프록시 기반의 AOP를 지원한다
  메소드 호출 Joinpoint만 지원(필드값 변경과 같은 Joinpoint는 불가능)

: 스프링 AOP는 자바 기반이다.
  AspectJ는 Aspect를 위한 별도의 문법이 필요하다

: 대상 객체의 메소드를 실행하기 전/후에 원하는 기능을 삽입(Around Advice)하는데 캐시기능, 성능 모니터링 기능과 같은 Aspect를 구현


Project : Chapter03
          Chapter03_SpringMaven

Project : Chapter03
Package : sample01(XML)
Interface : MessageBean.java
Class     : HelloSpring.java - main()
     MessageBeanImpl.java
     LoggingAdvice.java  - 공통관심사항

src : acQuickStart.xml


Project : Chapter03_SpringMaven
Package : sample01(어노테이션)
Interface : MessageBean.java
Class : HelloSpring.java
 MessageBeanImpl.java
 LoggingAdvice.java 

src : acQuickStart.xml


★ 필요한 JAR
aspectjweaver-1.8.10.jar

spring-aop-4.2.5.RELEASE.jar
spring-beans-4.2.5.RELEASE.jar
spring-context-4.2.5.RELEASE.jar
spring-core-4.2.5.RELEASE.jar
spring-expression-4.2.5.RELEASE.jar

commons-logging-1.2.jar

-----------------------------------------
인터페이스를 구현하면 기본적으로 스프링은 인터페이스에 기초하여 프록시를 만든다
MessageBean bean = (MessageBeanImpl)context.getBean("messageBeanImpl"); - error
MessageBean bean = (MessageBean)context.getBean("messageBeanImpl");


만약
인터페이스 없이 바로 클래스로 적용하려면
MessageBean bean = (MessageBeanImpl)context.getBean("messageBeanImpl");
<aop:config proxy-target-class="true">
</aop:config> 
-----------------------------------------

 

 

 

 

 

 

 

+ Recent posts