안녕하세요 오늘은 스프링 부트 AOP를 통해 Controller 호출로그와 파라미터 넘기기를 해보려고 합니다.
많은 글에서 AOP를 통해 로그를 찍긴 하지만 파라미터를 어떻게 넘길 수 있는지는 설명이 없어서 직접 경험하고 찾아서
한번 만들어 보았습니다. 이경우 리플렉션의 사전 지식이 필요합니다.
build.gradle
compile 'org.springframework.boot:spring-boot-starter-aop'
LogAop
@Component
@Aspect
public class LogAop {
Logger logger = LoggerFactory.getLogger(LogAop.class);
@Around("execution(* com.develop.kr.tddproject.controller..*Controller.*(..))")
public Object controllerLog(ProceedingJoinPoint joinPoint) throws Throwable{
String callName = joinPoint.getSignature().getName();
logger.info(String.format("CONTROLLER -> %s API Call", callName));
Long startTime = System.currentTimeMillis();
Object[] parameterValues = joinPoint.getArgs();
for(Object ob : parameterValues){
if(ob.getClass().getName().equals(ReqeustTest.class.getName())){
Method method = ob.getClass().getMethod("setKeyValue",String.class);
method.invoke(ob,"STRING_KEY_POONEY");
}
}
Object result = joinPoint.proceed();
Long endTime = System.currentTimeMillis();
logger.info(String.format("[%s , time taken] : %d ",callName ,endTime-startTime));
return result;
}
}
TestController
@RequestMapping("test")
@RestController
public class TestController {
final Logger logger = LoggerFactory.getLogger(this.getClass());
@GetMapping("/get")
public ResponseEntity<String> getTest(HttpServletRequest request, ReqeustTest test){
System.out.println("keyValue : "+test.getKeyValue());
return new ResponseEntity<String>(test.getKeyValue(),HttpStatus.OK);
}
}
RequestTest
@ToString
@Getter
@Setter
public class ReqeustTest {
private String name;
private int age;
private String keyValue;
}
[결과화면]
LogAop에서 넣어준 STRING_KEY_POONEY가 출력 되는 것을 확인 할 수 있습니다.
'Spring boot' 카테고리의 다른 글
Spring boot @PropertySource로 yml 로드 방법 (3) | 2021.11.07 |
---|---|
Spring boot - jenkins(젠킨스) webhook 연동 (0) | 2021.10.04 |
Spring boot Gradle 을 이용한 WAR 배포 (0) | 2021.02.05 |
Spring boot @JsonFilter (0) | 2020.07.05 |
Spring boot @Valid를 사용하여 유효성 체크 (0) | 2020.07.05 |