Spring에서 제공하는 AOP 프록시패턴은 무엇일까?
프록시(Proxy)란 대리인 즉 대신해서 실행해주는 역할을 한다. 그렇다면 어떻게 프록시방법을 이용하여 AOP를 구현할 수 있을까?
다음은 현금을 지불할때 어떠한 방식으로 지불할지 결정하는 인터페이스,클래스 예제이다. 이때 코드 중간중간 코드를 삽입해야할때 프록시 방법으로 진행을 해보겠다.
public interface Payment {
void pay(int amount);
}
public class Cash implements Payment{
@Override
public void pay(int amount) {
System.out.println("현금계산"+amount);
}
}
public class CreditCard implements Payment {
@Override
public void pay(int amount) {
System.out.println("카드계산"+amount);
}
}
/////////////////////Proxy부분
public class PaymentProxy implements Payment {
private Payment payment;
public PaymentProxy(Payment payment)
{
this.payment=payment;
}
@Override
public void pay(int amount) {
System.out.println("AOP1.---------");
payment.pay(100);
System.out.println("AOP2.---------");
}
}
///Main
public static void main(String[] args) {
PaymentProxy proxy=new PaymentProxy(new Cash());//Cash계산
proxy.pay(100);
proxy=new PaymentProxy(new CreditCard());//CreditCard계산
proxy.pay(100);
}
다음 예제를 보면 Payment 인터페이스, Cash,CreditCard 클래스 Pay()의 부분에는 단지 단일 기능만 수행한다. 추가적인 기능(중복기능)은 CashProxy에서 수행한다. 따라서 단일 클래스에서는 AOP(공통기능)부분을 신경쓸 필요가 없게 된다.
그렇다면 Aop를 구현하기 위해서는 이와 같이 직접적으로 Proxy를 생성해야할까? SpringFrameWork에서는 AOP를 어노테이션을 통해 처리할 수 있도록 기능을 제공한다. 다음장에서 알아보자.