-
부가 기능을 위임하는 방법
https://milkye.tistory.com/202 -
다른 무언가와 이어지는 인터페이스 역할을 하는 클래스
-
어떤 객체에 대한 접근을 제어하는 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴
- 프록시와 리얼 서브젝트가 공유하는 인터페이스가 존재하고, 클라이언트는 인터페이스 타입으로 프록시를 사용
- 클라이언트는 프록시를 거쳐 리얼 서브젝트를 사용하기 때문에, 프록시는 리얼 서브젝트에 대한 접근 관리, 부가기능 제공 등을 수행할 수 있음
- 리얼 서브젝트는 자신히 해야할 핵심 기능만 수행하면서 프록시를 사용해 부가기능(로깅, 트랜잭션 등)을 제공하고자 할 때 이처럼 프록시 패턴을 주로 사용
- 클라이언트는 프록시를 거쳐 리얼 서브젝트를 사용
- 핵심 기능: 로그인
- 부가 기능: Logger, Transaction, ...
- 문제점: 의존성, SRP 위반, 테스트 코드 작성 어려움 등
- 클라이언트의 입장에서는 로그인 기능을 사용하는 것은 동일함
@Getter
@Setter
@AllArgsConstructor
public class User {
private String id;
private String pw;
}
/* 서브젝트 역할 */
public interface LoginService {
void login(User user);
}
/* 프록시 */
public class LoginServiceProxy implements LoginService {
// 프록시는 리얼 서브젝트를 가지고 있어야 함(delegate ->)
private final RealLoginService realLoginService;
public LoginServiceProxy(RealLoginService realLoginService) {
this.realLoginService = realLoginService;
}
// 프록시에서 부가기능을 추가
@Override
public void login(User user) {
transactionProcessor();
realLoginService.login(user); // 프록시 -> 리얼 서브젝트
logging();
}
private void transactionProcessor() {
System.out.println("트랜잭션 처리");
}
private void logging() {
System.out.println("로깅");
}
}
/* 리얼 서브젝트 역할 */
@Service
public class RealLoginService implements LoginService {
/*
login(): 로그인(핵심 기능) 메소드
로그인을 하기 전 트랜잭션 & 로깅(부가 기능) 추가
*/
public void login(User user) {
System.out.println("ID: " + user.getId() + ", PW: " + user.getPw());
}
}
/* 클라이언트 */
public class Client {
public static void main(String[] args) {
LoginService loginService = new LoginServiceProxy(new RealLoginService());
loginService.login(new User("test", "1234"));
}
}
트랜잭션 처리
ID: test, PW: 1234
로깅- 프록시의 역할을 하는 LoginServiceProxy는 리얼 서브젝트인 RealLoginService 객체를 가지고 있음(위임)
- 이를 통해 프록시는 부가 기능(트랜잭션, 로깅)을 수행하며 핵심 기능(로그인)도 수행할 수 있음
https://firework-ham.tistory.com/23
- 일반적인 프록시는 포워드 프록시를 의미함
- 클라이언트 -> 서버 요청 시 직접 요청이 아닌 프록시 서버를 거쳐서 요청
- 서버에서 받는 IP는 클라이언트의 IP가 아닌 프록시 서버의 IP이기 때문에, 서버는 클라이언트가 누구인지 알 수 없음
- 즉, 클라이언트가 감춰짐
포워드 프록시의 역할
- 캐싱
- 서버(IP) 우회
- 보안망 제한
https://firework-ham.tistory.com/23
- 클라이언트가 서버를 호출할 때 리버스 프록시를 호출
- 리버스 프록시 서버가 서버를 요청하여 받은 응답을 클라이언트에게 전달
- Nginx, Apache Web Server




