본문 바로가기

Java/Java

(JAVA) 프록시 패턴

  • 프록시와 리얼 서브젝트는 똑같은 인터페이스를 구현한다.
  • 프록시는 리얼 서브젝트를 참조한다.
  • 클라이언트는 공유 인터페이스 타입으로 사실상 프록시를 사용한다.

프록시가 클라이언트의 요청을 자신이 처리할 수 있으면 자신이 처리

하지만 여의치 않다면 리얼 서브젝트에게 양도한다.

즉!

  • 프록시와 리얼 서브젝트가 공유하는 인터페이스가 있고, 클라이언트는 해당 인터페이스 타입으로 프록시를 사용한다.

  • 클라이언트는 프록시를 거쳐서 리얼 서브젝트를 사용하기 때문에 프록시는 리얼 서브젝트에 대한 접근을 관리하거나 부가기능을 제공하거나, 리턴 값을 변경할 수도 있다.

  • 리얼 서브젠트는 자신이 해야 할 일만 하면서(SRP) 프록시를 사용해서 부가적인 기능(접근 제한, 로깅, 트랜잭션, 등)을 제공할 때 이런 패턴을 주로 사용한다.


 

코드 작성

BookService - 인터페이스(서브젝트)

BookServiceProxy - 프록시

DefaultBookService - 리얼 서브젝트

 

  • BookService
public interface BookService {

    public void run(Book book);

}

 

  • BookServiceProxy - 생성자의 파라미터로 인터페이스
public class BookServiceProxy implements BookService{

    BookService bookService;

    public BookServiceProxy(BookService bookService) {
        this.bookService = bookService;
    }

    @Override
    public void run(Book book) {
        System.out.println("aaaa");
        bookService.run(book);
        System.out.println("bbbb");
    }
}
  • DefaultBookService
public class DefaultBookService implements BookService{
    @Override
    public void run(Book book) {
        System.out.println("rent: "+book.getTitle());
    }
}
  • BookServiceTest
public class BookServiceTest {

    //BookService bookService = new DefaultBookService();
    BookService bookService = new BookServiceProxy(new DefaultBookService());

    @Test
    public void di() {
        Book book = new Book();
        book.setTitle("spring");
        bookService.run(book);
    }
}

프록시의 인스턴스를 생성할 때 리얼 서브젝트의 인스턴스도 끼워서 생성하면서

실행 시 각각의 영역이 구별되어 실행되는 느낌

* realSubject를 가지고 있더라도 쓰지 않을 수 도 있다.

 

실행결과


Code Link

https://github.com/mike6321/PURE_JAVA/tree/master/TheJava/proxy-pattern

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com