스프링

AOP

148june 2025. 4. 17. 17:59

🌐 AOP (Aspect-Oriented Programming) 개념 정리

📘 AOP란?

AOP (Aspect-Oriented Programming), 즉 관점 지향 프로그래밍
공통 기능(로깅, 보안, 트랜잭션 등)을 핵심 로직과 분리하여 재사용성 높이고 코드 깔끔하게 유지하는 프로그래밍 방식입니다.


💡 왜 사용할까?

예를 들어 여러 서비스 메서드에서:

  • 로그를 남겨야 하고
  • 실행 시간을 측정하고
  • 보안 체크까지 해야 한다면...

이 코드를 일일이 메서드마다 적는 건 비효율적이기 때문에,
AOP를 사용해 중복 없이 한 번만 정의하고 자동으로 적용할 수 있습니다.


🧩 AOP의 핵심 용어

용어 설명

Aspect 공통 관심사를 모아놓은 클래스 (ex. 로깅 기능 모음)
Join Point Aspect가 적용될 수 있는 지점 (ex. 메서드 실행 시점)
Advice 실제 실행될 공통 기능 (ex. 로그 찍기, 트랜잭션 시작 등)
Pointcut 어떤 Join Point에 Advice를 적용할지 정의하는 조건
Weaving Aspect를 실제 코드에 적용(끼워넣기)하는 과정

🔧 Spring AOP 주요 어노테이션

어노테이션 설명

@Aspect 해당 클래스가 Aspect임을 정의
@Before 메서드 실행 전에 Advice 실행
@After 메서드 실행 후에 Advice 실행
@AfterReturning 메서드가 성공적으로 리턴된 후 Advice 실행
@AfterThrowing 예외 발생 시 Advice 실행
@Around 메서드 실행 전/후 모두 Advice 실행 (가장 많이 쓰임)

🖥️ 예시 코드

@Aspect
@Component
public class LoggingAspect {

    @Around("execution(* com.example.service..*(..))")
    public Object logExecution(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("📌 메서드 실행 전");

        Object result = joinPoint.proceed(); // 실제 비즈니스 로직 실행

        System.out.println("✅ 메서드 실행 후");

        return result;
    }
}
  • execution(* com.example.service..*(..))는 com.example.service 하위의 모든 메서드에 적용
  • @Around는 메서드 실행 전/후를 감쌈

✅ 언제 AOP를 쓰면 좋을까?

  • 모든 API 요청에 대해 로그를 남기고 싶을 때
  • 권한/보안 체크가 필요할 때
  • 트랜잭션 처리 (시작/커밋/롤백)
  • 실행 시간 측정
  • 예외 처리 공통화할 때

🧼 정리하면?

"AOP는 공통 관심사 코드(Logging, Security 등)를 핵심 로직에서 분리해서, 코드가 깔끔하고 유지보수하기 쉽게 만들어주는 도구다."

'스프링' 카테고리의 다른 글

@ExtendWith(SpringExtension.class) vs @ExtendWith(MockitoExtension.class)  (0) 2025.04.18
프록시  (0) 2025.04.18
HttpServletRequest  (0) 2025.04.17
Spring MVC 내부 구조와 HttpMessageConverter 완전 정복  (0) 2025.04.15
kpt  (0) 2025.04.14