본문으로 바로가기

AOP (Aspect Oriented Programming)

category Java/java 2020. 10. 26. 22:40

AOP

 : 관점 지향 프로그래밍

 : 하나의 프로그램을 관점(혹은 관심사)이라는 논리적 단위로 분리해서 관리하는 개념

   - 관심사(concern) = 해당 사건이 발생하는지 관심있게 지켜보다가 해당 사건이 벌어지게 되면 구현되어져 있는

                              다른 작업을 먼저 하고 그 다음에 동작시킨다. 또는 동작시키고 다른 작업을 동작한다.

                              가장 중요한 로직은 아니지만, 사전 조건이나 사후 조건 등이라고 간주할 수 있다.                 

 : 로깅, 감사, 선언적 트렌젝션, 보안, 캐싱 등 다양한 곳에서 사용되고 있다.

 : 개발자의 입장에서 AOP를 적용한다는 것은 기존의 코드를 수정하지 않고도 원하는 관심사들을 엮을 수 있다

 : 상속의 한계를 극복(상속 대체)

 

 

AOP 용어

구분 설명
Target 순수한 비즈니스 로직이다.
어떤한 관심사들과도 관계를 맺지 않는다.
순수한 코어(core)라고 볼 수 있다.
결과적으로 Pointcut에 의해서 자신에게는 없는 기능들을 가지게 된다.
Proxy Target을 전체적으로 감싸고 있는 존재이다.
내부적으로는 Target을 호출하지만, 중간에 필요한 관심사들을 거쳐서 Target을 호출하도록 자동 혹은 수동으로 작성된다.
대부분의 경우 스프링 AOP 기능을 이용해서 자동으로 생성되는(auto-proxy) 방식을 이용한다.
JoinPoint Target 객체가 가진 메서드이다.
외부에서의 호출은 Proxy 객체를 통해서 Target 객체의 JoinPoint를 호출하는 방식이다.
모듈이 삽입되어 동작하게 되는 특정 위치이다. (Advice를 적용해야 되는 부분)
Pointcut Target에는 여러 메서드가 존재하기 때문에 어떤 메서드에 관심사를 결합할 것인지를 결정하는 것이다.
관심사와 비즈니스 로직이 결합되는 시점을 결정하는 것이다.
Proxy는 이 결합이 완성된 상태이므로 메서드를 호출하게 되면 자동으로 관심사가 결합된 상태로 동작하게 된다.
Advice에 다양한 JoinPoint 중에 어떤 것을 사용할지 결정한다.
Pointcut은 다양한 형태로 선언해서 사용할 수 있다.
Advice 실제 걱정거리를 분리해 놓은 코드이다.
JoinPoint에 삽입되어 동작할 수 있는 코드이다.
Aspect의 기능 자체
Weaving Advice를 핵심 로직 코드에 적용하는 행위이다.
Aspect Pointcut + Advice
공통 기능

AOP

 : Advice의 동작 위치에 따른 구분

구분 설명
Before Advice Target의 JoinPoint를 호출하기 전에 실행되는 코드이다.
코드의 실행 자체에는 관여할 수 없다.
After Returning Advice 모든 실행이 정상적으로 이루어진 후에 동작하는 코드이다.
After Throwing Advice 예외가 발생한 뒤에 동작하는 코드이다.
After Advice 정상적으로 실행되거나 예외가 발생했을 때 구분 없이 실행되는 코드이다.
Around Advice 메서드의 실행 자체를 제어할 수 있는 가장 강력한 코드이다.
직접 대상 메서드를 호출하고 결과나 예외를 처리할 수 있다.

 

 : Pointcut에서 주로 사용되는 설정

구분 설명
execution(@execution) 메서드를 기준으로 Pointcut을 설정한다.
within(@within) 특정한 타입(클래스)를 기준으로 Pointcut을 설정한다.
this 주어진 인터페이스를 구현한 객체를 대상으로 Pointcut을 설정한다.
args(@args) 특정한 파라미터를 가지는 대상만을 Pointcut으로 설정한다.
@annotation 특정한 어노테이션이 적용된 대상들만을 Pointcut으로 설정한다.

 

 

 

반응형

'Java > java' 카테고리의 다른 글

유효성 검사 (Validate)  (0) 2020.10.27
IoC 컨테이너  (0) 2020.10.26
빈 xml 객체 생성 정리  (0) 2020.10.21
스프링(Spring)의 특징과 의존성 주입(DI)  (0) 2020.10.20
EL문, JSTL  (0) 2020.10.20