ilot
ilot의 블로그
ilot
전체 방문자
오늘
어제
  • 분류 전체보기 (17)
    • Algorithm (0)
    • Data Structure (0)
    • Database (0)
    • Operating System (0)
    • Network (0)
    • OOP (1)
    • Design Pattern (5)
    • Java (2)
    • Spring (5)
    • Mybatis (1)
    • JavaScript & TypeScript (0)
    • React (0)
    • Coding Test (2)
    • 독후감 (1)
    • 일상 (0)

블로그 메뉴

  • 홈
  • Github

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ilot

ilot의 블로그

Design Pattern

[Design Pattern] 프록시 (Proxy)

2022. 10. 24. 22:08
출처 : https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4

프록시 (Proxy)

  • 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴.

어디에 쓸 수 있는가

  • 해당 객체의 접근 제어
  • 객체에 대한 보안 - 특정 유저의 권한 유무를 확인하여, 특정 객체에 접근 가능/불가능을 판별한다.
  • 로깅, 캐싱
  • 생성하는 데 많은 리소스를 요구하는 객체를 실제로 쓰일 때 생성하는 초기화 지연 방식으로 리소스를 아낀다.

왜 쓰는가

  • 기존 코드를 전혀 건드리지 않고 특정 기능을 추가
  • 기존 코드를 건드리지 못할 때 특정 기능을 추가

장점

  • 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있다.
  • 기존 코드가 해야하는 일만 유지할 수 있다.
  • 기능 추가 및 초기화 지연 등으로 다양하게 활용할 수 있다.

단점

  • 코드의 복잡도가 증가한다.

예시 (as-is)

public class GameService {

  public void startGame() {
    System.out.println("게임을 시작합니다.");
    Thread.sleep(1000L);
  }

}

public class Client {

  public static void main(String[] args) {
    GameService gameService = new GameService();
    gameService.startGame();
  }

}

예시 (to-be) : 기존 코드를 건드릴 수 없을 때

public class GameService {

  public void startGame() {
    System.out.println("게임을 시작합니다.");
    Thread.sleep(1000L);
  }

}

public class GameServiceProxy extends GameService {
	
  @Override
  public void startGame() {
    long before = System.currentTimeMillis();
    super.startGame();
    System.out.println(System.currentTimeMillis() - before);
  }

}

public class Client {

  public static void main(String[] args) {
    GameService gameService = new GameServiceProxy();
    gameService.startGame();
  }

}

예시 (to-be) : 기존 코드를 건드릴 수 있을 때

public interface GameService {

  void startGame();

}

public class DefaultGameService implements GameService {

  @Override
  public void startGame() {
    System.out.println("게임을 시작합니다.");
    Thread.sleep(1000L);
  }

}

public class GameServiceProxy implements GameService {

  private GameService gameService;

  public GameServiceProxy(GameService gameService) {
    this.gameService = gameService;
  }
  
  @Override
  public void startGame() {
    long before = System.currentTimeMillis();

    // 굳이 주입하지 않게 기본 값을 넣는다.
    if (this.gameService == null) {
      this.gameService = new DefaultGameService();
    }

    gameService.startGame();
    System.out.println(System.currentTimeMillis() - before);
  }

}

public class Client {

  public static void main(String[] args) {
    GameService gameService = new GameServiceProxy(new DefaultGameService());
    gameService.startGame();
  }

}

활용

  • 자바의 다이나믹 프록시, java.lang.reflect.Proxy : 런타임에 프록시 객체를 만들어줌
  • Spring의 AOP : 여러 군데에 흩어진 코드를 Aspect라는 관점에 모아서 코딩할 수 있게 도와주는 기법
    • interface의 경우 : 다이나믹 프록시를 사용해서 interface를 구현한 프록시 객체를 사용하게 된다.
    • class의 경우 : CGLib을 사용해서 바이트 코드를 조작하여 만들어진 프록시 객체를 사용하게 된다.
  • Spring의 @Transactional, @Cachable, ...

'Design Pattern' 카테고리의 다른 글

[Design Pattern] Factory Method Pattern (팩토리 메서드 패턴)  (0) 2022.11.13
[Design Pattern] Singleton Pattern (싱글톤 패턴)  (0) 2022.11.12
[Design Pattern] Composite Pattern (컴포지트 패턴)  (0) 2022.11.07
[Design Pattern] 전략 패턴 (Strategy Pattern)  (1) 2022.10.30
    'Design Pattern' 카테고리의 다른 글
    • [Design Pattern] Factory Method Pattern (팩토리 메서드 패턴)
    • [Design Pattern] Singleton Pattern (싱글톤 패턴)
    • [Design Pattern] Composite Pattern (컴포지트 패턴)
    • [Design Pattern] 전략 패턴 (Strategy Pattern)
    ilot
    ilot
    _

    티스토리툴바