아무튼 개발
article thumbnail
반응형

 

AOP

 

AOP는 관점지향프로그래밍으로 Aspect Oriented Programming의 약자이다. 

 

불특정 다수의 객체(클래스 또는 메소드)에 코드를 탈부착하도록 만드는 기능을 지닌다.

공통적으로 사용되는 부분을 별도로 분리하는 기술이다.

 

  • 횡단관심사 (Crosscutting Concerns)

모든 영역에 공통적으로 적용

모든 클래스를 가로로 관통하여 횡단할 수 있는 관심사이며, 특정 클래스 혹은 메소드에 적용 가능하다.

 

  • 조인트포인트 (JointPoint)

AOP에서 애플리케이션이 실행될 특정 지점을 의미한다.

 

  • 어드바이스 (Advice)

지정한 특정 JointPoint에 구현할 코드이다.

 

  • 포인트컷 (PointCut)

여러 JointPoint의 집합체로, 언제 어느 시점에 어디에(메소드) Advice를 실행할 지 표시한다.

 

  • 애스팩트 (Aspect)

Advice와 PointCut을 합하여 횡단관심사에 대한 코드와 이를 적용할 위치를 지정한다.

 

 


AOP 예제

어노테이션을 사용하여 AOP 사용법을 확인해보겠다!

 

TargetA

 

@Component("targetA")
public class TargetA {
	
	public void doSomething1() {
		System.out.println("TargetA.doSomething1");
	}

 

@Component 어노테이션을 통해 객체 생성을 해준다.

콘솔창에 출력할 것이기 때문에 doSomething1메소드를 입력해준다.

 

 

MyBeforeAdvice

 

@Aspect
@Component
public class MyBeforeAdvice {
	
	@Before("execution(public void com..aop.*.*(..))")
	public void beforeMethodCall() {		
		System.out.println("메소드 실행전(BeforeAdvice)...");		
	}
}

 

@Aspect를 붙임으로써 해당클래스가 Aspect라는 것으로 지정한다.

 

execution

execution은 어드바이스를 적용하려는 범위이다.

execution(메소드접근지정자 반환값 패키지.클래스.메소드명(인수)

가 입력 순서이며, '*'를 입력하면 전체 범위인 것이다.

패키지명에 중간에 ..을 입력한 것은 com으로 시작해 aop로 끝나는 모든 패키지를 의미하는 것이다.

인수에 String을 입력 시 타입이 String일 때만 해당되며, '*,*'을 입력하면 타입 상관없이 2개인 것만 해당된다.

 

Advice 어노테이션

@Before 어노테이션을 통해 메소드가 실행되기 전에 진행되도록 한다.

추가로,

@After는 메소드가 실행된 이후

@AfterReturning 정상적으로 실행되고난 후

@AfterThrowing 에러가 발생한 후

의 Advice이다.

 

 

MyAroundAdvice

 

@Aspect
@Component
public class MyAroundAdvice {
	
	@Around("execution(public void com..aop.*.*(..))")
	public Object aroundMethodCall(ProceedingJoinPoint jointPoint) {
									
		Object result = null;
		
		try {		
			System.out.println("메소드 실행전(AroundAdvice)...");
			
			result = jointPoint.proceed(); 
			
			System.out.println("메소드 실행후(AroundAdvice)..."); 
			
		} catch (Throwable e) {
			// TODO: handle exception
		}		
		return result;		
	}
}

 

@Around는 특정 메소드 전후로 Advice를 실행하는 것이다. before와 after를 모두 합친 꼴이다.

메소드 전후를 구분하기 위해 메소드의 return값을 받아야 한다.

따라서 어떤 타입의 반환값이 올 지 모르니 타입은 Object이다.

 

ProceedingJoinPoint는 메소드를 실행시켜 준다.

proceed 메소드를 호출하여 result에 넣어준다.

 

 

app-context.xml

 

<beans xmlns:aop="http://www.springframework.org/schema/aop">

	<context:component-scan base-package="com.exe.aop" />
	
	<aop:aspectj-autoproxy/>
    
</beans>

 

설명할 부분만 가져왔다.

 

aop를 사용해야 하므로 맨 위에 aop도 입력했으며

마지막 줄은 어노테이션으로 AOP 사용하기 위한 코딩이다. 저 내용을 입력해주면 어노테이션으로 가능해진다.

 

 

AopMain

 

public class AopMain {

	public static void main(String[] args) {
		
		GenericXmlApplicationContext context = new GenericXmlApplicationContext("app-context.xml");
		
		TargetA ta = (TargetA)context.getBean("targetA");        
		ta.doSomething1();
	}
}

 

콘솔창에서 확인할 곳이다.

먼저 xml파일을 연결하기 위한 코딩을 입력해준다.

TargetA에서 입력한 메소드를 가져오면, 어노테이션한 AOP가 콘솔창에 나오게 된다!

 

 

 

 

3월 28일 수업 🌕
반응형
profile

아무튼 개발

@릴쥬

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...