이전 포스팅에서 알아본 UserDao와 JdbcContext, StatementStrategy의 구조는 템플릿/콜백 패턴과 관련이 있다.
템플릿/콜백 패턴
바뀌지 않는 일정한 패턴을 갖는 작업 흐름 ( = 템플릿) 이 존재하고 그 중 일부분을 변경해야하는 전략 패턴 구조에 익명 내부 클래스 ( =콜백)을 활용한 방식을 의미한다.
두 가지 용어에 대해서 조금 더 알아보자.
- 템플릿 (template) : 어떤 목적을 위해 만들어 둔 고정된 로직(틀)이다. 템플릿 메소드 패턴은 바뀌지 않는 템플릿 메소드를 상위 클래스에 두고, 바뀌는 부분을 서브 클래스의 메소드로 오버라이딩하는 구조를 가지고 있다.
- 콜백 (callback) : 실행되는 것을 목적으로 다른 오브젝트에 전달되는 오브젝트를 의미한다. 메소드가 담긴 파라미터로 전달되며, 특정 로직을 담은 메소드를 실행시키기 위한 오브젝트이므로 Functional Object라고도 한다.
템플릿/콜백 패턴에서 콜백은 단일 메소드 인터페이스를 사용한다. 이 메소드의 특징은 아래와 같다.
- 익명 내부 클래스로 이루어져있다. 이 익명 내부 클래스는 하나의 메소드를 가진 인터페이스를 구현하였다.
- 파라미터가 있다. 이 파라미터는 컨텍스트 정보를 전달받을 때 사용된다. 예를 들어서, JdbcContext 클래스 안에 있는 템플릿 메소드인 workWithStatementStrategy() 메소드에서 생성한 Connection 오브젝트는 콜백 메소드인 makePreparedStatement()의 파라미터로 전달된다.
이 작업 흐름을 아래 JdbcContext에 적용된 흐름에서 살펴보자.
이 쯤에서 클라이언트와 템플릿, 콜백 메소드에 대한 코드를 다시 보고, 템플릿/콜백 패턴의 동작 방식을 개괄적으로 설명하겠다.
클라이언트 (UserDao.add) 과 콜백 (makePreparedStatement)
템플릿 (JdbcContext.workWithStatementStrategy)
- 클라이언트에서 add 함수가 실행되면, 익명 내부 클래스로 정의된 콜백 메소드에 의해 콜백 오브젝트 (StatementStrategy의 구현 오브젝트) 가 생성된다.
- 콜백 오브젝트는 템플릿 메소드에게 전달된다. 즉, workWithStatementStrategy의 파라미터로 콜백 오브젝트가 전달된다.
- Connection 객체가 생성되고, 파라미터로 담아 콜백 메소드가 호출된다.
- 콜백 메소드는 적절한 PreparedStatement를 만들어 템플릿 메서드에게 반환한다.
- 템플릿 메소드는 모든 구문을 실행 후 종료한다. 반환할 작업 결과가 있다면 클라이언트에게 반환한다.
콜백의 재활용, 결합
콜백 메소드가 익명 내부 클래스를 사용하는 것은 가독성이 떨어진다는 단점이 있다. deleteAll() 메소드를 예시로 사용하여, SQL 문장만 파라미터로 받을 수 있도록 메소드를 분리해보자.
UserDao에서 executeSql 메소드를 하나 만들어서 분리하였다. SQL을 담은 쿼리문을 final 로 선언해서, 익명 내부 클래스에서 사용할 수 있도록 하는 것에 유의하자.
이렇게 만든 executeSql 메소드를 다른 DAO가 공유할 수 있도록 JdbcContext 클래스 내부 메소드로 옮겨보자.
그럼 UserDao의 deleteAll()은 이렇게 주입받은 jdbcContext의 내부 메소드를 호출하는 방식으로 고칠 수 있고,
executeSql은 같은 클래스에 존재하는 workWithStatementStrategy를 호출하며 구현할 수 있다.
'DEV book > 토비의 스프링 3.1' 카테고리의 다른 글
[토비의 스프링 3.1] 5장 서비스 추상화 - UserService, TransactionService 추상화 (0) | 2024.01.18 |
---|---|
[토비의 스프링 3.1] 4장 예외 - 예외 처리 전략과 DataAccessException을 사용한 JDBC 한계 극복 (0) | 2024.01.16 |
[토비의 스프링 3.1] 3장 템플릿 (2) - JdbcContext를 UserDao에서 사용하는 두 가지 방법 (0) | 2023.09.24 |
[토비의 스프링 3.1] 3장 템플릿 (1) - 디자인 패턴과 DI를 이용한 DAO 최적화 (0) | 2023.09.23 |
[토비의 스프링 3.1] 2장 테스트 - 단위 테스트와 테스트 코드 개선 (0) | 2023.09.20 |