-
미들웨어
- 애플리케이션의 주요 비즈니스 로직과 분리되어 있으면서 요청 처리, 데이터 처리, 실행 로직 등에 대해 중간에 개입하는 역할을 수행하는 기능적 표현
- AOP(Aspect-Oriented Programming), 필터(Filter), 인터셉터(Interceptor)
-
Filter

- Filter는 Spring 컨텍스트 밖에서 HTTP 요청 및 응답에 대한 사전 및 사후 처리를 수행
- 필터는 서블릿 필터(Servlet Filter)에 기반을 두고 있으며, 요청이 서블릿에 도달하기 전과 서블릿이 응답을 반환한 후에 특정 작업을 수행
- 인증작업, 로깅, 이미지 변환, 데이터 압축 등 요청 또는 응답에 대한 일반적인 처리에 주로 사용
- SecurityFilterChain
- Spring Security에서 사용되는 여러 필터들을 연속적으로 연결하는 역할
- 웹 요청이 들어올 때 보안 처리를 위해 여러 단계의 필터를 거치도록 만드는 일종의 체인(연쇄)
-
AOP
- AOP란 Aspect Oriented Programming의 약어로서 관점지향프로그래밍이라 불림

- AOP의 주된 목적은 공통관심사항(부가기능)과 핵심관심사항 등 특정 관점을 가지고 코드를 분리하는 것
- AOP의 필요성
- 만약 모든 request log를 찍어보고 싶다면? 모든 request마다 응답 성능을 확인해보고 싶다면?
- 이러한 기능은 각 객체별 핵심기능아닌, 공통관심사항
- 공통관심사항(cross-cutting-concern)과 핵심관심사항(core concern)의 분리의 필요성에 의해 AOP 등장
- AOP는 애플리케이션의 모든 계층(controller, service 등)에 걸쳐 사용되고, 로깅, 인증, 보안 등 공통관심사항 처리에 특화된것이 AOP
- Spring AOP 관련 어노테이션
- @Aspect
- Aspect는 AOP의 핵심 구성 요소로, 관심사를 모듈화한 것
- 이 어노테이션은 클래스가 Aspect임을 나타내는 어노테이션
- @Pointcut
- 어드바이스가 적용될 위치(메서드, 클래스 등)를 정의
- 조인 포인트를 정의하는 데 사용되는 어노테이션
- Join Point란 Aspect(관점)이 적용될 수 있는 프로그램 실행의 특정 지점, 즉, Aspect 코드(예: Advice)가 실행될 수 있는 지점들을 의미
- AOP를 통한 logging 구현 절차
- @Aspect를 class 레벨에서 선언
- @Component를 통해 스프링 빈에 등록하여 싱글톤으로 객체 생성
- 공통관심사항 코드의 메서드에 @Around 선언
- 해당 어노테이션을 통해 적용범위 직접 설정 가능
- joinPoint.proceed()호출
- proceed() 메서드를 호출하면, 현재의 조인 포인트에 해당하는 메서드 (즉, 어드바이스가 적용되는 실제 비즈니스 로직의 메서드)가 호출
- 프록시 기술
- Spring AOP는 프록시 객체를 사용하여 동작
- 프록시란 실제 객체의 메서드 호출을 가로채는 대리 객체
- 클라이언트는 프록시를 통해 메서드를 호출하고, 프록시는 부가 로직을 실행한 뒤 실제 객체의 메서드를 호출
- 이 방식을 통해 로깅, 트랜잭션, 보안 같은 공통 관심사를 분리
-
Interceptor
- Interceptor는 Spring의 일부로 Spring의 컨텍스트 내인 컨트롤러 레이어에서 작동
- 주로 요청이 컨트롤러에 도달하기 전, 후, 그리고 요청 처리 완료 후에 특정 로직을 실행하는 데 사용
- 인터셉터는 주로 요청 전/후의 처리, 로깅, 인증 등에 사용
- 유사한 기능을 가진 AOP는 메소드 수준에서의 관심사 분리에 초점을 맞추며, 어플리케이션의 여러 영역(컨트롤러, 서비스, 리포지토리 등)에 걸쳐 적용
-
ControllerAdvice

- @ControllerAdvice는 AOP나 인터셉터와는 다른, Spring의 전역 컨트롤러 관련 기능을 제공
- 이는 컨트롤러의 특정 측면(예외 처리, 데이터 바인딩 등)에 대한 관심사를 전역적으로 관리하는 데 초점
- 주로 예외 처리나 컨트롤러의 공통 기능을 처리하는 데 사용
- @ControllerAdvice
- 전역적으로 Controller에 영향을 미치는 예외 처리, 바인딩 설정, 모델 객체를 관리하는 데 사용
- @ExceptionHandler
- 특정 예외를 처리하기 위한 메서드에 사용. @ControllerAdvice 또는 @Controller 클래스 내부에서 사용.