반응형
구조 패턴 - 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");
}
}
반응형
'cs > java-spring-boot' 카테고리의 다른 글
[Zero-base] 11-10. 템플릿 메서드(Template Method) (0) | 2022.03.15 |
---|---|
[Zero-base] 11-9. 스트러티지(Strategy) (0) | 2022.03.15 |
[Zero-base] 11-7. 데코레이터(Decorator) (0) | 2022.03.15 |
[Zero-base] 11-6. 파사드(Facade) (0) | 2022.03.15 |
[Zero-base] 11-5. 어댑터(Adaptor) (0) | 2022.03.15 |