본문 바로가기
BACKEND/Spring

[Spring] AOP 란?

by LAY CODER 2021. 4. 11.

AOP

 

Java는 다중 상속이 불가하므로 다양한 모듈에 '상속을 통한 공통 기능 부여는 한계'가 있다.

 

그리고, 기능 구현 부분에 핵심 기능 코드와 공통 기능 코드가 섞여서 효율성이 떨어진다.

 

그래서 공통 기능을 분리해 놓고 적용하고자 하는 부분에만 proxy라는 비서를 이용하여 적용하는 것이 AOP 기법이다.

 

호출부(client) -> Proxy(대행) -> Target(핵심기능)

 


 

용어

 

Aspect

공통기능

 

Advice

Aspect의 기능 자체

 

Joinpoint

Advice를 적용해야 되는 부분 (ex - 필드, 메소드) 

 

Before

메소드 실행 전에 advice 실행

 

After

메소드 실행 후에 advice 실행

 

Around

메소드 실행 전/후 및 Exception 발생 시 advice 실행

 

Pointcut

AOP Advice를 적용 할 Joinpoint 범위를 Pointcut으로 지정

 

Weaving

Advice를 핵심 기능에 적용하는 행위

 


 

적용방법

 

 1. 의존 설정(pom.xml) -> Aop 설치

 

<!-- AOP  -->
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.7.4</version>
</dependency>

 

2. 공통 기능 클래스 제작 - Adivce 클래스 생성

 

@Pointcut("bean(*ker)")
private void pointCutMethod() {

}


// Around : 메소드 실행 전/후 및 Exception 발생 시 adivce 실행
@Around("pointCutMethod()")
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
	String signatureStr = joinpoint.getSignature().toShortString();
	System.out.println(signatureStr + " is start.");
	long startTime = System.currentTimeMillis();

	try {
		Object object = joinpoint.proceed();
		return object;
	} finally {
		long endTime = System.currentTimeMillis();
		System.out.println(signatureStr + " is finished.");
		System.out.println(signatureStr + "경과시간 : " + (endTime - startTime));
	}
}

// Before : 메소드 실행 전에 adivce 실행
@Before("within(com.java.ex.*)")
public void beforeAdvice() {
	System.out.println("beforeAdvice()");
}

// After : 메소드 실행 후에 adivce 실행
@After("within(com.java.ex.*)")
public void afterAdvice() {
	System.out.println("afterAdvice()");
}

 

3. XML설정 파일에 Aspect 설정

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

	<!-- autoproxy : proxy를 자동으로 생성  -->
	<aop:aspectj-autoproxy />
	<bean id="logAop" class="com.java.ex.LogAop" />

	<bean id="student" class="com.java.ex.Student">
		<property name="name" value="장상옥" />
		<property name="age" value="31" />
		<property name="gradeNum" value="3" />
		<property name="classNum" value="1" />
	</bean>

	<bean id="worker" class="com.java.ex.Worker">
		<property name="name" value="장상옥" />
		<property name="age" value="31" />
		<property name="job" value="programmer" />
	</bean>

</beans>

 


Pointcut 범위

 

Pointcut

AOP Advice 적용 할 Joinpoint 범위를 Pointcut으로 지정

 

//         * : 모든        |       . : 현재       |      .. :0개 이상

@Pointcut("execution(public void get*(..))") // public void인 모든 get 메소드

@Pointcut("execution(* com.java.ex.*.*())") // com.java.ex 패키지에 파라미터가 없는 모든 메소드

@Pointcut("execution(* com.java.ex..*.*())") // com.java.ex 패키지 & com.java.ex 하위 패키지에 파라미터가 없는 모든 메소드

@Pointcut("execution(* com.java.ex.Worker.*())") // com.java.ex.Worker 안의 모든 메소드


@Pointcut("within(com.java.ex.*)") // com.java.ex 패키지 안에 있는 모든 메소드

@Pointcut("within(com.java.ex..*)") // com.java.ex 패키지 및 하위 패키지 안에 있는 모든 메소드

@Pointcut("within(com.java.ex.Worker)") // com.java.ex.Worker 모든 메소드


@Pointcut("bean(student)") // student bean

@Pointcut("bean(*ker)") // 뒤에 ker가 붙은 bean

 

 

References


www.youtube.com/watch?v=2F8K9BLgvjE&list=PLieE0qnqO2kTyzAlsvxzoulHVISvO8zA9&index=72

'BACKEND > Spring' 카테고리의 다른 글

[MAC/Eclipse] 초기 설치 & 설정  (0) 2021.04.10

댓글