스프링 자체가 기본 필터들 갖고 있으며 직접 필터 생성이 가능하다. 주로 Spring Framework에서는 request/response의 logging 용도로 활용하거나 인증 관련 Logic들을 해당 Filter에서 처리. 이를 선/후 처리하여 Service business logic과 분리한다.
문지기 (임무가 주어치면 처리한다). Spring boot Framework에서 Client로부터 오는 요청/응답 대해 최초/최종 단계의 위치에 존재한다. 이를 통해 요청/응답의 정보 변경 OR Spring에 의해 데이터 변환 전 순수한 Client의 요청/응답 값 확인 가능하다.
컨트롤러의 uri에 접근하는 과정에서 무언가를 제어할 필요가 있을 때 사용. 로그인 권한 관련 처리 등을 인터셉터를 이용해 효율적으로 처리 가능.
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 { }
}
참고: https://mangkyu.tistory.com/173
예) Animal Method에 run이 존재 & Dog class가 Animal 상속을 한다.
그러면 Dog가 run 메소드를 재정의 할 수 있다. 이때 run 위에다가 @override를 사용하면 자바가 실행될 때 컴파일하면 Animal도 run method를 갖고 있을 것이라고 예상하고 확인한다. Animal에 run 메소드가 있으면 정상. 없으면 compile checking 시에 에러가 발생한다.
@Component
class A S ... // IoC
spring이 해당 class를 읽어서(스캔) 자신이 들고 있는 메모리 공간(heap 안에)에 A라는 class를 로딩한다.
class B { // A class 객체를 B에서 사용하고 싶으면
A a = new A(); // 기존 A의 공간이 아닌 새로운 공간에 A 생성
}
class B {
@Autowired
A a = new A(); // 기존 A의 공간이 아닌 새로운 공간에 A 생성
}
런타임 시 분석하며, 어떤 메서드, 필드, 어노테이션이 있는지 확인 가능. (무엇을 할지도 설정 가능.)
public class Car {
private final String name;
private int position;
public Car(String name, int position) {
this.name = name;
this.position = position;
}
public void move() {
this.position++;
}
public int getPosition() {
return position;
}
}
public static void main(String[] args) {
Object obj = new Car("foo", 0); // 다형성 특징 (이와 같은 객체 생성 가능))
obj.move(); // 컴파일 에러 발생 java: cannot find symbol
}