관점 지향 프로그래밍 AOP
관점 지향 프로그래밍이란 횡단 관심사의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다. 공통된 관심사를 따로 분리해서 주 관심사(CC)와 공통 관심사(CCC)로 나누어 모듈화 시키는 방식이다.
- Advice (CCC)
- 공통적으로 빠져나온 관심사
- Join Point (CC)
- Advice가 연결될 수 있는 모든 point들의 집합
- Point Cut (CC)
- Advice가 연결될 결합점에 대한 상세한 정의
- Advisor (Aspect)
- Adivice + Point Cut
- 흩어진 관심사들을 모듈화한 것
- Weaving (CrossCutting)
- Advisor를 대상 객체에 결합하는 행위
AOP를 그림으로 이해하기
여기 비슷한 기능을 하는 메소드를 가지고 있는 세 개의 클래스가 있다.
예를 들어 노란색 기능을 수정해서 사용하고 싶어졌다. 노란색 메소드는 여기저기 흩어져 있기 때문에 A B C 클래스에 있는 모든 노란색 메소드를 일일이 수정해줘야 하는 불편함을 겪게 된다.
즉 핵심기능을 하는 코드와 공통 기능을 하는 코드가 어지럽게 섞여있어 유지보수 효율성이 떨어진다.
이러한 불편함을 해소하기 위해 우리는 흩어져 있는 Advice
(주 관심사, 공통 코드)를 모아서 관리하는 방법을 사용할 수 있다. 이것이 바로 AOP
이다.
분리한 Advice
(주 관심사, 공통 코드)를 연결할 수 있는 위치를 Join Point
라고 한다.
- Advice (CC) : 주 관심사, 공통된 코드
- Join Point (CCC) : Advice가 적용될 부분
Join Point
에서 조금 더 상세하게 연결 지점을 정의한 것이 Point Cut
이다.
Advice
(주 관심사)와 Point Cut
을 합쳐 모듈화시킨 것이 Advisor(Aspect)
이다.
마지막으로 모듈화된 코드를 대상 객체에 연결시키는 행위를 Weaving
이라고 한다.
노란 메소드를 클래스A에 연결시키는 행위가 Weaving
이 되며 이때 클래스A를 Target
이라고도 한다.
AOP 구현
스프링에서 AOP를 구현할 시 proxy를 사용하며 xml을 기반으로 한 구현방식과 어노테이션을 이용한 구현 방식이 있다.
xml을 기반으로 한 구현 방식
1. 새 메이븐 프로젝트를 생성한다.
2. 우리의 목표
과일 심부름을 간 동생과 과자 심부름을 간 동생 클래스가 있다. 우리는 공통된 부분을 모아서 관리하고자 AOP를 구현하려고 한다.
3. pom.xml
- pom.xml 파일을 열어서 <bulid></build>태그 아래 <dependencies></dependencise>태그를 만든다.
- <dependencies> 태그 안에 자바 프로그래밍 언어용 AOP 확장 기능인 aspectjweaver와 aspectj를 추가해준다.
- https://mvnrepository.com/
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.5</version>
</dependency>
</dependencies>
3. 공통 기능 클래스 작성 (CCC)
우리의 목표 중 공통된 기능은 "동생이 마트에 갔다." 와 "동생이 계산을 하고 집에 왔다."를 출력하는 것이다.
package com.test;
import org.aspectj.lang.JoinPoint;
public class Aspect {
public void before(JoinPoint join) {
System.out.println("동생이 마트에 갔다.");
}
public void after(JoinPoint join) {
System.out.println("동생이 계산을 하고 집에 왔다.");
}
}
4. 주 기능 클래스 작성 (CC)
과일 심부름과 과자 심부름 클래스를 만들자.
- 스프링 설정 파일(xml) - bean 생성, aspect 설정
댓글