728x90

<스프링 AOP(Aspect Oriented Programming) vs 객체지향>

- 관점지향프로그램: OOP 로 나눠놓은 함수내에서도 중복되는 코드가 있기 때문에... 이 부분조차 없애는 것!!

공통모듈을 따로 메소드로 빼서 메소드명을 삽입하고,

핵심 부분만 남긴다.

cf) OOP(Object Oriented Programming) - 객체지향프로그램




- 근데 함수로 쪼개놨더니 함수 안의 내용들중에 중복되는게 많다
ex)


=> AOP는 이렇게 중복되는것조차 없애는 것!!

1+1


<AOP란?>

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

 

- Aspect란?

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

 

- Aspect = Advice + Pointcut(선택받은메소드)

어드바이저는 아주 단순한 형태의 애스펙트라고 볼 수 있다

 

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

 

- 어플리케이션의 핵심기능을 따라 코딩하지 않고, 핵심기능 대신, 부가적인 기능을 바라보고 집중해서 설계하고 개발할 수 있다

어플리케이션을 부가기능 관점에서, 새롭게 바라볼 수 있게 해준다 라는 의미로 AOP를 관점 지향 프로그래밍이라고도 한다


 

<AOP 용어>

1. Target : 부가기능을 부여할 대상, 핵심기능이 담긴 클래스, 어느클래스에서?

 

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

언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의

Before, After Returning, After Throwing, Around 등이 있다

앞       뒤             

 

3. Joinpoint : Advice를 적용 가능한 지점을 의미

메소드 호출, 필드 값 변경 등

스프링의 프록시 AOP에서 조인 포인트는 메소드의 실행 단계뿐이다

타깃 오브젝트가 구현한 인터페이스의 모든 메소드가 조인 포인트가 된다

=> 클래스안의 모든 메소드

 

4. Pointcut : 조인 포인트를 선별하는 기능을 정의한 모듈

가능한 조인 포인트들 중에 실제로 부가기능을 적용할 것들을 선별한다

클래스를 선정하고, 그 안의 메소드를 선정하는 과정을 거친다

실제로 Advice가 적용되는 Joinpoint를 나타낸다

=> 선택받은 메소드

 

5. Proxy : 클라이언트와 타깃 사이에 존재하면서 부가기능을 제공하는 오브젝트

클라이언트는 타깃을 요청하지만, 클라이언트에게는 DI를 통해 타깃 대신 프록시가 주입된다

클라이언트의 메소드 호출을 대신 받아서 타깃에게 위임하며, 그 과정에서 부가기능을 부여한다

스프링 AOP는 프록시를 이용한다

 

 

=> 교수가 바쁘면 조교가 처리하듯이 프록시는 조교!

서버가 바쁘니까 기다렸다가 어떤 메소드가 호출되는지 지켜보고 코드를 삽입!

스프링마다 프록시서버가 존재한다

//cf) 스프링에는 proxy가 내장되어있어서 신경 안써도 된다

invoke가 원조?!

어제는 joinpoint와 proceed로 호출했는데..!!

 

 

6. Advisor : 어드바이스와 포인트컷을 하나로 묶어 취급한 것

AOP의 가장 기본이 되는 모듈이다

스프링은 자동 프록시 생성기가 어드바이저 단위로 검색해서 AOP를 적용한다

=> 하나씩 껴주는 모듈

 

7. Aspect : 다수의 포인트컷과 어드바이스의 조합으로 만들어진다

보통 싱글톤 형태의 오브젝트로 존재한다

어드바이저는 아주 단순한 애스펙트라고 볼 수 있다

=> 공통모듈

 

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

 

: AdviceWeaving하는 3가지 방식

- 컴파일 시에 Weaving

AspectJ에서 사용하는 방식

AOP가 적용된 클래스 파일이 생성된다

 

- 클래스 로딩 시에 Weaving

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

 

- 런타임 시에 Weaving

소스코드나 클래스 정보 자체를 변경하지 않는다

프록시를 이용한다(핵심로직을 구현한 객체에 직접 접근하는 것이 아니라 중간에 프록시를 생성하여 프록시를 통해서 핵심로직을 구현한 객체에 접근한다.)

