Spring AOP
AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)
애플리케이션에서의 관심사의 분리(기능의 분리)를 구현, 즉 핵심 기능에서 부가 기능을 분리하고, 분리한 부가 기능을 Aspect라는 모듈로 만들어 설계/개발한다.
관점의 구분
핵심 관점 : 비즈니스 로직
부가 관점 : 핵심 로직을 실행하기 위한 부가 기능(데이터베이스 연결, 로깅, 파일 입출력 등)
AOP 목적
소스 코드에서 여러 번 반복해서 쓰는 코드(= 흩어진 관심사, Concern)를 Aspect로 모듈화하여 핵심 로직에서 분리 및 재사용
개발자가 핵심 로직에 집중
AOP 주요 용어
Aspect
- Advice + PointCut
- 부가 기능을 정의한 코드인 어드바이스(Advice)와 어드바이스를 어디에 적용할지를 결정하는 포인트컷(PointCut)을 합친 개념
- 구분된 애스팩트를 런타임 시 필요한 위치에 동적으로 실행
Target
- Aspect를 적용하는 곳(클래스, 메소드 등)
Advice
- 타겟에 제공할 수행 기능을 담은 구현체
JoinPoint
Advice가 적용될 위치
타겟 객체가 구현한 인터페이스의 모든 메소드는 조인 포인트의 후보다.
조인포인트를 사용해 메소드의 세부 정보(이름과 인수)를 얻을 수 있다.
- ex. 메소드 진입 시, 생성자 호출 시, 필드에서 값 꺼낼 때 등
PointCut
JoinPoint의 상세 스펙 정의
- 어드바이스를 적용할 타겟의 메소드를 선별하는 정규표현식
- 더욱 구체적으로 Advice가 실행될 지점 지정
- execution으로 시작하고, 메소드의 Signature를 비교하는 방법 주로 이용
- 어드바이스를 적용할 타겟의 메소드를 선별하는 정규표현식
PointCut 표현식 문법
PointCut 표현식 예시
Weaving
PointCut에 의해 결정된 Target의 JoinPoint에 Advice를 삽입하는 과정
위빙은 AOP가 핵심기능 타겟의 코드에 영향을 주지 않으면서 필요한 부가기능(어드바이스)을 추가할 수 있도록 해주는 핵심적인 처리과정이다.
Weaving 구분
컴파일 타임 위빙
- 자바 파일을 클래스 파일로 만들 때 Advice 소스가 추가되어 조작된 바이트 코드 생성하는 방법
- 입력은 소스 코드고 출력은 위빙이 있는 컴파일된 클래스이다.
- AspectJ가 사용하는 방법
바이너리 위빙
- 컴파일 후 컴파일 된 클래스를 로딩하는 시점에 Advice 소스를 끼워넣는 방법
- 코드가 컴파일된 후에 수행된다.
- 입력은 컴파일된 클래스 파일 또는 jar 파일이고 출력은 위빙이 있는 컴파일된 클래스나 jar 파일이다.
- AspectJ가 사용하는 방법
런타임 위빙
- 클래스가 JVM에 로드되기 직전에 수행된다.
- Spring AOP가 사용하는 방법
- 스프링은 런타임 시 Bean 생성
- A라는 Bean 만들 때 A라는 타입의 프록시 Bean도 생성하고, 프록시 Bean이 A의 메소드 호출 직전에 Advice 소스를 호출한 후 A의 메소드 호출
AOP 프레임워크
- AspectJ
- 컴파일 타임 위빙을 제공한다.
- 위빙을 수행하기 위해 AspectJ 컴파일러를 빌드 프로세스에 추가할 수 있다.
- 스프링 AOP
- AspectJ와 자체의 몇 가지 기본 AOP 기능과의 통합을 제공한다.
- 런타임 위빙을 수행한다.
- 스프링 빈에서 메소드 호출만 인터셉트할 수 있다.
스프링 빈으로 작업 중이고 스프링 빈에서 메소드 호출을 인터셉트하려는 경우, 스프링 AOP면 충분하다.
스프링 컨테이너에 의해 관리되지 않는 객체의 메소드 호출을 가로채려면 AspectJ를 사용해야 한다.
Spring AOP 의 구현
Spring AOP 의 구현 방식
- XML 기반의 POJO 클래스를 이용한 AOP 구현
- 부가기능을 제공하는 Advice 클래스를 작성한다
- XML 설정 파일에
<aop:config>
를 이용해서 애스펙트를 설정한다 .(즉 , 어드바이스와 포인트컷을 설정함 )
- @Aspect 어노테이션을 이용한 AOP 구현
- @Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect 클래스를 작성한다. 이때 Aspect 클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다
- XML 설정 파일에
<aop:aspectj autoproxy/>>
를 설정한다.
Advice 종류
- @Around
- 타겟의 메소드가 호출되기 이전/이후 시점에 모두 처리해야 할 부가기능 정의
- 조인포인트 앞/뒤에서 실행되는 어드바이스
- @Before
- 타겟의 메소드가 호출되기 이전 시점에 모두 처리해야 할 부가기능 정의
- 조인포인트 앞에서 실행되는 어드바이스
- @After
- 타겟의 메소드가 호출된 이후 시점에 모두 처리해야 할 부가기능 정의
- 조인포인트 뒤에서, 즉 메소드 실행 후, 메소드가 예외를 발생시키더라도 실행된다.
- @After Returning
- 타겟의 메소드가 실행된 이후 시점에 모두 처리해야 할 부가기능 정의
- 조인포인트 실행 종료된 이후 실행되는 어드바이스
- @After Throwning
- 타겟의 메소드가 예외를 발생한 이후 시점에 모두 처리해야 할 부가기능 정의
- 예외가 던져질 때 실행되는 어드바이스
Spring AOP 특징
프록시 (Proxy) 기반 AOP 지원
- Spring은 타겟 (target) 객체에 대한 프록시를 만들어 제공한다
- 타겟을 감싸는 프록시는 실행시간 (런타임) 에 생성된다
- 프록시는 어드바이스를 타겟 객체에 적용하면서 생성되는 객체이다.
프록시가 호출을 가로챈다(Intercept)
- 프록시는 타겟 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고 난 후에 타겟의 핵심기능 로직을 호출한다.(전처리 어드바이스)
- 또는 타겟의 핵심기능 로직 메서드를 호출한 후에 부가 기능(어드바이스)을 수행하는 경우도 있다(후처리 어드바이스)
Spring AOP 는 메서드 조인 포인트만 지원
- Spring은 동적 프록시를 기반으로 AOP 를 구현하므로 메서드 조인 포인트만 지원한다. 즉 핵심기능 타겟의 메서드가 호출되는 런타임 시점에만 부가기능(어드바이스)을 적용할 수 있다 .
- 반면에 AspectJ 같은 고급 AOP 프레임워크 를 사용하면 객체의 생성 , 필드값의 조회와 조작 , static 메서드 호출 및 초기화 등의 다양한 작업에 부가기능을 적용할 수 있다.
Reference
'Web_Backend > Spring' 카테고리의 다른 글
5.SpringBoot (0) | 2024.07.12 |
---|---|
4.Spring MVC (0) | 2024.07.12 |
2.Spring DI (0) | 2024.07.12 |
1.Spring Framework와 IoC (0) | 2024.07.12 |
AOP (0) | 2022.05.03 |