스프링 IoC컨테이너가 생성되면 Component-Scan으로 Bean을 등록합니다. IoC컨테이너에서 의존성을 주입합니다. 스프링은 Bean에게 콜백 메서드를 통해 초기화 시점을 알려주며 스프링 컨테이너가 종료되기 직전에도 소멸 콜백 메서드를 통해 소멸 시점을 알려주고 스프링이 종료됩니다. 스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 관리하는데 그 중 최신 스프링에서 가장 권장하는 방법이 @PostConstruct, @PreDestroy 어노테이션입니다. 위 어노테이션만 붙이면 자동으로 초기화 콜백, 소멸전 콜백이 되기 때문에 매우 편리하게 사용이 가능합니다. 스프링이 아닌 다른 컨테이너에서도 동작한다는 장점이 있지만 외부 라이브러리에는 적용하지 못합니다 @PostConstruct 의존관계 주입이 완료되면 호출됩니다 (초기화 콜백) @PreDestroy 빈이 소멸되기 직전에 호출됩니다 (소멸전 콜백)
Request가 들어올때 거치는 순서 : Filter -> Interceptor -> AOP
첫 번째로 Filter는 DispatcherServlet 이전에 동작하는데 Request와 Response를 정제해주는 역할을 합니다. 이후 서블렛이 동작하고 컨트롤러에 도달하기 전 Interceptor가 동작하여 스프링 컨텍스트 내부에서 컨트롤러에 관한 요청과 응답에 대해 처리합니다. AOP는 OOP를 보완하기 위해 나타난 개념인데 OOP에서 중복을 줄일 수 없는 코드를 모듈화 해서 분리하는 개념입니다. Interceptor, Filter와 달리 메소드의 전후지점에서 다양하게 사용이 가능하고, 어노테이션 파라미터 등 다양한 방법으로 대상을 지정할 수 있기에 로깅, 에러처리와 같이 비즈니스 로직에서 세밀한 조정이 필요할 때 주로 사용합니다.