[SPRING] DI, IOC, AOP 개념
DI, IOC, AOP 개념
1. DI(Dependency Injection)
의존성 주입
먼저 의존이란 다른코드에 의존한다는 뜻으로 아래 예를 들어보자
class A{
new b = new B();
...
}
class B{
...
}
이렇게 있을경우 클래스 A는 클래스 B에 의존한다고 말한다.
그렇다면 의존성 주입이란 무엇일까? > 자동으로 의존관계를 주입해주는 것 (IOC와 관련이 있다)
2. IOC(Inversion Of Control)
제어의 역전
일반적인 경우 Class A -> Clas B의 형태로 의존관계를 나타내지만 IOC를 사용하게 되면 Class A와 Class B 사이에 매개체(IOC Container - 프레임워크)가 의존관계를 주입해주는 방식
개발자가 직접 의존관계를 하던것을 이 권한을 빼앗겨서 더이상 개발의 주체가 개발자가 아니라 컨테이너가 수행하는것
이렇게 해주면 좀 더 유연한 프로그래밍이 가능하다
- 사용자가 직접 생성하는것이 아니기 때문에 의존성이 줄어들며 변화에 유연하게 대응할 수 있다.
- 유지보수가 용이, 테스트 용이, 코드양 감소등
3. AOP(Aspect Oriented Programming)
관점 지향 프로그래밍
용 어
- Advice : 간섭에 사용할 코드를 가진 메소드
- Aspect : Advice를 가진 클래스
- Target : 간섭 적용 대상 클래스
- JoinPoint : Target 내부의 실제 적용 대상 메소드
- PointCut : Target과 JoinPoint를 특정하기 위한 식
- Weaving : 실제 간섭 행위
@Before , @After , @Around
@RestController
public class DemoController{
@GetMapping("/hello")
public String hello(){
return "Hello AOP";
}
}
@Aspect
@Component
public class DemoAspect{
@Before("target(com.test.controller.DemoController)")
public void advice(){
System.out.println("Before");
}
}
이미 만들어져 있는 AOP 도구로는 필터와 인터셉터가 있다
그럼 필터와 인터셉터의 차이는 무엇일까?
먼저 이 두개를 왜 사용하는걸까? 대표적으로 Controller Layer로 들어오기 전에 처리해야 하는 작업
ex) 인증, 인가, XSS방어, 데이터 압축, 인코딩등
이러한 작업들은 공통 관심사로 보고 분리하는 것이 효율적이다.
FILTER는 스프링이 지원하는 기능이 아닌, J2EE 표준 스펙에 있는 기능으로 가장 앞단에 존재하는 프론트 컨트롤러인 디스패처 서블릿에 요청이 전/후에 부가적인 작업을 처리할 수 있는 기능
method 종류로는 init , do, destroy가 있다
public interface Filter{
public default void init(FilterConfig filterConfig) throws ServletException{}
public void doFilter(ServletReqeust request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
public default void destroy(){}
}
Interceptor는 스프링이 제공하는 기술로써 디스패처 서블릿이 컨트롤러를 호출하기 전과 후에 요청을 가로채서 응답을 참조하거나 가공할 수 있게 도와주는 작업
인터셉터는 필터와 다르게 스프링 컨텍스트 내부에서 동작
public interface HandlerInterceptor{
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable ModelAndView modelAndView) throws Exception{}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception{}
}
가장 큰 차이는 아래 두가지
- 실행시점이 다르다
- 필터는 Web Application에 등록하고, 인터셉터는 Spring Context에 등록한다
참고
댓글남기기