Template Callback Pattern in Spring
템플릿 콜백 패턴은 전략을 익명 내부 클래스로 구현한 전략패턴이다.
템플릿 콜백 패턴은 전략 패턴의 변형으로, 스프링 3대 프로그래밍 모델 중 하나인 DI에서 사용하는 특별한 형태의 전략 패턴이다.
템플릿 콜백 패턴과 전략 패턴은 전략을 익명 내부 클래스를 사용하는 점이 다르다.
결합도가 조금 증가하지만, 전략마다 팩토리 객체를 일일이 만들 필요가 없다. 유연하게 내부 구현체만 바꿔주면 로직 가능하다. 외부에서 어떤 전략을 사용하는지 감추고, 중요한 부분에만 집중할 수 있습니다.
스프링은 Template Callback Pattern
을 DI에 적극 활용하고 있기 때문에, 스프링을 제대로 이해하고 활용하려면, 전략 패턴과 템플릿 콜백 패턴을 잘 알고 있어야한다.
대표적인 예시로는 JdbcTemplate, RestTemplate, TransactionTemplate, RedisTemplate 등이 있다는데..
대체 스프링에서 어떻게 쓰이고 있다는 건지 너무나도 궁금해져서 몇 가지 라이브러리를 직접 뜯어보았다. 스프링에 적용된 탬플릿 콜백 패턴을 코드와 함께 살펴보겠다!
설명에 앞서, 책에서 사용하는 용어인 컨텍스트와 전략은 Template Callback Pattern에서 각각 템플릿으로 만든 콜백에 대응한다! 그리고, 꼭 익명 내부 클래스로 구현할 필요는 없다! 이것 때문에 여기 저기 물어보고 다녔다 ㅡ.ㅡ
1. JdbcTemplate
스프링에서 Template Callback Pattern를 통해 구현된 API에서,
"전략"은 "템플릿을 이용해 만든 콜백 인터페이스의 구현체"로 나타난다. 그래서 "템플릿 콜백" 패턴이다.
예시로 JdbcTemplate에서 제일 그럴싸 해보이는 StatementCallback 인터페이스를 살펴 보았다. sql state를 처리하기 위해 있는 인터페이스이다.
@FunctionalInterface
public interface StatementCallback<T> {
@Nullable
T doInStatement(Statement stmt) throws SQLException, DataAccessException;
}
해당 인터페이스 객체를 입력으로 받는 메서드를 찾아 보았다.
execute 메서드는 StatementCallback의 구현체를 입력으로 받는다. execute 메서드가 바로 컨텍스트에 해당한다.
그럼 이 excute 메서드에 어떻게 구현체가 들어오는지 찾기 위해, execute를 호출하는 함수들을 찾아 보았다.
query 함수는 내부적으로 StatementCallback 인터페이스를 구현한 local inner class QueryStatementCallback을 정의하고, return에서 QueryStatementCallback의 구현체를 넣어서 execute를 호출한다. 그러면 query가 일종의 클라이언트에 해당한다.
2. RedisTemplate
전략으로 쓰이는 콜백 메서드 하나를 잡았다.
public interface RedisCallback<T> {
@Nullable
T doInRedis(RedisConnection connection) throws DataAccessException;
}
이를 입력으로 받는 컨텍스트 - excute 메서드 발견
그리고 excute를 호출하는 클라이언트 입니다.
추가
'🌱 Java & Spring 🌱' 카테고리의 다른 글
자바의 Type에 대해 (0) | 2023.06.15 |
---|---|
Lambda & Stream의 도입 배경과 원리, 최적화 전략! 알고 쓰자!!! (4) | 2023.06.02 |
바이트 코드를 JVM에 싸서 드셔보세요 (0) | 2023.05.24 |
Bucket4J 사용하는 법 자세히 알랴드림 (0) | 2023.03.20 |
[Error] Java 실행 명령어와 cannot find symbol 에러 (0) | 2022.06.27 |