[ GoF디자인패턴 ] proxy 패턴

혜인·2022년 3월 28일
0

proxy 패턴

  • 특정 객체에 대한 접근을 제어하거나 기능 추가 패턴
  • 요청을 다 프록시가 먼저 받는 구조
  • 객체 접근제어, 초기화 지연, 로깅, 캐싱

장점

  • 기존코드 변경하지 않고 새 기능 추가 기능
    open closed principle 개방폐쇄원칙
  • 기존코드가 해야하는 일만 유지 가능
    single responsibility principle 단일책임원칙
  • 기능추가 및 초기화 지연 등으로 다양하게 활용 가능

단점

  • 코드의 복잡도가 높아진다.

예시코드

H2DB

H2 Database, JPA를 연습하는 코드에 적용해봤다.
H2DB 설치 에서 설치 한 뒤,
bin폴더 안 h2w.bat 파일을 실행하면 H2서버가 구동 된다.

package 구조

code

  • Main.class
public class Main {
    public static void main(String[] args) {

        Selector selector = new ProxySelector(new QuerySelector(), Code.LAZY);

        selector.select();


    }
}
 
  • QuerySelector.class
    이 부분이 realsubject
public class QuerySelector implements Selector{


    @Override
    public Member select() {
        Member member = new Member();
        member.setId(100L);
        member.setName("안녕하세요");
        return member;
    }
}
  • Selector.interface
    subject 인터페이스
@FunctionalInterface
public interface Selector {

    Member select();

}
  • ProxySelector.class
    proxy
public class ProxySelector  implements Selector{

    private final QuerySelector querySelector;
    private final Code code;

    public ProxySelector(QuerySelector querySelector, Code code) {
        this.querySelector = querySelector;
        this.code = code;
    }


    @Override
    public Member select(){
        //Transaction - Begin
        CEntityManagerFactory.initialization();

        EntityManager entityManager = CEntityManagerFactory.createEntityManager();
        EntityTransaction entityTransaction =  entityManager.getTransaction();
        entityTransaction.begin();
        //Transaction - Commit
        try {
            if(Code.LAZY == code){
                System.out.println("Loading만 되었어!");
            }else{

            }
                Selector selector = ()->{
                    Member member = new Member();
                    member.setId(100L);
                    member.setName("test");
                    return  member;
                };
            Member member = selector.select();
           // Member member = this.querySelector.select();
            entityManager.persist(member);
            entityTransaction.commit();
        }
        //Transaction - Rollback
        catch (Exception e) {
            entityTransaction.rollback();
        }
        //Transaction - Close
        finally {
            entityManager.close();
        }
        CEntityManagerFactory.close();

        return null;
    }

}
  • Member.class
@Entity
public class Member {

    @Id
    private long id;
    private String name;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • Code.enum
public enum Code {
    LAZY
}

0개의 댓글