본문으로 바로가기

[Spring / AOP] Filter, Interceptor, AOP(스프링의 대표개념)

category 스프링 2020. 1. 29. 18:29

 Filter, Interceptor, AOP의 흐름


[출처] https://goddaehee.tistory.com/154

 

Interceptor와 Filter는 Servlet 단위에서 실행된다. <> 반면 AOP는 메소드 앞에 Proxy패턴의 형태로 실행된다.

 

1. 서버를 실행시켜 서블릿이 올라오는 동안에 init이 실행되고, 그 후 doFilter가 실행된다. 

2. 컨트롤러에 들어가기 전 preHandler가 실행된다

3. 컨트롤러에서 나와 postHandler, after Completion, doFilter 순으로 진행이 된다.

4. 서블릿 종료 시 destroy가 실행된다.


출처: https://goddaehee.tistory.com/154 [갓대희의 작은공간]

 

 

Filter, Interceptor, AOP의 개념


Filter

필터는 스프링 컨텍스트 외부에 존재한다.

DispatcherServlet 이전에 실행되며, 스프링과 무관하게 지정된 자원에 대해 동작한다.

 

필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.

또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다.

 

필터는 web.xml에 등록하는데 대표적으로 인코딩 변환, 로그인 여부확인, 권한체크, XSS방어 등의 요청에 대한 처리로 사용된다.

출처: https://javawork.tistory.com/entry/Spring-Filter-Interceptor-AOP [Vision Factory]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <!-- post 방식 전송될때  한글 깨지지 않도록 Spring 인코딩 필터 정의하기  -->
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <!-- Spring 인코딩 필터 맵핑하기 -->
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>    
cs

 

[필터의 실행 메서드]

  • init() - 필터 인스턴스 초기화
  • doFilter() - 전/후 처리
  • destroy() - 필터 인스턴스 종료

출처: https://javawork.tistory.com/entry/Spring-Filter-Interceptor-AOP [Vision Factory]

 

Interceptor

인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트 내부에 존재하게된다. 그리고 스프링 내의 모든 객체(bean) 접근이 가능하다.

 

인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인, 업로드 파일처리등에 사용된다.

 

[인터셉터 실행 메서드]

 

  • preHandler() - 컨트롤러 메서드가 실행되기 전
  • postHanler() - 컨트롤러 메서드 실행직 후 view페이지 렌더링 되기 전
  • afterCompletion() - view페이지가 렌더링 되고 난 후

출처: https://javawork.tistory.com/entry/Spring-Filter-Interceptor-AOP [Vision Factory]

 

 

 

AOP

AOP는 다루어야할 내용이 많으므로 섹션을 나누어 아래에서 자세히 설명한다.

 

 

AOP


1. AOP 프로그래밍이란?

관점 지향 프로그래밍(Aspect Orented Programming) 이라고 한다.

AOP의 등장으로 인해 OOP(객체지향 프로그래밍)을 더욱 OOP답게 할 수 있게 되었다.

AOP는 기능을 비지니스 로직과 공통 모듈로 구분한 후에 개발자의 코드 밖에서 필요한 시점에 비지니스 로직에 삽입하여 실행되도록 한다. 즉, OOP에서는 공통적인 기능을 각 객체의 횡단으로 입력했다면, AOP는 공통적인 기능을 종단간으로 삽입할 수 있도록 한 것이다

기존의 OOP로직의 흐름은 계정, 게시판, 계좌이체를 처리할 때마다 똑같이 권한, 트랜잭션, 로깅을 처리해야하기 때문에 모든 로직에 똑같은 코드가 반복적으로 삽입될 수 밖에 없다. 즉, 권한, 로깅, 트랜잭션이라는 관심(Aspect)이 횡단으로 삽입되는 것이다.

 

하지만 AOP는 이러한 관심을 종단으로 삽입할 수 있도록 해준다. 기존의 OOP로직에서는 각 객체별로 처리했던 것들을 각 관점별로 외부에서 접근하는 것이 AOP의 핵심이다.

 

개발자는 계정, 게시판, 계좌이체와 같은 기능을 만들고, 공통적인 관심을 처리하는 모듈을 분리해서 개발한 뒤, 필요한 시점에 자동으로 소스코드가 삽입되도록 하는 것이다.

 

AOP의 기능

1.전달된 인자에 대한 조사 가능

2.리턴 해주는 data에 대해 조사 가능

3.리턴된 data를 바꿔서 전달 가능

4.log 찍는 기능

