• 워드프레스 → 라이믹스 블로그 이전 완료 일주일 동안 열지 않기
  • 목록
  • 아래로
  • 위로
  • 검색

Spring 스프링 Filter, Interceptor, AOP 정리

키큰난쟁이 키큰난쟁이
18 2 0

 

들어가며

 

📌스프링은 자바 기반의 오픈 소스 프레임워크로, 애플리케이션 개발을 위한 다양한 기능을 제공합니다. 스프링의 중요한 개념 중에는 필터(Filter), 인터셉터(Interceptor) 및 관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)이 있습니다. 이들은 애플리케이션의 동작을 제어하고 조정하는 데 사용됩니다. 스프링 필터, 인터셉터 및 AOP의 차이와 각각의 역할에 대해 알아보겠습니다.

 


 

스프링 Filter, Interceptor, AOP의 흐름

 

Filter, Interceptor, AOP의 흐름도

흐름도.png.jpg

 

Filter, Interceptor, AOP의 흐름도 설명

  • 서버를 실행시켜 서블릿이 올라오는 동안에 init이 실행되고, 그 후 doFilter가 실행된다. 
  • 컨트롤러에 들어가기 전 preHandler가 실행된다
  • 컨트롤러에서 나와 postHandler, after Completion, doFilter 순으로 진행이 된다.
  • 서블릿 종료 시 destroy가 실행된다.

 


 

스프링 필터(Filter)

 

필터란?

  • 스프링 필터(Filter)는 HTTP 요청 및 응답을 처리하기 전후에 특정 작업을 수행하는 컴포넌트입니다. 필터는 서블릿 컨테이너 내에서 동작하며, 클라이언트로부터 오는 요청이나 서버에서 클라이언트로 보내는 응답을 가로채서 가공할 수 있습니다.

 

필터의 동작 원리

  • 스프링 필터는 DispatcherServlet 이전에 실행되며, 요청과 응답을 처리하는 도중에 개입하여 특정 작업을 수행합니다. 일반적으로 웹 애플리케이션의 전체적인 동작에 영향을 주는 역할을 합니다. 필터는 javax.servlet.Filter 인터페이스를 구현하여 작성하며, doFilter() 메서드를 통해 요청과 응답을 가로채고 처리합니다.

 

필터의 주요 용도

  • 인증과 권한 부여 : 필터를 사용하여 사용자의 인증과 권한 부여를 처리할 수 있습니다. 인증된 사용자만이 액세스할 수 있는 리소스에 대한 요청을 거부하거나, 특정 권한을 가진 사용자에 대한 요청을 처리할 수 있습니다.
  • 로깅과 감사 : 필터를 사용하여 요청 및 응답의 로그를 기록하고 감사할 수 있습니다. 이를 통해 애플리케이션의 동작을 모니터링하고 문제를 식별하는 데 도움이 됩니다.
  • 데이터 변환 및 처리 : 필터를 사용하여 요청 및 응답의 데이터를 변환하거나 처리할 수 있습니다. 예를 들어, 요청의 인코딩을 변경하거나 응답의 데이터를 압축할 수 있습니다.
  • 예외 처리 : 필터를 사용하여 애플리케이션 내에서 발생하는 예외를 처리할 수 있습니다. 예외를 적절히 처리하고 사용자에게 적절한 오류 메시지를 표시함으로써 애플리케이션의 안정성을 향상시킬 수 있습니다.
  • 캐싱과 성능 최적화 : 필터를 사용하여 요청 및 응답을 캐시하고 성능을 향상시킬 수 있습니다. 반복적인 요청에 대한 응답을 캐시하여 서버 부하를 줄이고 응답 시간을 단축시킬 수 있습니다.

 

