[디자인 패턴] 프록시 패턴

DaeHoon·2022년 9월 28일
0

디자인 패턴

목록 보기
1/1

프록시 패턴

  • 클라이언트가 특정 객체에 직접 접근하지 않고 프록시라는 대리 객체를 거쳐서 사용
  • 이를 통해 객체의 속성, 변환 등을 보완하며 보안, 데이터 검증, 캐싱, 로깅에 사용된다.

게임 서비스 예제

Subject

public interface GameService{
  void startGame();
}
  • 클라이언트가 접근하는 서비스의 인터페이스

RealSubject

public class DefaultGameService implements GameService {

  @Override
  public void startGame(){
    System.out.println("이 자리에 오신 것을 환영합니다.");
  }
}
  • 서비스의 구현체

Proxy

public class GameServiceProxy implements GameService{

  private GameService gameService;

  public GameServiceProxy(GameService gameService){
    this.gameService = gameService;
  }

  @Override
  public void startGame(){
    gameService.startGame();
    
  }
}
  • 실제 클라이언트가 접근하는 프록시 객체

Client

class Main {
  public static void main(String[] args) {
    GameService gameService = new GameServiceProxy(new DefaultGameService());
    gameService.startGame();
  }
}
  • 클라이언트는 프록시 객체의 startGame 메서드를 호출한다.
  • 호출되는 순간 인자로 받은 RealSubject에서 실제 로직이 수행된다.

사용되는 곳

nginx

  • nginx는 비동기 이벤트 기반의 구조와 다수의 연결을 효과적으로 처리 가능한 웹 서버이며, 주로 서버 앞단의 프록시 서버로 활용된다.
  • 사용자의 직접적인 서버로의 접근을 차단함으로써 보안성을 강화할 수 있다.
  • 또한 정적 자원을 엔진엑스에 두어 캐싱을 하거나 로깅을 할 수도 있다.

CloudFare

  • CloudFare는 전 세계적으로 분산된 서버가 있고 이를 통해 어떠한 시스템의 콘텐츠 전달을 빠르게 할 수 있는 CDN 서비스이다.
  • CDN 기능 뿐만 아니라 사용자가 접속하는 것이 아닌 시스템을 통해 오는 트래픽을 자동으로 차단해 ddos 공격으로부터 서버를 보호한다.

(※ CDN: 각 사용자가 인터넷에 접속하는 곳과 가까운 곳에서 콘텐츠를 캐싱 또는 배포하는 서버 네트워크를 말한다. 이를 통해 사용자가 웹 서버로부터 콘텐츠를 다운로드 하는 시간을 줄일 수 있다.)

CORS와 프론트엔드의 프록시 서버

  • CORS는 서버가 웹 브라우저에서 리소스를 로드할 때 다른 오리진을 통해 로드하지 못하게 하는 HTTP 헤더 기반 메커니즘
  • 예를 들어 프론트엔드에서는 localhost:3000으로 테스팅을 하는데 백엔드 서버가 localhost:12010 이라면 포트 번호가 다르기 때문에 CORS 에러가 난다. 이 때 프록시 서버를 두어 프론트엔드 서버에서 요청되는 오리진을 localhost:12010으로 변경하여 서버에 요청을 보낸다.

(※ 오리진: 프로토콜과 호스트 이름, 포트의 조합을 말한다. 예를 들어 https://velog.io:98765/dhkang이라는 주소에서 오리진은 https://velog.io:98765을 말한다.)

profile
평범한 백엔드 개발자

0개의 댓글