Proxy ❓
대리자, 대변인으로 다른 누군가를 대신해서 그 역활을 수행하는 존재.
인터페이스를 사용, 실행시킬 클래스에 대한 객체가 들어갈 자리에 대리자 객체를 대신 투입
흐름제어만 할 뿐 결과값을 조작하거나 변경시키면 안된다.
프록시 패턴의 특징
프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다.
서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 부른다.
프록시 서버 중 일부는 프록시 서버에 요청된 내용들을 캐시를 이용하여 저장해 둔다.
Interface
public interface IService {
String runable();
}
runable 메소드를 가진 인터페이스
Proxy
public class Proxy implements IService{
IService service;
@Override
public String runable() {
System.out.println("반환결과를 건드리지 않지");
service = new Service();
return service.runable();
}
}
프록시를 선언시 새로운 서비스 객체를 생성해서 service.runable 내용 return
Service
public class Service implements IService{
@Override
public String runable() {
return "서비스 좋아요!";
}
}
Main
public class Main {
public static void main(String[] args) {
IService proxy = new Proxy();
System.out.println(proxy.runable());
}
}
그럼 실행한다면?
새로운 서비스 객체를 만들어 runable 내용까지 반환해줄것이다.
예상 출력
반환결과를 건드리지 않지
서비스 좋아요!
결과
반환결과를 건드리지 않지
서비스 좋아요!
⭕ 프록시패턴 장점
- 사이즈가 큰 객체가 로딩되기 전에도 프록시를 통해 참조를 할 수 있다.
- 실제 객체의 public, protected 메소드를 숨기고 인터페이스를 통해 노출시킬 수 있다.
- 로컬에 있지 않고 떨어져있는 객체를 사용할 수 있다.
- 원래 객체에 접근에 대해 사전처리를 할 수 있다.
❌ 프록시패턴 단점
- 객체를 생성할 때 한 단계를 거치게 되므로, 빈번한 객체 생성이 필요한 경우 성능이 저하될 수 있다.
- 프록시 내부에서 객체 생성을 위해 스레드가 생성, 동기화가 구현되어야 하는 경우 성능이 저하될 수 있다.
- 로직이 난해해져 가독성이 떨어질 수 있다.
클라이언트(사용자)가 인터넷에 직접 접근하는게 아니라 포워드 프록시 서버가 요청을 받고 인터넷에 연결하여 결과를 클라이언트에 전달 (forward) 해준다.
프록시 서버는 Cache 를 사용하여 자주 사용하는 데이터라면 요청을 보내지 않고 캐시에서 가져올 수 있기 때문에 성능 향상이 가능하다.
클라이언트가 인터넷에 데이터를 요청하면 리버스 프록시가 이 요청을 받아 내부 서버에서 데이터를 받은 후 클라이언트에 전달한다.
클라이언트는 내부 서버에 대한 정보를 알 필요 없이 리버스 프록시에만 요청하면 된다.
내부 서버 (WAS) 에 직접적으로 접근한다면 DB 에 접근이 가능하기 때문에 중간에 리버스 프록시를 두고 클라이언트와 내부 서버 사이의 통신을 담당한다.
또한 내부 서버에 대한 설정으로 로드 밸런싱(Load Balancing) 이나 서버 확장 등에 유리하다.
Forward Proxy 는 클라이언트가 요청하는 End Point 가 실제 서버 도메인이고 프록시는 둘 사이의 통신을 담당해준다.
Reverse Proxy 는 클라이언트가 요청하는 End Point 가 프록시 서버의 도메인이고 실제 서버의 정보는 알 수 없다.
Forward Proxy 는 클라이언트가 감춰진다.
요청 받는 서버는 포워드 프록시 서버를 통해서 요청을 받기 때문에 클라이언트의 정보를 알 수 없다.
Reverse Proxy 는 반대로 서버가 감춰진다.
클라이언트는 리버스 프록시 서버에게 요청하기 때문에 실제 서버의 정보를 알 수가 없다.
https://limkydev.tistory.com/79
https://bcp0109.tistory.com/194
https://velog.io/@newtownboy/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%ED%94%84%EB%A1%9D%EC%8B%9C%ED%8C%A8%ED%84%B4Proxy-Pattern