Aspect Oriented Programming 개요
AOP 정의를 위한 기본 용어
관심사
- 어플리케이션을 개발하기 위한 구현 기능들 "관심사"
- 어플리케이션의 비즈니스 중요 기능들을 "핵심 관심사"
횡단 관심사
- 여러 모듈에 걸쳐 공통적이고 반복적으로 필요로 하는 처리 내용을 "횡단 관심사"
횡단 관심사 분리
- 횡단 관심사를 한 곳으로 모은 것 "횡단 관심사의 분리"
- 이를 실현하는 방법 "관점지향 프로그래밍"
AOP 정의
- 관점 지향 프로그래밍
- 여러 비즈니스 모듈에서 공통으로 사용되는 횡단 관심사를 중심으로 설계, 개발하는 프로그래밍 기법
- 객체지향 프로그래밍보다 완성도 높인 프로그래밍 패러다임
회원, 상품, 배송 서비스는 해당 도메인에 대한 핵심 서비스를 제공하지만, 이 모듈들은 인증, 보안, 트랜잭션, 캐싱, 로깅 같은 보조 기능들도 필요로 한다.
AOP 목적
- DI는 어플리케이션 객체 간의 결합도를 낮춤
- AOP는 횡단 관심사와 이에 영향 받는 객체 간 결합도를 낮춤
AOP 장점
- 전체 코드에 흩어져 있는 관심사들이 하나의 장소로 응집
- 기타 비즈니스 모듈들은 본질적인 처리들을 위한 핵심 기능에 대한 코드만 기술
- 공통 관심사들은 공통 모듈로 옮겨지므로 코드가 깔끔
AOP 주요 용어
-
Advice
- 조인 포인트에 삽입되어 실행되는 코드, 횡단 관심사 구현 부분
-
Join Point
- 횡단 관심사가 실행되는 지점 또는 시점으로 Advice 적용 가능 지점들
- Ex) 「클래스의 인스턴스 생성 시점」, 「메소드 호출 시점」 및 「예외 발생 시점」
-
Pointcut
- 수많은 Join Point 중에서 실제 적용될 지점들
- 표현식으로 선발
- 설정은 XML, 애노테이션 방식 사용
-
Aspect
- 공통 관심사의 추상적 명칭
- Advice + Pointcut
-
Target
- 핵심 로직을 구현하는 클래스
- 횡단 관심사를 적용 받게 되는 대상
- Advice가 적용되는 객체
-
Introdution
- Target에는 없는 새로운 메소드나 인스턴스 변수들을 추가
-
Weaving
- Advice + Target -> Proxy 객체를 만드는 과정
-
Proxy
스프링이 제공하는 Advice 유형
- Before : 조인포인트 앞에서 실행할 Advice
- After : 조인포인트 뒤에서 실행할 Advice
- After returning : 조인포인트가 완전히 종료된 다음에 실행되는 Advice
- Around : 조인포인트 앞뒤에서 실행되는 Advice
- After throwing : 조인포인트에서 예외가 발생했을 때 실행되는 Advice
스프링 AOP 설계 방식 : Proxy 패턴 방식을 통해 구현
프록시 패턴
- 어떤 객체를 사용하고자 할 때, 객체를 직접적으로 참조하는 것이 아니라, 그 객체를 대행하는 객체를 통해 대상객체에 접근하는 방식
- 스프링 컨테이너 초기화 과정에서 스프링 빈 객체를 대행할 프록시 객체 생성
- 객체 핵심 코드에 대한 영향없이 객체의 접근 전/후에 대한 중요 처리 가능
프록시 패턴 코드
interface Server {
public void responce();
}
class HttpServer implements Server {
private String filename;
public HttpServer(String filename) {
this.filename = filename;
}
private void responce() {
System.out.println("responce " + filename);
}
}
class ProxyServer implements Server {
private String filename;
private Server server;
public ProxyServer(String filename) {
this.filename = filename;
}
public void responce() {
if (server == null)
{
server = new HttpServer(filename);
}
server. responce();
}
}
class ProxyExample {
public static void main(String[] args) {
Server server1 = new ProxyServer("main_1.html");
Server server2 = new ProxyServer("main_2.html");
server1. responce();
server2. responce();
}
}
AOP 구현 3가지 방법
- XML을 이용한 AOP 구현
☞ XML 스키마 기반의 POJO 클래스 이용한 AOP
- Annotation을 이용한 AOP 구현
☞ 애노테이션 기반의 AOP 구현
- Java 코드를 이용한 AOP 구현
☞ Java 기반의 AOP 구현