필터 사용 방법

  1. init()
    • init() 메소드는 필터 객체가 생성되고 준비 작업을 위해 딱 한번 호출된다. 서블릿의 init()과 같은 용도이다. 이 메소드의 매개변수는 FilterConfig의 인스턴스이다. 이 인스턴스를 통해 필터 초기화 매개변수의 값을 꺼낼수 있다. 위 코드에서는 doFilter()에서 사용하기 위해 인스턴스 변수 config에 저장한다.
  2. doFilter()
    • 필터와 매핑된 URL에 요청이 들어올때마다 doFilter()가 호출된다. 이 메소드에 필터가 할 작업을 작성한다.
    • filterChain은 다음 필터를 가리키고 filterChain.doFilter()는 다음 필터를 호출한다. 다음 필터가 없다면 내부적으로 서블릿의 service()를 호출한다.
    • 서블릿이 실행되기 전에 처리할 작업은 filterChain.doFilter() 이전에, 서블릿이 실행된 후에 처리할 작업은 filterChain.doFilter() 이후에 작성한다.
    • 본 예제에서는 서블릿이 실행되기 전에 request parameter의 문자 집합을 먼저 설정하기 위해 filterChain.doFilter() 이전에 setCharacterEncoding()을 호출했다.
  3. destroy()
    • 서블릿 컨테이너는 웹 어플리케이션을 종료하기 전에 필터들에 대해 destroy()를 호출해서 마무리 작업을 한다. 본 예제는 특별히 마무리할 작업이 없으므로 빈 메소드로 둔다.
import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
        // 필터 초기화 작업
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 요청 및 응답 처리 작업
        chain.doFilter(request, response); // 다음 필터로 전달
    }

    public void destroy() {
        // 필터 종료 작업
    }
}

 

