[java] 자바 프록시 패턴의 사용 용도

프록시 패턴은 객체의 대리인 또는 대변인으로서 다른 객체에 대한 접근을 제어하는 디자인 패턴이다. 자바에서 프록시 패턴은 다양한 용도로 활용된다.

1. 보안 제어

프록시는 접근 제어를 구현하는데 사용될 수 있다. 예를 들어, 사용자가 특정 메소드에 접근할 수 있는지 검사하고, 허가된 경우에만 실제 객체에 접근을 허용하는 용도로 사용될 수 있다.

public interface UserService {
    void deleteUser(int userId);
}

public class SecureUserServiceProxy implements UserService {
    private UserService userService;

    public SecureUserServiceProxy(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void deleteUser(int userId) {
        if (SecurityContext.checkUserPermission(userId)) {
            userService.deleteUser(userId);
        } else {
            throw new SecurityException("Permission denied");
        }
    }
}

2. 성능 측정

프록시는 실제 객체의 메소드 호출 전후에 성능 측정을 할 수 있다. 이를 통해 메소드 실행 시간이나 자원 사용량을 측정하여 성능 향상을 위한 최적화 작업을 수행할 수 있다.

public class PerformanceMonitorProxy implements UserService {
    private UserService userService;

    public PerformanceMonitorProxy(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void deleteUser(int userId) {
        long startTime = System.currentTimeMillis();
        userService.deleteUser(userId);
        long endTime = System.currentTimeMillis();
        System.out.println("Execution time: " + (endTime - startTime) + "ms");
    }
}

3. 로깅 및 오류 처리

프록시는 로깅이나 예외 처리와 같은 부가적인 작업을 처리하는 용도로 사용될 수 있다. 메소드 호출 시 로그를 남기거나 예외가 발생할 경우 특정 동작을 수행하는 등의 작업을 수행할 수 있다.

public class LoggingProxy implements UserService {
    private UserService userService;

    public LoggingProxy(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void deleteUser(int userId) {
        System.out.println("Deleting user with ID: " + userId);
        userService.deleteUser(userId);
        System.out.println("User deleted successfully");
    }
}

프록시 패턴은 다양한 용도로 활용될 수 있으며, 유연하고 확장 가능한 소프트웨어 시스템을 설계하는데 유용한 도구로 활용될 수 있다.

참고 문헌:
Oracle - Design Patterns: Proxy
HowToDoInJava - Proxy Design Pattern in Java