백엔드/Spring

[Spring] AOP - Aspect-Oriented Programming 개념

kwang2134 2024. 11. 8. 16:55
728x90
반응형
728x90

AOP - Aspect-Oriented Programming

  • 관점 지향 프로그래밍을 의미
  • 프로그램의 핵심 로직과는 별개로 공통적으로 적용되는 기능들을 모듈화하여 관리하는 방법론
  • 코드의 관심사 분리를 중점으로 다른 기능들이 서로 영향을 주지 않도록 함

주요 개념

Aspect

  • 여러 모듈에 반복적으로 적용되는 공통 기능
  • 로깅, 트랜잭션 관리, 보안 등의 기능 등등
  • @Aspect

Join Point

  • 프로그램 실행 중에 AOP 기능을 삽입할 수 있는 지점
  • Advice가 적용될 수 있는 모든 지점
  • 메서드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 등 프로그램 실행 중 지점
  • 스프링 AOP의 경우 프록시 방식을 사용해 메서드 실행 지점으로 제한

Advice

  • 조인 포인트에서 수행될 실제 코드
  • Before Advice
    • 조인 포인트 이전에 실행되는 Advice
    • 작업의 흐름 변경 불가능
    • 메서드가 종료되면 자동으로 다음 타겟 호출 -> 사용자가 호출할 필요 X
  • After Advice
    • AfterReturning: 메서드 실행이 정상적으로 반환될 때 실행되는 Advice 
    • AfterThrowing: 메서드 실행에 예외가 발생할 경우 실행되는 Advice
    • After: 메서드 실행이 종료되면 실행되는 Advice, 정상 및 예외 반환 조건을 모두 처리
  • Around Advice
    • 메서드 실행 전후를 감싸는 Advice
    • 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 값 변환 등 모든 조작 가능
    • 사용자가 실제 메서드를 호출해줘야 함

Pointcut

  • 어드바이스가 적용될 조인 포인트의 조건을 정의하는 표현식
  • 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 선별 가능

Weaving

  • 실제 코드에 어드바이스를 삽입하는 과정
  • 포인트컷으로 결정한 타켓의 조인 포인트에 어드바이스를 적용
  • 핵심 기능 코드에 영향을 주지 않고 부가 기능을 추가 할 수 있음
  • 컴파일, 클래스 로드, 런타임 시 발생 가능
  • 스프링 AOP의 경우 프록시를 통한 런타임 발생 

Target

  • Advice를 받는 객체
  • Pointcut을 통해 결정됨

Advisor

  • 하나의 Advice와 Pointcut으로 구성
  • 스프링 AOP에서만 사용

컴파일 시점 Weaving

  • AOP 위빙이 컴파일 과정 중에 이루어지는 방식
  • AspectJ와 같은 AOP 프레임워크에서 사용
  • AOP 기능을 지원하는 AspectJ의 별도의 컴파일러를 통해 자바 소스 파일을 컴파일할 때 AOP 관련 코드를 직접 클래스 파일에 삽입
  • 실제 클래스의 바이트 코드 조작으로 변경 됨

장점

  • 컴파일 타임에 이루어져 런타임 성능에 영향을 미치지 않음
  • 추가적인 런타임 라이브러리나 프록시 객체가 필요하지 않음 -> 최종 생성 객체는 위빙된 객체

단점

  • 컴파일 타임에 위빙으로 디버깅이 어려울 수 있음
  • 별도의 특별한 컴파일러가 필요

클래스 로드 시점 Weaving

  • 클래스가 JVM에 로드될 때 AOP 위빙이 적용되는 방식
  • 클래스가 메모리에 로드되는 시점에서 동적으로 AOP 기능을 적용

장점

  • 실행 시 클래스가 로드될 때 AOP 기능이 추가되어 컴파일 타임에 별도의 위빙 작업을 하지 않아도 됨
  • JVM 수준에서 AOP를 적용하여 기존 클래스를 변경하지 않고도 AOP 기능을 적용할 수 있음

단점

  • 클래스가 로드될 때마다 위빙이 적용되므로 로딩 성능에 영향을 미칠 수 있음
  • 별도의 특별한 옵션을 통해 클래스 로더 조작기를 지정해야 함

런타임 시점 Weaving

  • JVM 실행 중에 AOP 위빙을 수행하는 방식
  • 프록시 기반 AOP를 사용하는 방식으로 Spring AOP에서 사용
  • 프록시 객체를 사용한 핵심 로직과 AOP 기능 결합

장점

  • 프록시 객체를 사용하여 동적으로 AOP를 적용하여 코드 수정 없이 실행 중에 AOP를 적용할 수 있음
  • 메소드 호출 시점에 AOP 기능을 삽입하기 때문에 실행 중에 변경이 가능
  • Spring과 같은 프레임워크에서 빈에 AOP를 자동으로 적용할 수 있음

단점

  • 프록시 객체가 핵심 로직을 감싸는 구조를 사용해 오버헤드와 프록시를 사용하지 않는 다른 기술과의 호환성 문제가 발생할 수 있음
  • 프록시를 통한 메서드 실행 시점에 적용 되므로 생성자, 필드 값 호출 등 다른 기능에 사용은 제한 됨

스프링 핵심 원리 - 고급편 강의 | 김영한 - 인프런 강의 내용 참고

728x90

'백엔드 > Spring' 카테고리의 다른 글

[Spring] Spring AOP 주의 사항 정리  (1) 2024.11.12
[Spring] Spring AOP - Pointcut  (2) 2024.11.10
[Spring] 빈 후처리기 - BeanPostProcessor  (0) 2024.11.07
[Spring] ProxyFactory  (1) 2024.11.06
[Spring] 동적 프록시  (0) 2024.11.05