Spring

AOP(관점 지향 프로그래밍)

Clearing 2022. 9. 16. 12:02
728x90

AOP(Aspect Oriented Programming)이란 관점 지향 프로그래밍으로 어떤 로직을 기준으로

핵심적인 관점, 부가적인 관점으로 나누어 그 관점을 기준으로 각각 모듈화 하는 것으로

즉, 공통된 로직(횡단 관심)이나 기능을 하나의 단위로 묶어 어떤 횡단 관심을

어떤 핵심 로직에 연결할지 설정하는 것을 말한다.

- 공통 로직의 예) 로깅, 예외처리, 트랜잭션, 보안(인증, 인가, 허가),.......

 

사용하기 위해서는 우선 pom.xml에 설정을 추가 해주어야한다.

		<!-- 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>

 

용어 정리

Advice

- 횡단 관심

 

pointcut

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

a) expression(표현식)에 어떤 핵심 로직인지 설정해주어야 함 -> execution(메서드 시그니쳐)

    메서드 시그니쳐는 [아웃풋][패키지명.클래스명.메서드명][인자]로 구성

    ex) execution(* com.kim.biz..*impl.*(..))

         -> 모든 아웃풋, com.kim.biz로 시작하는 패키지의 ???impl로 이루어진 클래스의 모든 메서드(모든 인자)

 

aspect

- 결합 (어떠한 횡단 관심을 어떠한 로직에 결합할 것인지)

 

결합 시기

around의 경우 핵심 수행로직을 advice가 강탈해와 로직 수행 전후로 구성할 수 있다.

ex) 필터 서블릿 클래스

 

around로 사용할 advice는 반드시 pjp를 input으로 가져야 한다.

public class AroundAdvice {
	public Object printLogAround(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("[BEFORE]");
		Object returnObj = pjp.proceed(); // 수행해야할 포인트컷
		System.out.println("[AFTER]");
		return returnObj;
	}
}

 

 

사용 예시

	<bean id="logAdvice" class="com.kim.biz.common.LogAdvice" />
	//<bean id="객체명" class="패키지명.클래스명" />
	//해당 클래스 파일을 지정한 이름으로 객체화
	
	<aop:config>
		<aop:pointcut expression="execution(* com.kim.biz..*Impl.*(..))" id="aPointcut"/>
		<aop:pointcut expression="execution(* com.kim.biz..*Impl.select*(..))" id="bPointcut"/>
		
		<aop:aspect ref="logAdvice"> // 사용할 객체명 설정
			<aop:before method="printLog" pointcut-ref="aPointcut"/>
			// 핵심로직 수행 전 해당 메서드 수행
		</aop:aspect>
		
		<aop:aspect ref="logAdvice">
			<aop:after method="selectLog" pointcut-ref="bPointcut"/>
			// 핵심로직 수행 후 해당 메서드 수행
		</aop:aspect>
	</aop:config>

 

 

 

 

 

 

 

 

 

728x90