HomeBlogGuestbookLab 

JDM's Blog

온갖 테스트 결과가 기록되는 이곳은 JDM's Blog입니다. :3

SpringBoot AOP 예제

이 포스팅은 SpringBoot AOP 적용을 위한 데모 프로젝트를 소개합니다.

AOP가 뭔가요?

AOP는 관점 지향 프로그래밍(Aspect-oriented programming)의 약어입니다. 자세한 내용은 관점 지향 프로그래밍(Aspect-oriented programming)을 검토해보세요!

SpringBoot는 어떻게 설치해요?

설치하는 방법에 대해서는 Spring Boot with STS(Spring Tool Suite)를 참조하세요.

또한 Entity, Repository에 대해서 SpringBoot JPA 예제를 확인하세요.

데모 프로젝트 구성

AOP가 무엇인지도 알았고, SpringBoot도 설치가 되었다면 이제부터 실제로 프로젝트를 만들어 봅시다.

프로젝트 생성

sts에서 New Spring Starter Project를 만듭시다. 구성내용은 다음처럼 했습니다.

Name : aop
Type : Gradle Project
Packaging : Jar
Java Version : 1.7
Language : Java
Boot Version : 1.2.3
Group : kr.jdm
Artifact : aop
Version : 0.0.1-SNAPSHOT
Description : Demo project for Spring Boot
Package : aop
Dependencies : AOP, H2, JPA, Web

ServiceAspect

ServiceAspect라는 이름의 클래스를 만들어봅시다.

package aop.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class ServiceAspect {
	
	@AfterReturning("execution(* aop..*ServiceImpl.*(..))")
	public void logServiceAccess(JoinPoint joinPoint){
	
		String result = "";
		
		result += "\n*****\n";
		result += joinPoint.getTarget().getClass().getName()+"."
				+joinPoint.getSignature().getName() +"(";
		
		int index = joinPoint.getArgs().length;
		for( Object o : joinPoint.getArgs() ){
			
			result += o;
			if( --index != 0 ){
				result += ", ";
			}
			
		}
		result += ")\n";
		
		result += "Completed:"+ joinPoint+"\n";
		result += "*****\n";		
		
		logger.debug(result);
}

클래스에 @Aspect 어노테이션으로 선언 이후, 하위 메소드에 @AfterReturning 어노테이션 선언 이후 포인트 컷 표현식을 이용해서 조인 포인트를 찾습니다. 실제로 @AfterReturning 어노테이션의 의미는 조인 포인트의 메소드 실행시 오류가 없다면 해당 공통 메소드를 실행하라는 뜻입니다.

따라서 위의 코드는 포인트 컷 표현식에 의해 조인 포인트를 맞추면 해당 조인 포인트의 로직을 처리 한 뒤에 logServiceAccess라는 메소드를 실행합니다. 실제로 Github에 첨부했던 프로젝트를 SpringBoot App으로 실행한 뒤에 http://localhost:8080/으로 접속후 콘솔을 살펴보면 다음과 같은 부분이 있습니다.

*****
aop.service.impl.MemberServiceImpl.insertMember(a, 10)
Completed:execution(void aop.service.MemberService.insertMember(String,int))
*****

어떤 메소드가 호출되었고 인자는 어떤것이 들어갔는지 알 수 있습니다. 이말은 거꾸로 얘기하면 디버깅하기에도 정말 좋다는 얘기입니다.

실제로 다음과 같은 포인트컷 표현식을 잘 이해해야 합니다.

@AfterReturning("execution(* aop..*ServiceImpl.*(..))")

aop 하위 패키지이면서 객체 이름 사이에 ServiceImpl라는 인스턴스가 있으면 하위 모든 메소드에 대해 지정된 어드바이스(Advice)를 AfterReturning 방식으로 실행하라는 얘기입니다.

그래서 프로젝트의 구조화가 중요합니다. 아무리 좋은것이라도 잘 지켜주지 않으면 안되거든요. 또한 알아보기도 쉬워야 하구요.

마무리

간단하게 AOP 적용법에 대해 알아봤습니다. :3