본문 바로가기

Spring

Annotation 으로 AOP 설정하기

Spring의 강력한 기능중 하나인 AOP  

우리는 이를 통해 관심을 분리해서 비즈니스 로직에 집중하고, 로깅 등 자동화 되어야할 로직등은 손쉽게 삽입, 관리할 수 있다.

 

이론상 매우 복잡한 AOP는  설정에 대해 까다롭게 생각할 이유가 없다.

 

 

스프링이 Annotation 으로 필요한 AOP 를 설정할수 있게 해주기 때문이다.

첫번째로 라이브러리를 등록하자.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

두번째,

 가장 최초 시작점인 main함수가 있는 Application클래스 의 @SpringBootApplication 위에  "@EnableAspectJAutoProxy"를 작성해주자. 

우리는 이를 통해서 Aspectj 를 사용할 떄 AOP를 찾을 수 있게 해준다.

@SpringBootApplication
@EnableAspectJAutoProxy
public class ExamApplication {
	
    public static void main(String[] args) {
		SpringApplication.run(ScBackendApplication.class, args);
	}
}

세번째,

 이때  " 공통관심 로직" 이 담겨 있는 클래스를 생성한다.

 "공통관심 로직"은 메소드로서 작성하며 ,

해당 메소드에는 @시점(  execution( 해당 대상 )  ) 어노테이션을 기재해주면 된다.

@Aspect
@Component
public class LogAspect {
    Logger logger =  LoggerFactory.getLogger(LogAspect.class);
    
    /* AOP가 작동될 시점과 대상 설정 */
    @Around("execution(* com.example.demo.service.BookService.*(..))")
    //@Around("execution(* com.example.demo.controller..*.*(..))")
    //@Around("execution(* com.example.demo..*.*(..))")
    public Object logging(ProceedingJoinPoint pjp) throws Throwable {  //around는 ProceedingJoinPoint를 받는다.
        logger.info("start - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName());
        Object result = pjp.proceed();   //로깅이 되고, AOP 가 걸려있던 메소드가 진행된다.
        logger.info("finished - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName());
        return result;
    }
}

    @Before("execution(*. com.example.demo.controller..*.*(..))")
    public Object logging(JoinPoint jp) throws Throwable{
	    logger.info(jp.getSignature().getName());  //호출된 메소드명
    }