5.트렌젝션 관리 기능

   (트렌젝션이란? https://coding-factory.tistory.com/226 )



출처: https://javawork.tistory.com/entry/Spring-Filter-Interceptor-AOP [Vision Factory]

 

AOP를 사용하여 구현하는 기법

- 바이트 코드를 조작하기

컴파일시 생기는 .class 파일을 조작하는것 

- proxy 패턴을 조작하는 방법

내부적으로 AOP가 적용된 객체(proxy)를 생성하고, Proxy 객체를 사용하는 것. 

 

 

2. AOP 주요 용어와 흐름

[출처] https://devbox.tistory.com/entry/spring-AOP-%EC%9A%A9%EC%96%B4-%EC%84%A4%EB%AA%85

 Aspect

구현하고자 하는 횡단 관심사(로깅, 트랜잭션, 권한 등)의 기능을 의미한다.

한개 이상의 포인트컷과 어드바이스의 조합으로 만들어진다.

 

JoinPoint

관점(Aspect)를 삽입하여 어드바이스가 적용될 수 있는 위치를 의미한다.

method를 호출하는 시점, 예외가 발생하는 시점 등과 같이 특정 작업이 실행되는 시점을 의미하기도 한다.

 

Advice

관점(Aspect)의 구현체로 Join Points에서 실행되어야 하는 코드(실제로 AOP 기능을 구현한 객체)

Advice는 Join Point와 결합하여 동작하는 시점에 따라 5개로 구분된다.

 

 

 

cp.) 스프링의 Advice 타입

- Around Advice: Joinpoint 앞과 뒤에서 실행되는 Adcvice

- Before Advice: Joinpoint 앞에서 실행되는 Advice

- After Returning Advice: Jointpoint 메서드 호출이 정상적으로 종료된 뒤에 실행되는 Advice

- After Throwing Advice: 예외가 던져질 때 실행되는 Advice

- Introduction:  클래스에 인터페이스와 구현을 추가하는 특수한 Advice

 

 

 

Pointcut

관점(Aspect)를 삽입하여 어드바이스가 적용될 수 있는 위치를 의미한다.
스프링에서는 정규 표현식이나 AspectJ 문법을 이용하여 Pointcut을 정의할 수 있다.

 

[Aspectj Expression]

참고 블로그

https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:fdl:aop:aspectj

 

Target

어드바이스를 받을 대상. 즉, 핵심 로직을 구현하는 클래스를 말한다.

비지니스로직을 수행하는 클래스일수도 있지만, 프록시 객체(Object)가 될 수도 있다.

 

Proxy

대상 객체에 Advice가 적용된 후 생성된 객체

 

 

4. Weaving

Advice를 핵심 로직 코드에 적용하는 것을 weaving 이라고 한다.(분리한 관점을 여러 차례 모률에 삽입하는 것을 AOP에서는 위빙 (Weaving: 엮기)이라고 부른다.) 즉 공통 코드를 핵심 로직 코드에 삽입하는 것이 weaving이다.

어드바이스를 핵심 로직 코드에 삽입하는 것을  위빙이라고 한다.

Aspect를 target 객체에 제공하여 새로운 프록시 객체를 생성하는 과정을 말한다.

 

 

[출처]https://devbox.tistory.com/entry/spring-AOP-%EC%9A%A9%EC%96%B4-%EC%84%A4%EB%AA%85

[출처]https://javawork.tistory.com/entry/Spring-Filter-Interceptor-AOP

 

 

 

 

3. AOP 설정하기

[Pom.xml] 에 라이브러리 추가

maven 으로 관리되는 라이브러리 문서에 아래의 코드를 붙여 넣고 저장을 하면 자동으로 다운로드가 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  <dependencies>
      <!-- 스프링 기본 라이브러리  -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>
      <!-- Aop 용 라이브러리 -->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-aop</artifactId>
           <version>4.0.0.RELEASE</version>
      </dependency>
    <dependency>
           <groupId>org.aspectj</groupId>
           <artifactId>aspectjweaver</artifactId>
           <version>1.8.0</version>
     </dependency>
    <dependency>
           <groupId>cglib</groupId>
           <artifactId>cglib</artifactId>
           <version>3.2.0</version>
      </dependency> 
  </dependencies>
cs

 

[servlet-context.xml]의 Namespace에 AOP 추가

 

servlet-context.xml에 aop 태그 추가

<aop:aspectj-autoproxy />

 

 

4. AOP사용 예시

https://sallykim5087.tistory.com/164