SPRING 주기능(IOC/AOP), AOP와 인터셉터와 필터 비교

조승현·2022년 8월 31일
0

IOC > DI, DL : 객체를 미리 만들어두고 주입해주는 기능이다
AOP > 강점지향프로그램 : 메서드이름을 가로챈다 (웹어플리케이션에서는 잘 사용하지 않는다 - 요청을 가로채는 필터를 사용하기 때문이다)

AOP와 비슷한 기능
필터(servlet메인기능), 인터셉터(spring옵션기능), AOP(spring메인기능)

  • 필터 : 요청을 가로챈다(controller), 서블릿 전에
    - Application.java 에 @ServletComponentScan 추가
  • 인터셉터 : 요청을 가로챈다(controller), 서블릿과 같은순서
    - 인터셉터를 사용하기 위한 방법
    • Application.java 에 implements WebMvcConfigurer를 추가한다.
    • addInterceptors를 override한다.
    • 만들어 둔 인터셉터를 주입받아서 경로를 지정한다.
  • AOP : 메서드를 가로챈다, 범위가 가장 크다(mapper, service, controller)
    - AOP 사용하는 방법
    • Maven Repository에 가서 spring boot starter aop를 가져와서 pom.xml에 추가

Application.java

package com.gd.web0830;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.gd.web0830.commons.TargetInterceptor;

@SpringBootApplication
@ServletComponentScan
public class Web0830Application implements WebMvcConfigurer {
	// 객체받기
	@Autowired TargetInterceptor targetInterceptor;

	public static void main(String[] args) {
		SpringApplication.run(Web0830Application.class, args);
	}

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		
		registry.addInterceptor(targetInterceptor).addPathPatterns("/target/*");
		WebMvcConfigurer.super.addInterceptors(registry);
	}
	
}

MsgController.java

package com.gd.web0830.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.gd.web0830.commons.TeamColor;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
public class MsgController {
	@GetMapping("/target/msg")
	public String msg() {
		String msg = "***************"; // 1) Filter   2) Interceptor   3) AOP 
		log.debug(TeamColor.BACK_CYAN + msg);
		return msg;
	}
}

TargetFilter.java

package com.gd.web0830.commons;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@WebFilter("/target/*")
public class TargetFilter extends HttpFilter implements Filter {
       
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		// 선행
		log.debug(TeamColor.BACK_CYAN + "Before Filter");
		
		chain.doFilter(request, response);
		
		// 후행
		log.debug(TeamColor.BACK_CYAN + "After Filter");
	}
}

TargetInterceptor.java

package com.gd.web0830.commons;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class TargetInterceptor implements HandlerInterceptor {

	// 선행
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		log.debug(TeamColor.BACK_YELLOW + "Before Interceptor");
		return HandlerInterceptor.super.preHandle(request, response, handler);
	}

	// 후행
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		log.debug(TeamColor.BACK_YELLOW + "After Interceptor");
		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
	}
	
}

TargetAspect.java

package com.gd.web0830.commons;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Aspect
@Component
public class TargetAspect {
	@Before("execution(* com.gd.web0830.controller.MsgController.msg(..))") // 여러개일수도 있기 때문에 (..) - 오버로딩때문에
	public void beforeMathod() {
		log.debug(TeamColor.BACK_PURPLE + "Before AOP");
	}
	@After("execution(* com.gd.web0830.controller.MsgController.msg(..))")
	public void afterMathod() {
		log.debug(TeamColor.BACK_PURPLE + "After AOP");
	}
}
profile
소통을 좋아하는 개발자입니다

0개의 댓글