반응형

구조 패턴 - Proxy

 

해결하려는 문제

 객체에 접근을 제어하고 싶을 때

  • 객체를 실제 사용하기 전까지 초기화를 미루고 싶을 때 (Lazy init)
  • 접근 권한 체크

 

※ Adaptor, Decorator, Proxy 패턴은 코드 베이스 매우 유사함

  • Adaptor : A의 기능을  B로 연결 또는 서로 다른 인터페이스간의 연결고리 생성
  • Decorator : 기능의 추가에 중점
  • Proxy : 접근제어에 중점

 

 

public class Main {

    private QueryExecutor readonlyQueryExecutor;
    
    public Main(QueryExecutor readonlyQueryExecutor) {
        this.readonlyQueryExecutor = readonlyQueryExecutor;
    }
    
    public void query(Stirng sql) {
        readonlyQueryExecutor.execute(sql);
    }

    public static void main(String[] args) {
        QueryExecutor queryExecutor = new QueryExecutorImpl();
        QueryExecutor readonlyQueryExecutor = new ReadonlyQueryExecutor(queryExecutor);
        
        readonlyQueryExecutor.execute("select * from user where id = 1");
        readonlyQueryExecutor.execute("update user set name = 'hello' where id = 1");
        readonlyQueryExecutor.execute("delete from user where id = 2");
    }
    
    @Bean
    public QueryExecutor queryExecutor() {
        return new QueryExecutorImpl();
    }
    
    @Bean
    public ReadonlyQueryExecutor readonlyQueryExecutor(QueryExecutor queryExecutor) {
        return new ReadonlyQueryExecutor(queryExecutor);
    }
}
public interface QueryExecutor {
    void execute(String sql);
}
public class QueryExecutorImpl implements QueryExecutor {
	public QueryExecuteImpl() {
    }
    
    @Override
    public void execute(String sql) {
        System.out.println("sql : " + sql);
    }
}
public class ReadonlyQueryExecutor implements QueryExecutor {
    private final QueryExecutor qureyExecutor;
    
    public ReadonlyQueryExecutor(QueryExecutor qureyExecutor) {
        this.qureyExecutor = qureyExecutor;
    }
    
    @Override
    public void execute(String sql) {
        if (!isSelectQuery(sql))	//Proxy 형태
            System.out.println("읽기 전용이므로 CUD 쿼리는 수행되지 않습니다 : " + sql);
            return;
//          throw new RuntimeException("읽기 전용이므로 CUD 쿼리는 수행되지 않습니다 : " + sql);
        
        qureyExecutor.execute(sql);
    }
    
    private boolean isSelectQuery(String sql) {
        return sql.startWith("select");
    }
}

 

 


반응형

+ Recent posts