FireDrago

[Spring] 스프링 AOP 개념 본문

프로그래밍/Spring

[Spring] 스프링 AOP 개념

화이용 2024. 5. 17. 14:38

AOP 소개 - 핵심기능과 부가기능

핵심기능 : 해당 객체가 제공하는 고유의 기능

부가기능 : 핵심기능을 보조하기 위해 제공되는 기능

횡단 관심사 : 하나의 부가 기능이 여러 곳에 동일하게 사용되는 경우다.

 

횡단 관심사를 적용하는 경우에 중복이 발생하고, 수정이 발생하면 클래스 모두를 하나씩 찾아가면서 수정해야 했다.

 

AOP 소개 - 애스펙트

부가기능과 부가기능을 어디에 적용할지 정의한 것이 애스펙트(Aspect)이다.

@Aspect 애너테이션을 사용하는 것이 바로 이 애스펙트의 예다.

애스펙트를 사용한 프로그래밍 방식을 관점 지향 프로그래밍 AOP(Aspect-Oriented Programming)이라고 한다.

AOP는 OOP를 대체하기 위한 것이 아니라 횡단 관심사를 깔끔하게 처리하기 어려운 OOP의 부족한 부분을 보조하는 목적으로 개발되었다.

 

AOP 적용방식

1. 컴파일 시점

 - .java 소스 코드를 컴파일러가 .class 파일을 만드는 시점에 부가기능 로직을 추가하는 방법

- 생성자, 필드값, static 메서드, 메서드 실행 등 모든 지점에 AOP 적용할 수 있다.

2. 클래스 로딩 시점

 -  .class 파일을 조작한 후에 jvm 클래스 로더에 보관하는 방법이다. 

 - 설정이 번거롭고 운영하기 어렵다.

 - 생성자, 필드값, static 메서드, 메서드 실행 등 모든 지점에 AOP 적용할 수 있다.

3. 런타임 시점 (프록시 사용)

 -  런타임과 클래스 로딩이 다 끝나고 실행되는 시점에 부가기능을 적용하는 방식

 - 빈 후처리기와 프록시를 사용한 AOP가 대표적인 예시이다.

 - 메서드 실행 지점에만 AOP를 적용할 수 있다. 프록시는 메서드 오버라이딩을 활용하기 때문이다.

 

용어정리

용어 설명
조인 포인트 (Join point) 어드바이스가 적용될 수 있는 위치, AOP 적용할 수 있는 모든 지점
스프링 AOP는 프록시를 사용하므로 조인포인트는 항상 메소드 실행 지점으로 제한된다.
포인트컷 (Pointcut) 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능
AspectJ 표현식을 사용해서 지정한다. 
타겟 (Target) 어드바이스를 받는 객체, 포인트컷으로 결정
어드바이스 (Advice) 부가기능
Around, Before, After, AfterReturning, AfterThrowing 같은 다양한 종류가 있다. 
애스펙트 (Aspect) 어드바이스 + 포인트컷을 모듈화 한것 
여러 어드바이스와 포인트컷이 함께 존재한다.
어드바이저 (Advisor) 하나의 어드바이스 + 하나의 포인트 컷 
스프링 AOP에서만 사용되는 특별한 언어
위빙 (Weaving) 포인트컷으로 결정한 타겟의 조인포인트에 어드바이스를 적용하는 것
AOP 프록시 AOP 기능을 구현하기 위해 만든 프록시 객체
스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시이다.