🌱Spring Framework : Aspect-Oriented Programming
1. Aspect-Oriented Programming ?
Spring Framework의 핵심 개념중 하나인 Dependency Injection이 객체간의 결합도를 낮춰준다면 Aspected Oriented Programming은 모듈성을 증가시키는 것을 목적으로 사용되어진다.
AOP는 전체 어플리케이션 구현 기능을 두 가지로 구분한다.
Core Concern
📌 핵심 업무를 의미하며 해당 어플리케이션 만의 특정한 기능을 의미한다.
Cross-cutting Concern
📌 공통 업무를 의미하며 핵심 업무를 도와주는 반복적이고 부가적인 업무를 의미한다.
AOP의 중요개념은 공통 업무와 핵심업무를 분리하는 것으로 각각의 공통적인 부분들을 모듈화 하여 개발자가 핵심 업무에 집중할 수 있도록 하는 것을 목표로 한다.
2. AOP 관련 용어
Join Point
📌 어플리케이션을 실행할 때 특정 작업이 시작되는 시점으로 Advice를 적용 가능한 지점이다. 클래스의 인스턴스를 생성하는 시점이나, 메서드의 호출 시점 등과 같이 ~때 를 의미한다.
Point Cut
📌 여러개의 Join Point를 하나로 묶은 것으로 Point Cut으로 묶인 Join Point 들은 Advice를 공유한다.
Advice
📌 Join Point에 삽입되어 동작할 수 있는 공통 관심 사항의 코드로 메서드가 이 기능을 담당한다.
Aspect
📌 여러 객체에 공통으로 적용되는 공통 관심 사항 클래스로 Aspect = Advice + Point Cut 으로 나타낼 수 있다.
Target
📌 핵심 로직을 구현하는 클래스로, 공통 관심 사항을 적용 받게되는 대상이며 Advice가 적용되는 객체이다.
Weaving
📌 공통 관심 사항의 코드인 Advice를 핵심 관심 사항의 로직에 적용하는 것을 의미한다.
위의 용어들의 관계를 살펴보면 위의 그림과 같은 관계들이 성립되어진다.
3. Weaving
일반적으로 Weaving은 적용 시점에 따라서 3가지로 나뉘어진다.
📌 Compile-time Weaving
📌 Loading-time Weaving
📌 Runtime Weaving
Spring 에서 사용하는 Weaving 방식은 Runtime Weaving 방식으로 Proxy 를 사용한다.
Runtime에 Client 요청이 들어오면 Proxy가 먼저 확인하여 Advice를 거처야 하는지 판단하여 처리한다.
4. Advice Type
📌 Before : Target의 핵심 메소드 실행 전
📌 After : Target의 핵심 메소드 실행 후
📌 After Returning : Target의 핵심 메소드를 실행하고 값을 리턴한 후
📌 Round : Target의 핵심 메소드 실행 전 후
📌 After Throwing : Target의 핵심 메소드 실행 중 예외 발생시
5. Point-cut 표현식
위의 그림과 같은 규칙이 적용되어 지며 빨간색으로 표시한 요소들은 필수 요소들로 생략할 수 없다.
아래는 Point-cut 표현식 관련 예시들이다.
execution(void send* (String))
send로 시작하는 어떠한 메서드 중 String 타입의 단일 파라미터를 가지며 return
타입이 void
인 것
execution(* send(*))
메서드 이름이 send 이면서 단일 파라미터를 가지는 것
execution(* send(int, ..))
메서드 이름이 send 이면서 첫번째 파라미터는 int
형이고 추가적인 파라미터가 있을 수도 있다.