AOP의 개요와 용어
핵심기능과 부가기능
핵심기능 : 업무로직을 포함하는 기능
부가기능 : 핵심기능을 도와주는 부가적인 기능(로깅, 보안)
AOP의 개요
AOP는 애플리케이션에서의 관심사의 분리. 즉, 핵심기능에서 부가기능을 분리하는 것이다. 분리한 부가기능을 애스펙트(Aspect)라는 모듈형태로 만들어서 설계하고 개발하는 방법이다.
AOP 용어
타겟 : 핵심기능을 담고 있는 모듈. 부가기능을 부여할 대상을 의미한다.
어드바이스 : 타겟에 제공할 부가기능을 담고있는 모듈
조인 포인트 : 어드바이스가 적용될 수 있는 위치. 타겟 객체가 구현한 인터페이스의 모든 메서드는 조인 포인트다.
포인트컷 : 어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식. 포인트컷 표현식은 execution으로 시작하고 메서드의 signature를 비교하여 적용한다.
애스펙트(어드바이저) : 부가기능을 정의한 코드인 어드바이스 + 어드바이스를 적용할 곳을 결정하는 포인트컷. AOP개념을 적용하여 부가기능을 독립적인 애스펙트로 구분하여 런타임 시에 필요한 위치에 동적으로 적용한다.
위빙(weaving) : 포인트컷에 의해서 결정된 타겟의 조인 포인트에 어드바이스를 적용하는 과정. 위빙은 aop가 타겟의 코드에 영향을 주지 않으면서 필요한 어드바이스를 추가할 수 있도록 해주는 핵심적인 처리과정이다.
Spring AOP의 특징 및 구현 방식
Spring AOP의 특징
1. Spring은 프록시(proxy) 기반 AOP를 지원한다.
Spring은 타겟 객체에 대한 프록시를 만들어 제공한다. 타겟을 감싸는 프록시는 런타임에 생성된다. 프록시는 어드바이스를 타겟 객체에 적용하면서 생성되는 객체이다.
2. 프록시가 호출을 가로챈다.
프록시는 타겟 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고 난 후에 타겟의 핵심긴으 로직을 호출한다. 또는 타겟의 핵심기능 로직 메서드를 호출한 후에 부가기능을 수행하는 경우도 있다.
Spring AOP의 구현 방식
1. XML기반의 POJO클래스를 이용한 AOP구현
부가기능을 제공하는 어드바이스 클래스를 작성한다. XML설정 파일에 <aop:config>를 이용하여 애스펙트(어드바이스와 포인트컷)를 설정한다.
2. @Aspect 어노테이션을 이용한 AOP구현
@Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect클래스를 작성한다. 이때 Aspect클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다. XML설정 파일에 <aop:aspectj-autoproxy />를 설정한다.
Advice 클래스 작성
XML기반의 POJO클래스를 이용한 AOP구현 방법
부가기능을 제공하는 어드바이스 클래스를 작성한 후 XML설정 파일에 빈 등록 및 <aop:config>를 이용하여 애스펙트(어드바이스와 포인트컷)를 설정한다.
Advice의 종류
Around어드바이스 : 타겟의 메서드가 실행되기 전, 후에 모두 처리해야 할 필요가 있는 부가기능 정의
Before어드바이스 : 타겟의 메서드가 실행되기 전에 처리해야 할 필요가 있는 부가기능 정의
After Returning어드바이스 : 타겟의 메서드가 정상적으로 실행된 이후에 처리해야 할 필요가 있는 부가기능 정의
After Throwing어드바이스 : 타겟의 메서드가 예외를 발생한 이후에 실행되는 Advice
JoinPoint 인터페이스(사용 가능한 메서드, )
JoinPoint는 Spring AOP 혹은 AspectJ에서 AOP가 적용되는 지점을 의미한다.
getArgs() : 타겟 객체 메서드의 아규먼트를 반환
getThis() : 프록시 객체 반환
getTarget() : 대상 객체 반환
getSignature() : 어드바이즈 되는 메서드의 설명을 반환한다.
toString() : 어드바이즈 되는 메서드의 설명을 출력한다.
모든 어드바이스는 org.aspectj.lang.JoinPoint 타입의 파라미터를 어드바이스 메서드에 첫 번째 매개변수로 선언
Around 어드바이스는 JoinPoint의 하위 클래스인 ProceedingJoinPoint타입의 파라미터를 선언(proceed메서드 포함)
Advice를 정의하는 태그
<aop:before> : 메서드 실행 전에 적용되는 어드바이스를 정의
<aop:after-returning> : 메서드가 정상적으로 실행된 후에 적용되는 어드바이스를 정의
<aop:after-throwing> : 메서드가 예외를 발생시킬 때 적용되는 어드바이스를 정의
<aop:after> : 메서드가 정상적 또는 예외를 발생시키는지에 상관없이 실행 후에 적용되는 어드바이스를 정의
<aop:around> : 메서드 호출 이전, 이후, 예외발생 등 모든 시점에 적용가능한 어드바이스 정의
PointCut 표현식
Execution([접근제한자 패턴] 리턴타입패턴 [패키지,클래스이름에 대한 패턴] 메서드이름패턴(파라미터패턴) [throws 예외패턴])
Aspect 클래스 선언 및 설정
@Aspect 어노테이션을 이용한 AOP 구현
@Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect클래스를 작성한다. 이때 Aspect클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다. XML설정파일에 <aop:aspectj-autoproxy/>를 설정하여 @Aspect어노테이션이 적용된 Bean을 사용할 수 있다.
Advice를 정의하는 어노테이션
@Before(“Pointcut”) : 타겟 객체의 메서드가 실행되기 전에 호출되는 어드바이스. JoinPoint를 통해 파라미터 정보를 참조할 수 있다.
@After(“Pointcut”) : 타겟 객체의 메서드가 정상 종료 또는 예외발생시 모두 호출되는 어드바이스. 리턴값이나 예외를 직접 전달받을 수 없다.
@Around(“Pointcut”) : 타겟 객체의 메서드가 호출되는 전 과정을 모두 담을 수 있는 어드바이스.
@AfterReturning(pointcut=”~~~”, returning=”~~~”) : 타겟 객체의 메서드가 정상적으로 종료된 후에 호출되는 어드바이스. 리턴값을 참조할 때는 returning 속성에 리턴값을 저장할 변수 이름을 지정해야 한다.
@AfterThrowing(pointcut=”~~~”, throwing=”~~~) : 타겟 객체의 메서드가 예외가 발생하면 호출되는 어드바이스. 발생된 예외를 참조하기 위해 throwing 속성에 예외를 저장할 변수 이름을 지정해야 한다.
코드예시
'공부 > 스프링프레임워크' 카테고리의 다른 글
[spring] pojo (0) | 2021.11.18 |
---|---|
[spring] MyBatis (0) | 2021.11.18 |
[spring] Spring JDBC (0) | 2021.11.17 |
[spring] 사용자 관리 프로젝트 아키텍쳐 (0) | 2021.11.11 |
[spring] 빈 등록 메타정보 구성 및 의존관계 설정 어노테이션 (0) | 2021.11.11 |