1 minute read

템플릿 콜백 패턴

여러 클래스에서 복잡하지만 일정한 패턴을 갖는 작업 흐름이 존재하고, 일부분만 자주 바꿔서 사용해야할 때 사용하는 패턴입니다.

다운로드

템플릿

템플릿은 식상하고 뻔한 비유지만 붕어빵 틀이라고 생각하면 됩니다. (= 일정한 패턴을 갖는 작업 흐름)

일정한 패턴을 가진 작업 흐름이 여러 클래스에서 계속 반복되니.. 비슷하지만 역할은 조금씩 다른 클래스를 생성할 때마다 수작업으로 일일이 코드를 치고있을 순 없습니다. 그건 손만 아프고 시간 낭비할 뿐입니다.

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);
                    }
            }
        );
    }
}

Categories:

Updated: