>>AOP
1. AOP 관련 라이브러리 추가,(spring-tx :트랜잭션 처리를 위한 라이브러리)
<!-- 트랜잭션 처리 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- AOP관련 라이브러리 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${org.springframework-version}</version> </dependency> |
2. AOP기능 적용을 위해서는 AspectJ 언어의 문법을 이용함. >라이브러리 추가
<!-- AspectJ --> <dependency> <groupId>aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.5.4</version> </dependency>
<dependency> <groupId>aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.5.4</version> </dependency> |
3. root-context.xml 설정
aop,context,mybatis-spring,tx에 체크
<context:component-scan base-package="org.zerock.persistence"></context:component-scan> <context:component-scan base-package="org.zerock.service"></context:component-scan> <context:component-scan base-package="org.zerock.aop"></context:component-scan>
<aop:config></aop:config> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> |
>>Interceptor
단순 로그인 처리를 하는 가장 간단한 방법은 Servlet의 Filter와 유사한 인터셉터(Interceptor)를 활용하는 방법이다.
인터셉터는 웹 애플리케이션 내에서 특정한 URI 호출을 가로채는 역할을 함.
기존 컨트롤러의 로직을 수정하지 않고도 사전이나 사후 제어가 가능함.
Filter와 Interceptor
Filter와 인터셉터는 특정 URI에 접근할 때 제어하는 용도로 사용되나 가장 큰 차이는. Interceptor는 스프링에서 관리되기 때문에 스프링 내의 모든 객체(빈)에 접근이 가능함.
Spring AOP 기능과 HandlerInterceptor의 차이
사전,혹은 사후 처리기능을 둘다 할 수 있지만 일반적인 경우라면 인터셉터를 활용한다.
Advice의 경우 JointPoint나 ProceedingJointPoint 등을 활용해서 호출 대상이 되는 메소드의 파라미터 등을 처리하는 방식임.
인터셉터는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 받는 구조임.
-------------------------------------------
환경설정
servlet-context.xml - SampleInterceptor.java를 org.zerock.interceptor 패키지에 만든 상태임.
SampleInterceptor를 스프링에 인식하려면 servlet-context.xml에 설정을 추가해야함. 인터셉터의 경우 URI설정이 추가됨.
각 인터셉터의 <mapping>에는 원하는 URI를 지정함. **나 *와 같은 패턴을 적용할 수 있다.
XXXInterceptor.java 파일의 경우 HandlerInterceptorAdapter를 상속받아 메소드를 오버라이드 해서 사용한다.
postHandle 메소드 : 컨트롤러 동작 이후에 처리. Spring MVC의 Front Controller인 DispatcherServlet이 화면을 처리하기 전에 동작.
preHandle 메소드 : 컨트롤러 동작 이전에 가로채는 역할로 사용 가능
afterCompletion 메소드 : DispatcherServlet의 화면처리가 완료된 상태에서 처리
<!-- 인터셉터 설정 --> <beans:bean id="sampleInterceptor" class="org.zerock.interceptor.SampleInterceptor"></beans:bean>
<interceptors> <interceptor> <mapping path="/doA"/> <mapping path="/doB"/> <beans:ref bean ="smapleInterceptor"/> </interceptor> </interceptors> |
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
에서 handler는 현재 실행하려는 메소드 자체를 의미합니다.