Spring/이론

🌱Spring Framework : Aspect-Oriented Programming

Dev-SeeOne 2020. 5. 19. 20:12

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

Compile-time Weaving

📌 Loading-time Weaving

Loading-time Weaving

📌 Runtime 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 표현식

https://medium.com/@wkrzywiec/moving-into-next-level-in-user-log-events-with-spring-aop-3b4435892f16

위의 그림과 같은 규칙이 적용되어 지며 빨간색으로 표시한 요소들은 필수 요소들로 생략할 수 없다.

 

아래는 Point-cut 표현식 관련 예시들이다.

 

execution(void send* (String))

send로 시작하는 어떠한 메서드 중 String 타입의 단일 파라미터를 가지며 return 타입이 void 인 것

 

execution(* send(*))

메서드 이름이 send 이면서 단일 파라미터를 가지는 것

 

execution(* send(int, ..))

메서드 이름이 send 이면서 첫번째 파라미터는 int 형이고 추가적인 파라미터가 있을 수도 있다.