Spring 을 사용하여 개발하다가 다른분이 만들어둔 ControllerInterceptor 를 보고 정리를 다시해야겠다 생각을 하게 됐다. 일단 내가 이해했을 때는 middleware 같은 아이라고 이해했다. 자세히 살펴보자.
Interceptor 전에..
인프라 혹은 부가기능의 모듈화를 말한다. 각 모듈의 주 목적 외에 필요한 부가적인 기능들을 해준다. 예를 들어, 로깅, 트랜잭션, 보안 등을 말한다.
client로부터 들어오는 요청을 controller의 handler로 도달하기전에 가로채거나 controller부터 보내는 응답을 가로채는 역할을 말한다. 즉, 요청 선처리 작업 시행이라고 한다.
Spring단 interceptor 위치
package com.pacakage.aop;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Slf4j
@RequiredArgsConstructor
@Aspect
@Component
public class Interceptor {
private final HttpServletRequest request;
@Around("execution(* com.xxx.yy*(..))")
public Object preProcessMethod(ProceedingJoinPoint pjp) throws Throwable {
Object[] args = pjp.getArgs();
Dto dto = (Dto) args[0];
dto.setFixedName("name");
return pjp.proceed(new Object[] {dto, args[1]});
}
}
@Aspect : Aspect 클래스임을 명시
@Around : 메소드 실행 전 후
"execution( com.xxx.yy(..))" : 포인트 컷. / execution = 지정자, *~ = 타겟 명시
proceedingJoinPoint.proceed : Around 어드바이스는 메소드 실행 전 후로 나뉘어서 타겟 메소드에 대한 정보를 호출해야한다. proceed
기준으로 이전 코드는 before, 이후 보드는 after로 구분된다. 해당 메소드의 리턴값은 object 이고, 받을 때 형변환이 필요하다.