Dev 달팽이 @_''

Java - 프록시 패턴 본문

Java&Spring/더 자바, 코드를 조작하는 다양한 방법

Java - 프록시 패턴

다본죽 2022. 1. 9. 22:11

Java - 프록시 패턴

Sequence Diagram

프록시 패턴(Proxy Pattern)

  • 프록시와 리얼 서브젝트가 공유하는 인터페이스가 있고, 클라이언트는 해당 인터페이스 타입으로 프록시를 사용
  • 클라이언트는 프록시를 거쳐서 리얼 서브젝트를 사용하기 때문에 프록시는 리얼 서브젝트에 대한 접근을 관리하거나 부가기능을 제공하거나, 리턴값을 변경할 수도 있음
  • 리얼 서브젝트는 자신이 해야 할 일만 하면서(SRP : Single Responsibility Principle,단일 책임 원칙) 프록시를 사용해서 부가적인 기능(접근 제한, 로깅, 트랜잭션 등)을 제공할 때 이런 패턴을 주로 사용

프록시 간단한 예제

 

Book.java

public class Book {

    public String title;

    public Book() {
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

 

BookService.java

public interface BookService {

    void rent(Book book);

}

 

DefaultBookService.java

public class DefaultBookService implements BookService{

    @Override
    public void rent(Book book) {
        System.out.println("rent : "+ book.getTitle());
    }
}

 

BookServiceProxy.java

public class BookServiceProxy implements BookService{

    BookService bookService;

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

    @Override
    public void rent(Book book) {
        System.out.println("this is proxy");
        bookService.rent(book);
    }
}

 

BookServiceTest.java

public class BookServiceTest {

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

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

}

  • BookServiceTest가 클라이언트
  • BookServiceTest가 BookService 인터페이스를 이용
  • BookService 인터페이스는 BookServiceProxy를 이용
  • BookServiceProxy는 내부적으로 DefaultBookService를 참조

프록시 패턴의 문제점

  • 번거로움
  • 부가적인 기능을 추가할 때 마다 프록시를 추가해줘야함
  • 프록시를 프록시로 감싸는 경우도 생김
  • 모든 구현체에서 중복되는 코드가 발생할 수 있음

=> 매번 프록시에 해당하는 클래스를 만드는 것이 아닌 동적으로 런타임에 생성하는 방법(다이나믹 프록시)을 사용,

자바 리플렉션에서 제공하는 기능