ControllerInterceptor

개발새발·2023년 1월 1일
0

spring

목록 보기
11/26

Spring 을 사용하여 개발하다가 다른분이 만들어둔 ControllerInterceptor 를 보고 정리를 다시해야겠다 생각을 하게 됐다. 일단 내가 이해했을 때는 middleware 같은 아이라고 이해했다. 자세히 살펴보자.

Interceptor 전에..

AOP란?

인프라 혹은 부가기능의 모듈화를 말한다. 각 모듈의 주 목적 외에 필요한 부가적인 기능들을 해준다. 예를 들어, 로깅, 트랜잭션, 보안 등을 말한다.

  • AOP 용어
    Target: 부가기능을 부여하는 대상
    Aspect: 부가기능 모듈
    Advice : 실질적으로 부가기능을 담은 구현체
    PointCut: 부가기능이 적용될 대상을 선정하는 방
    JoinPoint: Advice가 적용될 수 있는 위치

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 이고, 받을 때 형변환이 필요하다.

profile
발새발개

0개의 댓글