본문 바로가기

[Spring]

[Spring]11월 10일 Spring AOP 프록시패턴(Proxy pattern) 적용 예제


프록시 패턴(proxy pattern)이란?

프록시 패턴(proxy pattern)은 컴퓨터 프로그래밍에서 소프트웨어 디자인 패턴의 하나이다.

일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스이다. 프록시는 어떠한 것(이를테면 네트워크 연결, 메모리 안의 커다란 객체, 파일, 또 복제할 수 없거나 수요가 많은 리소스)과도 인터페이스의 역할을 수행할 수 있다.


단순하게 설명하자면 기능 호출을 대신해주는 패턴이다.


http://smjava.tistory.com/65 에 있는 예제를 활용해서 

dog,cat 이 두개의 클래스를 이용해 aop2패키지를 만들어서 복사 붙혀넣기 해서 

dog,cat을 인터페이스 Animal을 이용해 관계를 맺어주고 프록시패턴을 적용해보자.


Animal 인터페이스

package aop2;


public interface Animal {

public void doSomething();

}


Animal 인터페이스를 implements 한 dog 클래스

package aop2;


public class Dog implements Animal{

public void doSomething(){

System.out.println("주인을 기다린다");

System.out.println("주인이 집에 들어온다");

try

{

System.out.println("꼬리를 흔들며 반긴다");

System.out.println("밥을 준다");

}

catch(Exception e)

{

System.out.println("밤새 운다");

}

System.out.println("밥을 맛있게 먹는다");

}

}


Animal 인터페이스를 implements 한 cat 클래스

package aop2;


public class Cat implements Animal{

public void doSomething(){

System.out.println("주인을 기다린다");

System.out.println("주인이 집에 들어온다");

try

{

System.out.println("들어오던지 말던지 신경안쓴다");

System.out.println("밥을 준다");

}

catch(Exception e)

{

System.out.println("밤새 운다");

}

System.out.println("밥을 맛있게 먹는다");

}

}


프록시패턴 만들기

1. 기능을 정의하는 인터페이스 작성

2. 1을 implements 해서 기능을 구현하는 실제 클래스 작성

3. 1을 implements 해서 2의 기능을 대신 호출해주는 프록시 클래스 작성


프록시 클래스 작성하기

1. 대상 인터페이스를 implements

2. 대상 인터페이스 타입의 참조변수를 가진다.

3. 2참조변수에 객체를 주입받고

4. 1에서 물려받은 함수에서 2가 구현한 함수를 대신 호출


위 순서에 맞춰 프록시 클래스를 작성해보자.

 package aop2;


public class AnimalProxy implements Animal{

private Animal animal;

public void setAnimal(Animal animal)

{

this.animal = animal;

}

@Override

public void doSomething() {

// FIXME Auto-generated method stub

animal.doSomething();       

}

}


animal.doSomething();  에서 Animal이 dog냐 cat이냐에 따라 결정되는 핵심 관심.


기능을 호출해볼 메인 함수

package aop2;


public class Test {


public static void main(String[] args) {

// FIXME Auto-generated method stub

Animal animal = new Dog();

AnimalProxy p = new AnimalProxy();

p.setAnimal(animal);

p.doSomething();

}


}


animal의 doSomething을 호출하지 않고, p에 animal을 주고 p의 doSomething을 부르면 p가 대신해서 animal의

doSomething을 불러준다.


그럼 이번에는 animal을 구현하는 dog,cat 은 핵심 관심 사항만 구현하고,

AnimalProxy는 공통 관심 사항을 포함해서 dog,cat의 핵심 관심 사항을 대신 호출하게 해보자.


dog

package aop3;


public class Dog implements Animal{

public void doSomething(){

System.out.println("꼬리를 흔들며 반긴다");

}

}


cat

package aop3;


public class Cat implements Animal{

public void doSomething(){

System.out.println("들어오던지 말던지 신경안쓴다");

}

}

공통 관심 사항을 둘다 지워주고, 핵심 관심 사항 코드만 남겨두자.


공통 관심 사항을AnimalProxy 에다 넣어주자.

package aop3;


public class AnimalProxy implements Animal{

private Animal animal;

public void setAnimal(Animal animal)

{

this.animal = animal;

}

@Override

public void doSomething() {

// FIXME Auto-generated method stub

System.out.println("주인을 기다린다");

System.out.println("주인이 집에 들어온다");

try

{

animal.doSomething();

System.out.println("밥을 준다");

}

catch(Exception e)

{

System.out.println("밤새 운다");

}

System.out.println("밥을 맛있게 먹는다");

}

}

위에서 핵심 관심 사항을 인터페이스다형성(전략패턴)을 통해서 바꿔서 낄수 있다.



출처 : 삼성SDS멀티캠퍼스

강사 : 홍승길

Email : iccack70@gmail.com