개발/JAVA

[JAVA] aop - Aspect 이용하여 모든 controller 공통 적용하기

반응형

서론

이전 글 https://hjh0827.tistory.com/88 에서 프로젝트에서 호출하는 api의 controller 메소드명을 DB에 저장해달라는 요건을 받고 처리하려고 하였는데 모든 메소드에 쓰는건 비효율적이라 다른 방법을 정리한다.

 

Maven Dependencies

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

pom.xml에 추가한다.

 

소스

package com.example.demo.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class ControllerAspect {
	// 모든 controller를 intercept
    @Around("execution(* com.example.demo.controller..*Controller.*(..))")
    public Object controllerAround(ProceedingJoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        String methodName = joinPoint.getSignature().getName();

        for( Object arg : args ) {
            // dto에 extends 한 정보 확인(baseEntiry는 공통 정보)
//            if ( arg instanceof BaseEntity ) {
//                BaseEntity dto = (BaseEntity) arg;
//                if ( dto != null ) {
//                    if("".equals(dto.getRegPrmId())) dto.setRegPgmId(methodName);
//                }
//            }
        }
		return methodName;
    }

}

 

ProceedingJoinPoint 인터페이스의 제공 메서드

 메서드  설명 
 Signature getSignature()   호출되는 메서드에 대한 정보를 구한다. 
 Object getTarget()   대상 객체를 구한다. 
 Object[] getArgs()   파라미터의 목록을 구한다. 

 

org.aspectj.lang.Signature 인터페이스는 호출되는 메서드와 관련된 정보를 제공하며 다음과 같은 메서드를 정의하고 잇다.

  메서드  설명 
 String getName   메서드의 이름을 구한다. 
 String toLongString()   메서드를 완전하게 표현한 문장을 구한다. (메서드의 리턴 타입, 파라미터 타입이 모두 표시된다.) 
 String toShortString()   메서드를 축약해서 표현한 문장을 구한다. (기본 구현은 메서드의 이름만을 구한다. 
반응형