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");
}
}