↓ 필터를 어떤 URL 패턴에 적용할지 설정합니다. 이를 위해 web.xml 필터를 등록해야됩니다.

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/example/*</url-pattern> <!-- 적용할 URL 패턴 설정 -->
</filter-mapping>

 


 

스프링 인터셉터(Interceptor)

 

인터셉터란?

  • 스프링 인터셉터(Interceptor)는 스프링 MVC에서 컨트롤러의 호출 전후에 특정 작업을 수행하는 기능입니다. 인터셉터는 스프링의 핸들러 인터셉터 인터페이스를 구현하여 작성됩니다.

 

인터셉터의 동작 원리

  • 인터셉터는 컨트롤러의 실행 전후에 개입하여 추가적인 작업을 수행합니다. 예를 들어, 인증 및 권한 확인, 세션 관리, 로깅 등의 작업을 수행할 수 있습니다. 인터셉터는 컨트롤러 실행 전에 호출되는 preHandle() 메서드와 컨트롤러 실행 후에 호출되는 postHandle() 메서드로 구성됩니다.

 

인터셉터의 주요 용도

  • 요청 및 응답 로깅 : Interceptor를 사용하여 요청 및 응답 데이터를 로깅하고, 디버깅 및 모니터링 목적으로 사용할 수 있습니다. 이는 시스템의 동작을 추적하고 문제를 해결하는 데 도움이 됩니다.
  • 보안 : Interceptor를 사용하여 인증 및 권한 부여를 구현할 수 있습니다. 예를 들어, 로그인 여부를 확인하고 특정 URL이나 리소스에 접근하는 권한을 확인할 수 있습니다.
  • 예외 처리 : Interceptor를 사용하여 예외를 처리하고, 예외 상황에 대한 적절한 응답을 생성할 수 있습니다. 이는 애플리케이션의 안정성을 향상시키고, 사용자에게 더 좋은 경험을 제공하는 데 도움이 됩니다.
  • 성능 측정 : Interceptor를 사용하여 애플리케이션의 성능을 측정하고, 부하가 많은 부분을 식별할 수 있습니다. 이를 통해 성능 최적화를 수행하고, 애플리케이션의 반응 시간을 개선할 수 있습니다.
  • 데이터 변환 : Interceptor를 사용하여 요청 및 응답 데이터를 변환할 수 있습니다. 예를 들어, JSON 데이터를 객체로 변환하거나, 객체를 JSON으로 변환할 수 있습니다.

 

인터셉터 사용 방법

  • preHandler() – 컨트롤러 메서드가 실행되기 전
  • postHanler() – 컨트롤러 메서드 실행직 후 view페이지 렌더링 되기 전
  • afterCompletion() – view페이지가 렌더링 되고 난 후
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // preHandle 로직 구현
        // 요청 처리 전에 실행됩니다.
        return true; // 또는 false를 반환하여 요청 처리를 중단할 수 있습니다.
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // postHandle 로직 구현
        // 요청 처리 후에 실행됩니다.
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // afterCompletion 로직 구현
        // 응답 완료 후에 실행됩니다.
    }
}

 

↓ Interceptor가 적용될 URL 패턴을 설정합니다. 이를 위해 dispatcher-servlet.xml 요소를 등록해야됩니다.

 

<!-- XML 설정 파일 내에서 Interceptor 등록 -->
<mvc:interceptors>
    <!-- 첫 번째 Interceptor 등록 -->
    <mvc:interceptor>
        <!-- 첫 번째 Interceptor의 적용 URL 패턴 설정 -->
        <mvc:mapping path="/secure/**"/>
        <!-- 첫 번째 Interceptor 클래스 등록 -->
        <bean class="com.example.FirstInterceptor"/>
    </mvc:interceptor>
    
    <!-- 두 번째 Interceptor 등록 -->
    <mvc:interceptor>
        <!-- 두 번째 Interceptor의 적용 URL 패턴 설정 -->
        <mvc:mapping path="/public/**"/>
        <!-- 두 번째 Interceptor 클래스 등록 -->
        <bean class="com.example.SecondInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

 


 

 스프링 AOP(관점 지향 프로그래밍)

 

AOP란?

  • 관점 지향 프로그래밍(AOP)은 소프트웨어 개발에서 횡단 관심사(cross-cutting concern)를 모듈화하는 기법입니다. AOP는 주요 비즈니스 로직과는 별개로 횡단 관심사를 분리하여 개발하고, 이를 필요한 부분에 적용할 수 있도록 지원합니다.

 

AOP의 동작 원리

  • AOP는 프록시 패턴을 이용하여 동작합니다. 핵심 로직을 실행하는 주요 객체는 프록시 객체에 의해 감싸져서 호출되며, 횡단 관심사는 프록시 객체 내에서 처리됩니다. AOP는 주로 메서드 호출, 예외 처리, 트랜잭션 관리 등의 측면에서 활용됩니다.

 

AOP의 주요 용도

  • 로깅 : AOP를 사용하여 애플리케이션의 다양한 부분에서 로그를 기록할 수 있습니다. 예를 들어, 메서드 호출 시간, 인자 값, 반환 값 등을 기록할 수 있습니다.
  • 트랜잭션 관리 : AOP를 사용하여 애플리케이션의 트랜잭션 처리를 자동화할 수 있습니다. 예를 들어, 메서드 실행 전후에 트랜잭션을 시작하고 커밋 또는 롤백할 수 있습니다.
  • 보안 : AOP를 사용하여 애플리케이션의 보안 기능을 구현할 수 있습니다. 예를 들어, 특정 메서드에 대한 인가 또는 인증을 수행하거나, 암호화 및 복호화를 자동으로 처리할 수 있습니다.
  • 캐싱 : AOP를 사용하여 반복적으로 실행되는 메서드의 결과를 캐싱할 수 있습니다. 이를 통해 애플리케이션의 성능을 향상시킬 수 있습니다.
  • 예외 처리 : AOP를 사용하여 애플리케이션에서 발생하는 예외를 처리할 수 있습니다. 예를 들어, 특정 예외가 발생했을 때 특정 작업을 수행하거나 예외를 변환하여 처리할 수 있습니다.
  • 권한 부여 : AOP를 사용하여 애플리케이션의 권한 부여 기능을 구현할 수 있습니다. 예를 들어, 특정 메서드에 대한 접근 권한을 확인하고 부여할 수 있습니다.

 

AOP의 주요 개념

  • Aspect : 위의 사진에서 처럼 Aspect 안에 모듈화 시킨 것을 의미한다.
  • Advice : 실질적으로 어떤 일을 해야하는지를 담고 있다.
  • Pointcut : 어디에 적용해야 하는지에 대한 정보를 담고 있다.
  • Target : Aspect에 적용이 되는 대상
  • Join point : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능(여러가지 합류 지점임)

AOP의 사용 방법

  1. before, after, after-returning, after-throwing, around  5가지의 동작 시점이 존재

    • @Before: 대상 메소드의 수행 전
    • @After: 대상 메소드의 수행 후
    • @After-returning: 대상 메소드의 정상적인 수행 후
    • @After-throwing: 예외발생 후
    • @Around: 대상 메소드의 수행 전, 후

↓ 5가지의 동작 시점 예시

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.MyService.*(..))")
    public void beforeMethod(JoinPoint joinPoint) {
        System.out.println("메서드 호출 전에 실행됩니다.");
    }

    @After("execution(* com.example.MyService.*(..))")
    public void afterMethod(JoinPoint joinPoint) {
        System.out.println("메서드 실행 후에 실행됩니다.");
    }

    @AfterReturning(pointcut = "execution(* com.example.MyService.*(..))", returning = "result")
    public void afterReturningMethod(JoinPoint joinPoint, Object result) {
        System.out.println("메서드 정상 반환 후에 실행됩니다.");
    }

    @AfterThrowing(pointcut = "execution(* com.example.MyService.*(..))", throwing = "exception")
    public void afterThrowingMethod(JoinPoint joinPoint, Exception exception) {
        System.out.println("예외 발생 후에 실행됩니다.");
    }

    @Around("execution(* com.example.MyService.*(..))")
    public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("메서드 호출 전에 실행됩니다.");

        Object result = joinPoint.proceed();

        System.out.println("메서드 호출 후에 실행됩니다.");

        return result;
    }
}

 


 

필터, 인터셉터 및 AOP의 차이점

 

개념적 차이

  • 필터 : HTTP 요청 및 응답을 처리하기 위해 사용되며, 서블릿 컨테이너 내에서 동작합니다.
  • 인터셉터 : 스프링 MVC에서 컨트롤러의 호출 전후에 특정 작업을 수행하기 위해 사용됩니다.
  • AOP : 횡단 관심사를 모듈화하여 주요 비즈니스 로직과 분리시키는 프로그래밍 기법입니다.

 

동작 원리의 차이

  • 필터 : 서블릿 컨테이너에서 요청과 응답을 가로채어 처리합니다.
  • 인터셉터 : 스프링 MVC의 핸들러 호출 전후에 추가 작업을 수행합니다.
  • AOP : 프록시 패턴을 이용하여 횡단 관심사를 주요 로직과 분리하여 처리합니다.

 

사용의 차이

  • 필터 : 인증, 권한 부여, 데이터 변환 등과 같이 요청 및 응답 전체에 영향을 주는 작업에 사용됩니다.
  • 인터셉터 : 세션 관리, 인증, 권한 부여 등 컨트롤러 호출 전후에 추가 작업이 필요한 경우에 사용됩니다.
  • AOP : 로깅, 예외 처리, 트랜잭션 관리 등과 같이 주요 비즈니스 로직과 별개로 횡단 관심사를 처리해야 하는 경우에 사용됩니다.

 


 

마치며

 

스프링 필터, 인터셉터 및 AOP에 대해 알아보았습니다. 필터는 HTTP 요청 및 응답을 처리하기 위해 사용되며, 인터셉터는 스프링 MVC에서 컨트롤러 호출 전후에 특정 작업을 수행합니다. AOP는 횡단 관심사를 모듈화하여 주요 비즈니스 로직과 분리시키는 프로그래밍 기법입니다. 각각의 역할과 동작 원리, 주요 용도에 대해 이해하고 적절하게 사용하는 것이 중요합니다. 스프링 개발에서 필요에 따라 필터, 인터셉터, 그리고 AOP를 조합하여 애플리케이션을 효과적으로 개발하고 관리할 수 있습니다.

 


 

신고공유스크랩

댓글 0

댓글 쓰기
에디터 모드

신고

"님의 댓글"

이 댓글을 신고하시겠습니까?

댓글 삭제

"님의 댓글"

이 댓글을 삭제하시겠습니까?

공유

퍼머링크