[Java] 프록시 패턴

gyu·2024년 5월 6일

프록시 패턴(Proxy pattern)

프록시 패턴은 디자인 패턴의 하나로, 특정 객체에 대한 접근을 제어하거나 추가적인 기능을 부여하기 위해 해당 객체의 대리자를 제공하는 패턴이다. 프록시(Proxy)는 원래 객체를 감싸는 래퍼(Wrapper) 또는 에이전트 역할을 하며, 클라이언트의 요청을 실제 객체로 전달하기 전에 전처리 또는 후처리를 수행할 수 있다.


이미지 출처: 위키백과

프록시 패턴 예제 코드

기존 서비스 로직에 트랜잭션 로직을 대신 수행해주는 프록시 패턴을 구현해보자.
트랜잭션 begin, commit, rollback은 System.out.println으로 대체한다.

UserService.java(interface)

public interface UserService {
    void doAction();
}

UserServiceImpl.java

public class UserServiceImpl implements UserService {

    @Override
    public void doAction() {
        System.out.println("doAction!");
    }
}

UserServiceProxy.java

public class UserServiceProxy implements UserService {

    private UserService userService;

    @Override
    public void doAction() {
        
        if (userService == null) {
            userService = new UserServiceImpl();
        }
        
        try {
            // 트랜잭션 시작
            System.out.println("Transaction begin");
            userService.doAction();
            // 트랜잭션 commit
            System.out.println("Transaction commit");
        } catch (Exception e) {
            // 트랜잭션 rollback
            System.out.println("Transaction rollback");
        }
    }
}

Main.java

public class Main {

    public static void main(String[] args) {
        UserService proxy = new UserServiceProxy();
        proxy.doAction();
    }
}

출력 결과

UserService의 역할을 대신 수행하는 UserServiceProxy가 추가되었다.
UserService 인스턴스를 직접 생성하지 않고 UserServiceProxy에서 UserService의 핵심 기능을 수행하며, 추가적인 기능(트랜잭션)도 함께 수행하는 것을 확인할 수 있다.

프록시 패턴의 장단점

장점

  • 실제 객체에 대한 접근을 제어할 수 있다.
  • 객체 초기화 지연 및 기능 추가로 다양하게 활용할 수 있다.
  • 객체지향 5대 원칙 중 OCP(open/closed principle), SRP(single responsibility principle)를 지킬 수 있다.
    • OCP(개방-폐쇄 원칙): 기존 서비스의 코드 변경 없이 프록시 객체로 인해 새로운 기능을 추가할 수 있다.
    • SRP(단일 책임 원칙): 프록시 객체가 따로 존재함으로써 기존 서비스 객체의 책임은 그대로 유지된다.

단점

  • 기존 객체의 수만큼 프록시 객체를 따로 만들어서 구현해야하므로 복잡도가 높아질 수 있다.
    • ex) UserService 말고도 OrderService, CartService가 추가되면 OrderServiceProxy, CartServiceProxy를 일일이 추가해야한다.

0개의 댓글