템플릿 콜백 패턴 끄적여보기
템플릿 콜백 패턴
여러 클래스에서 복잡하지만 일정한 패턴을 갖는 작업 흐름이 존재하고, 일부분만 자주 바꿔서 사용해야할 때 사용하는 패턴입니다.
템플릿
템플릿은 식상하고 뻔한 비유지만 붕어빵 틀이라고 생각하면 됩니다. (= 일정한 패턴을 갖는 작업 흐름)
일정한 패턴을 가진 작업 흐름이 여러 클래스에서 계속 반복되니.. 비슷하지만 역할은 조금씩 다른 클래스를 생성할 때마다 수작업으로 일일이 코드를 치고있을 순 없습니다. 그건 손만 아프고 시간 낭비할 뿐입니다.
public class ListServlet extends HttpServlet {
public static final int PAGE_COUNT_PER_BLOCK = 5;
public static final int ARTICLE_COUNT_PER_PAGE = 5;
private ConnectionMaker connectionMaker;
public ListServlet() {
connectionMaker = new ConnectionMaker();
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
req.setCharacterEncoding("utf-8");
res.setCharacterEncoding("utf-8");
res.setContentType("text/html");
}
//중략
}
서블릿으로 예시를 적어봤습니다. 서블릿에서는 connection 을 일일이 계속 연결해줬어야했습니다. 하지만 공통되는 코드를 따로 빼내서 템플릿 형식으로 사용하기로 결정했습니다.
public class ConnectionMaker {
public static final String DB_ID = "dbid";
public static final String DB_PWD = "dbpassword";
public static final String DB_URL = "dburl";
public Connection getConnecton() throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection(DB_URL, DB_ID, DB_PWD);
}
}
콜백
콜백은 실행되는 것을 목적으로 다른 오브젝트의 메소드에 전달되는 오브젝트를 말합니다. 쉽게 얘기하면 템플릿 안에서 호출되는 것을 목적으로 만들어진 객체입니다.
이제 자세히 알아봅시다.
특징
- 대부분 단일 인터페이스로 사용합니다
특정 기능을 위해 한 번 호출하는 경우가 대부분이기 때문!
- 콜백은 일반적으로 하나의 메소드를 가진 인터페이스를 구현한 익명 내부 클래스로 만든다
하나의 템플릿에서 여러가지 전략을 사용해야할 때 하나 이상의 콜백 객체를 사용할 때가 있기 때문
토비스프링 책 보며 예제 짜보기
public void deleteAll() throws SQLException {
executeSql("delete from users"); //변하는 sql 문장
}
private void excuteSql(final String query) throws SQLException {
this.jdbcContext.workWithStatementStrategy(
new StatementStrategy() { //변하지 않는 콜백 클래스 정의와 오브젝트 생성
public PreparedStatement makePreparedStatement(Connection c) throws SQLException {
return c.prepareStatement(query);
}
}
);
}
public class JdbcContext {
public void excuteSql(final String query) throws SQLException {
this.jdbcContext.workWithStatementStrategy(
new StatementStrategy() {
public PreparedStatement makePreparedStatement(Connection c) throws SQLException {
return c.prepareStatement(query);
}
}
);
}
}