프록시는 기존 코드에 영향을 주지 않으면서 타깃의 기능을 확장하거나 접근 방법을 제어할 수 있는 유일한 방법이다.

프록시 구성과 프록시 작성의 문제점

프록시를 구성하는 기능

  1. 타깃과 같은 메서드를 구현하고 있다가 메서드가 호출되면 타깃 오브젝트로 위임
  2. 지정된 요청에 대해서 부가기능 수행

UserServiceTx 프록시의 기능 구분: 위임과 부가기능

public class UserServiceTx implements UserService{
// 타깃 오브젝트
  UserService userService;
  
// 메서드 구현과 위임
  @Override
  public void add(User user) {
    userService.add(user);
  }

// 메서드 구현
  @Override
  public void upgradeLevels() {
// 부가기능 수행
    TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition());
    try{
// 위임
      userService.upgradeLevels();
// 부가기능 수행
      this.transactionManager.commit(status);
    }catch (RuntimeException e){
      this.transactionManager.rollback(status);
      throw e;
    }
  }
}

프록시 만들기가 번거로운 이유는 무엇일까.

  1. 타깃의 인터페이스를 구현하고 위임하는 코드를 작성하기가 번거롭다.
  2. 부가기능 코드가 중복될 가능성이 많다.

위 문제를 해결하는데 유용한 것이 바로 JDK 의 다이나믹 프록시

리플렉션

다이내믹 프록시는 리플렉션 기능을 이용해서 프록시를 만들어준다.