Proxy Pattern
- 실체 객체에 대한 대리자를 둠
원격프록시: 서로 다른 주소 공간에 존재하는 원격 객체를 대리하는 로컬 객체가상 프록시: 실제 객체가 모두 생성되기 전 대신 해주는 프록시보호프록시: 실제 객체에 대한 접근 권한을 제어하기 위한 경우 사용
- 실제 객체와 프록시는 동일한 메서드 제공
- 클라이언트가 호출하는 메서드는 프록시의 메서드
- 처리는 프록시가 할 수도 있고 실제 객체가 할 수도 있음
=> 제어의 흐름을 조정
=> DIP와 OCP 적용된 설계 패턴
code : 가상프록시 예시
- Serviceinterface
public interface Printable { void setPrinterName(String name); String getPrinterName(); void print(String str); }
- Proxy
public class PrinterProxy implements Printable{ private String name; private Printer real; @Override public synchronized void setPrinterName(String name) { if(real != null) { real.setPrinterName(name); } this.name = name; System.out.println("PrinterProxy: setPrinterName()" ); } //.....@Override 해야 하는 메서드들 작성할 것 }
- Service
public class Printer implements Printable{ private String name; public Printer(String name){ this.name = name; heavyJob("Printer 생성중...."); } //..... @Override해야 하는 메서드들 작성할 것 public void heavyJob(String msg) { System.out.println(msg); for(int i=0; i<5; i++){ try{ Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("."); } System.out.println("생성 완료"); } }
장단점
장점
1. 클라이언트들이 알지 못하는 상태에서서비스 객체 제어가능
2. 클라이언트들이 신경쓰지 않을 때 서비스객체의 수명 주기 관리가능
3. 서비스 객체가 준비되지 않았거나 사용할 수 없는 경우에도 작동
4.개방폐쇄의원칙: 서비스나 클라이언트를 변경하지 않고도 새 프록시 도입할 수 있음
단점
1. 코드가 복잡해질 수 있음
- 서비스의 응답이 늦어질 수 있음
정리
synchronized
- 멀티스레드 환경에서 한 스레드가 해당 영역을 사용중이면 lock을 걸어 다른 스레드가 접근할 수 없도록 함. => 동시 접근 방지
- 메서드 단위에 적용할 수도 있고 코드 블럭 단위에 적용할 수도 있음
Thread
- 프로세스 내에서 작업을 수행하는 단위
출처
이 글은 인프런 박은종 강사님의 강의 내용을 정리하기 위하여 작성하였습니다.