Skip to content

Latest commit

 

History

History
119 lines (98 loc) · 4.69 KB

13장_프록시패턴_이주현.md

File metadata and controls

119 lines (98 loc) · 4.69 KB

프록시(Proxy) 패턴

  • 부가 기능을 위임하는 방법 image https://milkye.tistory.com/202

  • 다른 무언가와 이어지는 인터페이스 역할을 하는 클래스

  • 어떤 객체에 대한 접근을 제어하는 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴

프록시 패턴 클래스 다이어그램

image

프록시 패턴 시퀀스 다이어그램

image

  • 프록시와 리얼 서브젝트가 공유하는 인터페이스가 존재하고, 클라이언트는 인터페이스 타입으로 프록시를 사용
  • 클라이언트는 프록시를 거쳐 리얼 서브젝트를 사용하기 때문에, 프록시는 리얼 서브젝트에 대한 접근 관리, 부가기능 제공 등을 수행할 수 있음
  • 리얼 서브젝트는 자신히 해야할 핵심 기능만 수행하면서 프록시를 사용해 부가기능(로깅, 트랜잭션 등)을 제공하고자 할 때 이처럼 프록시 패턴을 주로 사용
  • 클라이언트는 프록시를 거쳐 리얼 서브젝트를 사용

로그인 기능

image

  • 핵심 기능: 로그인
  • 부가 기능: Logger, Transaction, ...
    • 문제점: 의존성, SRP 위반, 테스트 코드 작성 어려움 등

프록시 사용

image

  • 클라이언트의 입장에서는 로그인 기능을 사용하는 것은 동일함

예제 코드

@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 객체를 가지고 있음(위임)
  • 이를 통해 프록시는 부가 기능(트랜잭션, 로깅)을 수행하며 핵심 기능(로그인)도 수행할 수 있음

포워드 프록시와 리버스 프록시

image

포워드 프록시(Forward Proxy)

https://firework-ham.tistory.com/23

  • 일반적인 프록시는 포워드 프록시를 의미함
  • 클라이언트 -> 서버 요청 시 직접 요청이 아닌 프록시 서버를 거쳐서 요청
  • 서버에서 받는 IP는 클라이언트의 IP가 아닌 프록시 서버의 IP이기 때문에, 서버는 클라이언트가 누구인지 알 수 없음
  • 즉, 클라이언트가 감춰짐

포워드 프록시의 역할

  • 캐싱
  • 서버(IP) 우회
  • 보안망 제한

리버스 프록시(Reverse Proxy)

image https://firework-ham.tistory.com/23

  • 클라이언트가 서버를 호출할 때 리버스 프록시를 호출
  • 리버스 프록시 서버가 서버를 요청하여 받은 응답을 클라이언트에게 전달
    • Nginx, Apache Web Server