인증
, 트랜잭션 관리
, 로깅
등과 같은 인프라 로직을 AOP로 처리한다.1. 먼저 로깅을 적용하기 위해서는 configuration에 @EnableAspectAutoProxy
어노테이션을 지정해준다.
@EnableAspectAutoProxy
@SpringBootApplication
public class LogginApplication {
public static void main(String[] args) {
SpringApplication.run(LoggingApplication.class, args);
}
}
2. 로깅을 수행하는 Aspect 빈을 생성한다.
@Component
@Aspect
@Slf4j
class ControllerLoggingAspect {
@Pointcut("execution(* demo.logging..*Controller.*(..))")
public void loggerPointCut() {
}
@Around("loggerPointCut()")
public Object methodLogger(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object result = proceedingJoinPoint.proceed();
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
log.info("Request Body : {}", getParmas(request));
return result;
}
private static JSONObject getParams(HttpServletRequest request) {
JSONObject jsonObject = new JSONObject();
Enumeration<String> params = request.getParameterNames();
while (params.hasMoreElements()) {
String param = params.nextElement();
String replaceParam = param.replaceAll("\\\\.", "-");
jsonObject.put(replaceParam, request.getParameter(param));
}
return jsonObject;
}
}
AOP는 OOP가 미처 해결하지 못한 핵심 기능과 공통기능의 관심사의 분리를 가능하게 해주는 프로그래밍 기법이다. Aspect라는 빈을 만들어서 부가기능과 적용 시점을 정의할 수 있다.
Spring은 런타임 시점에 대상 객체에 대한 프록시 객체를 만들어 대상객체 전/후 요청을 가로채고, Aspect에 정의된 부가기능을 수행한 뒤 요청을 반환하면서 기존의 코드가 수행되게 한다.
스프링 프레임워크가 제공하는 핵심 기능 중 하나인 만큼, 개발의 생산성을 크게 높이고 더욱 모듈화된 코드를 작성할 수 있는 좋은 기법인 것 같다.