스프링 자체가 기본 필터들 갖고 있으며 직접 필터 생성이 가능하다. 주로 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
}