[Spring Boot] AOP(Aspect Oriented Programming)

Wonjun Seo·2023년 9월 3일
0

AOP 정의


AOPAspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 이는 객체 지향 프로그래밍 패러다임을 보완하는 기술로 메서드나 객체의 기능을 핵심 관심사(Core Concern)와 공통 관심사(Cross-cutting Concern)로 나누어 프로그래밍 하는 것을 말한다. 핵심 관심사는 각 객체가 가져야할 본래의 기능이고, 공통 관심사는 여러 객체에서 공통적으로 사용되는 코드를 의미한다.

여러 개의 클래스에서 반복적으로 사용되는 코드가 있다면 해당 코드를 모듈화하여 공통 관심사로 분리한다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는것을 말한다.

Class A에서는 주황, 파랑, 빨간색 블록으로 구성이 되어 있고 Class B에서는 빨강, 주황 블록으로 구성되어 있으며 Class C에서는 주황, 파랑 블록으로 구성되어 있습니다. 같은 색은 Class A, B, C에서 동일하게 사용되는 코드를 의미합니다.

예를 들어서 Class A에서 주황색 블록을 수정을 하게 되면 Class B, C에서도 수정을 해야 합니다. 이렇게 되면 유지보수 차원에서 모든 코드를 수정해야 하니 불편한 점이 있습니다. 그래서 Aspect X에서는 A, B, C의 공통 관심사인 주황색 블록을 묶어서 모듈화를 시키면서 코드의 재사용성과 유지보수성을 강화하였습니다.

이렇듯, 관점 지향 프로그래밍(AOP)에서는 소스코드에서 반복적으로 사용하는 코드를 모듈화하여 재사용성과 유지 보수성을 높일 수
있다는 강점을 가지고 있습니다.


Spring의 AOP

Spring AOP는 Spring Framework에서 제공하는 기능 중 하나로 관점 지향 프로그래밍을 지원하는 기술입니다. Spring AOP는 로깅, 보안, 트랜잭션 관리 등과 같은 공통적인 관심사를 모듈화 하여 코드 중복을 최소화하고 유지 보수성을 향상하는데 도움을 줍니다.


AOP 주요 용어


  • Aspect
    • 여러 객체에 공통으로 적용되는 공통 관심 사항을 의미
    • 공통적인 기능들을 모듈화한 것 (주로 부가기능을 모듈화 함)
    • @Aspect와 같은 의미
  • Target
    • Aspect가 적용될 대상
    • ex) 메서드, 클래스 등
  • Advice
    • 언제 공통 관심기능을 핵심 로직에 적용할지 정의
    • 특정 JoinPoint에서 Aspect에 의해 취해지는 조치
  • JoinPoint
    • Advice 적용이 가능한 지점을 의미
    • 스프링의 AOP는 프록시 방식을 사용하므로 JoinPoint는 항상 메서드 실행 지점임
    • ex) 메서드 실행 시점, 생성자 호출 시점, 필드 값 접근 시점 등
  • PointCut
    • JoinPoint의 부분집합으로, 실제로 Advice가 적용되는 JoinPoint를 의미
    • 스프링의 AOP는 프록시 기반이기 때문에 JoinPoint가 메서드 실행 지점 밖에 없고, 따라서 PointCut도 메서드 실행 지점만 가능
  • Weaving
    • Advice를 핵심 로직 코드에 적용하는 것

AOP 주요 어노테이션


  • @Aspect: 해당 클래스를 Aspect로 사용하겠다는 것을 명시
  • @Before: 대상 메서드가 실행되기 전에 Advice를 실행
  • @AfterReturning: 대상 메서드가 정상적으로 실행되고 반환된 후에 Advice를 실행
  • @AfterThrowing: 대상 메서드에서 예외가 발생했을 때 Advice를 실행
  • @After: 대상 메서드가 실행된 후에 Advice를 실행
  • @Around: 대상 메서드 실행 전/후 또는 예외 발생 시에 Advice를 실행

스프링 AOP 특징


  • 프록시 패턴 기반의 AOP 구현체로 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서임
  • Spring Bean에만 AOP를 적용 가능
  • 모든 AOP 기능을 제공하는 것이 아니라 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복 코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가)에 대한 해결책을 지원하는 것이 목적

References


https://velog.io/@backtony/Spring-AOP-%EC%B4%9D%EC%A0%95%EB%A6%AC

https://adjh54.tistory.com/133

0개의 댓글