*토비의 스프링 3.1을 참고하여 정리한 자료입니다*
1. AOP (관점 지향 프로그래밍)
개념(Aspect-Oriented Programming): 애플리케이션의 핵심 비즈니스 로직과 공통 기능(부가 기능)을 분리하여 모듈화하는 프로그래밍 패러다임.
기존의 OOP(Object-Oriented Programming)과는 구분되는 새로운 특성
Why? 로깅, 트랜잭션, 보안과 같은 기능들은 여러 비즈니스 로직(Service의 여러 메서드)에 걸쳐 반복적으로 등장한다.
public void upgradeLevels() throws Exception{
TransactionStatus status = this.transactionManager
.getTransaction(new DefaultTransactionDefinition());
try {
// 트랜잭션 경계
// 비즈니스 로직
List<User> users = userDao.getAll();
for (User user : users) {
if (canUpgradeLevel(user)){
upgradeLevel(user);
}
}
// 비즈니스 로직
// 트랜잭션 경계
this.transactionManager.commit(status);
} catch (Exception e){
this.transactionManager.rollback(status);
throw e;
}
}
- 기능을 반복해서 작성해야 한다면, 중복된 코드가 많아지게 되고, 유지보수가 힘들어지며 소스관리가 되지 않는다.
- 전통적인 객체지향 기술의 설계 방법으로는 독립적인 모듈화가 불가능한 트랜잭션 경계설정과 같은 부가기능을 어떻게 모듈화 할것인가를 연구해온 사람들은 이런 문제를 해결하기 위해 `Aspect`라는 특별한 이름으로 정의했다.
- 'Aspect'란 그 자체로 애플리케이션의 핵심 기능을 담고 있지는 않지만, 애플리케이션을 구성하는 중요한 한 가지 요소이고, 핵심기능에 부가되어 의미를 가지는 특별한 모듈을 가리킨다.
즉, 애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해 애스펙트라는 독특한 모듈로 만들어 설계하고 개발하는 방법을 AOP라 부른다.
이를 통해 핵심기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 돕는다.
AOP의 용어:
- Target : 부가기능을 부여할 대상. 핵심기능을 담은 클래스일 수도 있지만, 경우에 따라서는 다른 부가기능을 제공하는 프록시 오브젝트일 수도 있다.
- Advice :타깃에게 제공할 부가기능을 담은 모듈이다. 어드바이스는 오브젝트로 정의하기도 하지만, 메소드 레벨에서 정의할 수도 있다.
- Join Point : Advice가 적용될 수 있는 시점을 말한다. 스프링의 프록시 AOP에서 조인 포인트는 메소드의 실행 단계뿐이지만, 타깃 오브젝트가 구현한 인터페이스의 모든 메소드는 조인 포인트가 된다.
- Pointcut : Advice를 적용할 조인 포인트를 선별하는 작업 또는 그 기능을 정의한 모듈을 말한다.
스프링 AOP의 조인 포인트는 메소드의 실행이므로 스프링의 포인트컷은 메소드를 선정하는 기능을 갖는다. 그래서 포인트컷 표현식은 메소드의 실행이라는 의미인 execution으로 시작하고, 메소드의 시그니처를 비교하는 방법을 주로 이용한다.
메소드는 결국 클래스 안에 존재하기에, 메소드 선정이란 작업은 결국 클래스를 선정하고 그 안의 메소드를 선정하는 과정이다. - Proxy : 우리가 흔히 말하는 프록시와 디자인 패턴에서 말하는 Proxy는 의미가 조금 다르다. 디자인 패턴에서 프록시는 클라이언트와 타깃 사이에 투명하게 존재하며, 부가기능을 제공하는 오브젝트다.
DI를 통해 타깃 대신 클라이언트에 주입되며, 클라이언트의 메소드 호출을 대신 받아 타깃에 위임해주고 그 과정에서 부가기능을 부여한다.
타깃 오브젝트를 생성하기가 복잡하거나 당장 필요하지 않은 경우에는 꼭 필요한 시점까지 오브젝트를 생성하지 않는것이 좋을 것이다.
그러나 타깃 오브젝트에 대한 레퍼런스는 미리 필요할 수 있는데, 이 때 프록시 패턴이 적용된다.
클라이언트에게 타깃에 대한 레퍼런스를 넘길 때 실제 타깃 오브젝트를 만드는 대신 프록시를 넘긴다.
그리고 프록시의 메소드를 통해 타깃을 사용하려 하면, 그때 프록시가 타깃 오브젝트를 생성, 요청을 위임해준다.
- Adviser : 포인트컷과 어드바이스를 하나씩 가지고 있는 오브젝트다. 어떤 부가기능(어드바이스)을 어디에(포인트컷) 전달할 것인가를 알고 있는 AOP의 가장 기본이 되는 모듈이다.
- Aspect : 마찬가지로 AOP의 기본 모듈이며 한 개 또는 그 이상의 포인트컷과 어드바이스의 조합으로 만들어진다. 보통 싱글톤 형태의 오브젝트로 존재한다.
2. Interceptor
- 요청에 대한 작업을 DispatcherServlet과 Handler(Controller)사이에서 전/ 후로 인터셉트, 말 그대로 낚아챌 수 있다.
- 서버에 들어온 Request 객체를 컨트롤러의 핸들러로 도달하기 전에 낚아채서 부가적인 기능이 실행되게끔 만들어준다.
- Interceptor는 여러 개를 등록할 수 있으며, 순차적으로 인터셉터를 거친 후 Controller를 실행한다.
- 인터셉터 또한 스프링의 기술이며 Controller 동작 전 후로 동작한다. 스프링의 기술이기에 모든 @Bean에 접근이 가능하다.
주로 아래와 같은 작업에 사용한다.
1. 세부적인 보안 및 인증/인가 작업
2. API 호출에 대한 로깅 또는 검증
3. Controller로 넘겨주는 정보의 가공
Interceptor는 3개의 메소드(preHandle, postHandle, afterCompletion)를 가지고 있다.
- preHandle : 핸들러 매핑에서 적절한 핸들러 객체를 결정한 후 핸들러 어댑터가 핸들러를 호출하기 전에 호출된다.(컨트롤러에 들어가기 전이다.)
- postHandle : 핸들러 어댑터가 실제로 핸들러를 호출한 후 Dispatcher Servlet이 view를 렌더링하기 전에 호출된다.
이 메소드를 사용할 땐 각 인터셉터는 실행 체인의 역순으로 실행을 처리한다. - afterCompletion : 요청 처리가 완료된 후, 즉 Interceptor의 preHandle 메소드가 성공적으로 완료되고 true가 반환된 경우(view 페이지가 렌더링 되고 난 후)에만 호출된다. postHandle과 마찬가지로 실행 체인의 역순으로 실행을 처리한다.
3. Filter
- Filter는 스프링 컨텍스트 외부에 존재하여 스프링에 무관한 자원에 대해 동작 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 처리 한다.(톰캣과 같은 WAS(웹 애플리케이션 서버)에서 처리해준다.)
- 따라서 Request에 대한 조작이 가능하다. Interceptor와 AOP는 모두 Request의 내용을 가지고 추가적인 작업 하지만, Filter는 그 요청 자체를 조작할 수 있다.
- Dispatcher Servlet 영역에 들어가기 전인 Front Controller 앞 범위에서 수행되고, 필터 적용시 필터가 호출된 후에 서블릿이 호출된다.
Dispatcher Servlet은 따로 정리해 두었다.(https://velog.io/@coom1222/Spring-Dispatcher-Servlet)
4. AOP, Filter, Interceptor 차이와 호출 순서
결국 이 셋은 모두 '중간에 무언가를 처리'하지만, 동작하는 계층(Layer)과 범위가 다르다.
요청(Request)이 들어왔을 때의 일반적인 호출 순서는 다음과 같다.

'Backend' 카테고리의 다른 글
| 데이터 조회해 출력하기 (0) | 2026.07.31 |
|---|