본문 바로가기
IT Study/Spring

Spring - AOP(Aspect Oriented Programming) 설정

by hhyyyjun 2023. 1. 2.

AOP(Aspect Oriented Programming)

관점지향 프로그래밍

핵심로직(비즈니스메서드,CRUD) 에는 공통적으로 들어가는 로직이 존재 == 공통로직(횡단관심)

ex)로깅, 예외처리, 트랜잭션, 보안(인증,인가,허가 등)

어떤 횡단관심을 어떤 핵심로직에 연결할지 '설정' 하는 것을 AOP 설정이라 표현

Advice(LogAdvice)

횡단관심 - 로깅에 대한 공통로직을 만듦

동작 시점은 각 aop 시점마다 다름

스프링 AOP 설정

1) pom.xml에서 aspectj-version 설정

<!-- AOP -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.8</version>
		</dependency>

2) 네임스페이스에서 aop 추가

3) applicationContext.xml 에서 aop설정

<context:component-scan base-package="타켓할 패키지"/>

context:component-scan

패키지 타겟

aop:config

모든 aop 전체설정을 감싸주는 태그

aop:pointcut

횡단관심을 적용할 핵심 로직을 의미

apointcut == 모든 핵심 로직

expression(표현식)에 어떤 핵심 로직인지 알려줘야 함

execution(메서드 시그니처) - execution(* com.kim.biz..*Impl.*(..))

1) [*] - 아웃풋

2) [com.kim.biz..*Impl.*] 패키지를 포함한 클래스명

com.kim.biz..*Impl.*

com.kim.biz..*Impl 패키지의 모든 Impl로 끝나는 클래스의 .* 모든 메서드

3) [(..)] - 모든 인자

aop:aspect

결합 - 횡단관심+포인트컷(횡단관심이 적용된 핵심로직)

aop:before - 비즈니스 메서드 완전 수행 전

aop:after - 비즈니스 메서드 수행 후 무조건 실행

aop:after-returning - 비즈니스 메서드 수행 후 비즈니스 메서드의 반환값을 사용할 때(메서드가 성공적으로 리턴되면 동작)

aop:after-throwing - 예외발생 시 동작

aop:around - 특정 비즈니스 메서드의 실행 전/후 전체에 영향을 줄 수 있음(로직 삽입 가능)(filter처럼 수행)

비즈니스메서드가 시작/끝나면 그 때 등록해둔 advice 가 실행 => 스프링 컨테이너가 담당 및 관리함


포인트컷을 경우에 따라 사용할 경우

aop:pointcut을 무조건 모든 aop:aspect 위에 선언해야 한다.

**주의할점

Before, After Returning, After Throwing, After 어드바이스는 JoinPoint 를 매개변수로 사용하고,

Around 어드바이스에서만 ProceedingJoinPoint 를 매개변수로 사용한다.

이는 Around 어드바이스에서만 proceed() 메소드가 필요하기 때문이다.

Around 어드바이스를 사용한 경우

ProceedingJoinPoint 인터페이스 - JoinPoint 를 상속받은 클래스

pjp.proceed()에 의해 비즈니스메서드가 실행됨

어떤 데이터 형이 올지 몰라 Object 형으로 해야 함

댓글