프록시는 메소드가 호출될 때에만 적용할 수 있다(필드값 변경에 대해서는 적용 불가능)

 

: 스프링은 자체적으로 프록시 기반의 AOP를 지원한다

메소드 호출 Joinpoint만 지원(필드값 변경과 같은 Joinpoint는 불가능)

 

: 스프링 AOP는 자바 기반이다.

AspectJAspect를 위한 별도의 문법이 필요하다

 

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


 

스프링이 제공하는 AOP는 프록시를 이용한다

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

 

- AOP 기술의 원조인 AspectJ는 프록시를 사용하지 않는 대표적인 AOP 기술이다

타깃 오브젝트를 뜯어고쳐서 부가기능을 직접 넣어주는 방식을 사용한다

소스코드를 고치는 것이 아니라, 컴파일 된 타깃 클래스의 파일 자체를 수정하거나 클래스가 JVM에 로딩되는 시점을 가로채서 바이트코드를 조작 한다

 

프록시를 사용하지 않고 클래스 파일 조작과 같은 복잡한 방법을 사용하는 이유는

1. 스프링과 같은 DI 컨테이너의 도움이 필요 없다

스프링과 같은 컨테이너가 사용되지 않는 환경에서 AOP 적용이 가능하다

 

2. 프록시보다 훨씬 강력하고 유연하다

프록시 방식은 타깃 오브젝트가 생성되고 난 후부터 적용이 가능하다

하지만 AspectJ는 어떤 순간에든지 적용이 가능하다

클래스 바이트코드를 직접 조작하는 것이기 때문에 거의 제한이 없다

대부분의 부가기능은 프록시 방식을 사용해 메소드의 호출 시점에 부여하는 것으로도 충분하다

AspectJ와 같은 고급 AOP 기술은 바이트코드 조작을 위해 JVM의 실행옵션을 변경하고, 별도의 바이트코드 컴파일러를 사용하고, 특별한 클래스 로더를 사용하는 등 번거로운 작업이 필요하다

 

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

AspectJ를 사용하는 것이다

 

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

 

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

 

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


[실습]

Project : chapter03

chapter03_SpringMaven

 

필요한 JAR

aspectjweaver-1.9.7.jar = > 다운

commons-logging-1.2.jar

 

spring-aop-5.3.5.RELEASE.jar

spring-beans-5.2.0.RELEASE.jar

spring-context-5.2.0.RELEASE.jar

spring-core-5.2.0.RELEASE.jar

spring-expression-5.2.0.RELEASE.jar

 

 

Project : chapter03

Package : sample01

Interface : MessageBean.java

Class : MessageBeanImpl.java

HelloSpring.java - main()

LoggingAdvice.java - 공통관심사항

src : acQuickStart.xml

 

 

위에껄 

밑의 클래스로 빼버린 것!!!

 

 

ex)

Before로 끝나는 메소드가 나타날때마다 계속 껴들어 가겠다는 말!

 

=> After도 같은 방식

cf)

옆에 껴들어가는 방향으로 그림도 나온다

 

이렇게 * * 짠뜩 써도 된다
매개변수도 개수상관없이 받겠다면 .. !!

- 어라운드만 여기가 조금 다르다!!

 

 


<컴포넌트로 변경>

메이븐으로 와서 챕터3.샘플1

Project : chapter03_SpringMaven

Package : sample01

Interface : MessageBean.java

Class : HelloSpring.java

MessageBeanImpl.java

LoggingAdvice.java - 공통관심사항

src : acQuickStart.xml

아니면 <scope>provided</scope>으로 바꾸면 된다

 <!-- error -runtiom 이 라이브러리를 언제 사용할 것인지를 정하는 것이라서 주석 걸면된다. 없애든지!! 아니면
    <scope>provided</scope>으로 바꿔도 된다!  -->

 

 

<SpringConfig로 변경>

MessageBeanImpl 컴포넌트 주석걸고

@EnableAspectJAutoProxy: aop 대신해서 쓴 것?!

xml 과 어노테이션을 보통 섞어쓴다

하지만 잘써야한다 컴포넌트가 둘다 있어야지 오토와이어드가 먹히니까...

 

그래서 마이바티스 등 같이 쓰면 xml 파일이 여러개 생긴다

728x90

+ Recent posts