[java] 자바 프록시 패턴을 활용한 로깅 기능 구현

우리는 자바 어플리케이션에서 로깅 기능을 구현하는 것이 중요하다는 것을 알고 있습니다. 이러한 기능은 소스 코드에 분산되어 있을 수 있으며, 코드를 변경하지 않고도 로깅을 추가하거나 제어할 수 있는 방법이 필요합니다.

이를 위해 자바의 프록시 패턴을 사용하여 로깅 기능을 구현하는 방법을 살펴보겠습니다.

프록시 패턴

프록시 패턴은 기본적으로 다른 객체에 대한 인터페이스를 제공하여 해당 객체에 대한 접근을 제어하거나 대리할 수 있도록 하는 구조적 디자인 패턴입니다.

로깅 프록시 구현

우선 간단한 인터페이스를 만들어 보겠습니다. 이 인터페이스는 실제 작업을 처리하는 클래스의 메서드와 동일한 시그니처를 갖습니다.

public interface Service {
    void doSomething();
}

다음으로, 이 인터페이스를 구현하는 실제 클래스를 만듭니다.

public class RealService implements Service {
    @Override
    public void doSomething() {
        System.out.println("실제 작업을 수행합니다.");
    }
}

이제 프록시 클래스를 작성하여 실제 작업을 수행하는 클래스를 감싸고 추가 기능을 수행할 수 있도록 합니다.

public class LoggingProxy implements Service {
    private Service service;

    public LoggingProxy(Service service) {
        this.service = service;
    }

    @Override
    public void doSomething() {
        System.out.println("작업을 수행하기 전에 로깅을 시작합니다.");
        service.doSomething();
        System.out.println("작업을 완료하고 로깅을 마칩니다.");
    }
}

사용 방법

실제 사용 시에는 프록시를 통해 실제 서비스에 액세스합니다.

public class Main {
    public static void main(String[] args) {
        Service service = new RealService();
        Service proxy = new LoggingProxy(service);
        proxy.doSomething();
    }
}

위와 같이 하면 LoggingProxydoSomething 메서드가 호출되고, 원하는 로깅 기능이 추가된 후에 RealServicedoSomething 메서드가 호출됩니다.

이러한 방식으로 프록시 패턴을 사용하여 로깅 기능을 추가하고, 실제 동작을 변경하지 않으면서 유연하게 제어할 수 있습니다.

이처럼 프록시 패턴을 활용하여 로깅 기능을 구현하는 방법을 살펴보았습니다. 이 패턴은 다른 추가적인 기능을 구현할 때도 유용하게 활용될 수 있으므로, 기억해 두시면 좋을 것 같습니다.