프록시 패턴은 디자인 패턴의 하나로, 특정 객체에 대한 접근을 제어하거나 추가적인 기능을 부여하기 위해 해당 객체의 대리자를 제공하는 패턴이다. 프록시(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의 핵심 기능을 수행하며, 추가적인 기능(트랜잭션)도 함께 수행하는 것을 확인할 수 있다.