AOP란
AOP (Aspect Oriented Programming) 는 여러 곳에 반복되는 공통 관심사를 비즈니스 로직과 분리해서
한 곳에서 관리하기 위한 프로그래밍 기법
AOP가 왜 필요할까?
예를들어 기획자가 개발자님 성능 측정을 위해 모든 메서드에 시작 시간과 종료 시간을 남기는 기능 추가해주세요
라고 요청을 했을 때
public void save() {
log.info("start");
// 비즈니스 로직
log.info("end");
}
다음과 같은 코드가 모든 서비스 메서드마다 중복되면
- 로깅, 트랜잭션, 권한 체크 코드가 모든 메서드에 흩어짐
- 수정하려면 전체 코드를 다 건드려야 함
- 비즈니스 로직이 더러워짐
AOP 도입 후에는

시간 측정은 AOP가 알아서 처리한다.
AOP는 어디에 적용되는걸까?
AOP는 HTTP 요청 흐름과는 무관하다.
- Service 메서드
- Repository 메서드
- Scheduler
- 내부 메서드 호출
AOP 용어
| 용어 | 설명 |
| Join Point | 메서드 실행 시점 |
| Pointcut | 어떤 메서드(Join Point)에 끼어들지 정하는 조건 |
| Advice | 끼어들어서 실행할 실제 AOP 로직 @Before @After @Around |
| Aspect | 공통 관심사를 담는 모듈(로깅, 트랜잭션, 권한 체크) |
AOP 어노테이션
- @Before : 메서드 실행 전
- @After : 메서드 종료 후
- @AfterReturning : 정상 종료 후
- @AfterThrowing : 예외 발생 시
- @Around : 실행 전·후 모두 제어
실습- 실행 시간 측정 AOP 만들기
package org.example.nbcam_addvanced_1.common.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Slf4j
public class TimeCheckAop {
@Around("execution(* org.example.nbcam_addvanced_1.user.service..*(..))")
public Object executionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed(); // 실제 메서드 실행 -> Filter에서 doFilter 와 비슷함.
long end = System.currentTimeMillis();
log.info("[AOP] {} 실행됨 in {}ms" , joinPoint.getSignature() , end - start);
return result;
}
}
'Dev. > Spring' 카테고리의 다른 글
| [Spring] Interceptor 정리 (1) | 2025.12.02 |
|---|---|
| [Spring] interface의 default 메서드를 언제 써야 할까 (0) | 2025.11.29 |
| [Spring] 스프링이 싱글톤 빈을 생성하는 과정 (0) | 2025.11.21 |
| [Spring] Lombok 생성자 @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor (1) | 2025.11.20 |
| [Spring] 응답DTO에 엔티티 의존성을 주입해야 하는 경우 (0) | 2025.11.19 |