Study with book/토비의 스프링 3.1

3장. 템플릿2


템플릿이란 바뀌는 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법이다.

3.5 템플릿과 콜백

3.5.1 템플릿/콜백의 동작원리

템플릿/콜백의 특징

 여러 개의 메소드를 가진 일반적인 인터페이스를 사용할 수 있는 전략 패턴의 전략과 달리 템플릿/콜백 패턴의 콜백은 보통 단일 메소드 인터페이스를 사용한다. 템플릿의 작업 흐름 중 특정 기능을 위해 한 번 호출되는 경우가 일반적이기 때문이다. 콜백 일반적으로 하나의 메소드를 가진 인터페이스를 구현한 익명 내부 클래스로 만들어진다고 보면 된다.

 

템플릿/콜백의 작업 흐름

1) 클라이언트의 역할은 템플릿 안에서 실행될 로직을 담은 콜백 오브젝트를 만들고, 콜백이 참조할 정보를 제공하는 것이다. 

2) 템플릿은 정해진 작업 흐름을 따라 작업을 진행하다가 내부에서 생성한 참조정보를 가지고 콜백 오브젝트의 메소드를 호출한다. 콜백은 클라이언트 메소드에 있는 정보와 템플릿이 제공한 참조정보를 이용해서 작업을 수행하고 그 결과를 다시 템플릿에 돌려준다.

3) 템플릿은 콜백이 돌려준 정보를 사용해서 작업을 마저 수행한다.

 

일반적인 DI라면 템플릿에 인스턴스 변수를 만들어두고 사용할 의존 오브젝트를 수장자 메소드로 받아서 사용할 것이다. 반면에 템플릿 콜백 방식에서는 매번 메소드 단위로 사용할 오브젝트를 새롭게 전달받는다는 것이 특징이다. 콜백 오브젝트가 내부 클래스로서 자신을 생성한 클라이언트 메소드 내의 정보를 직접 참조한다는 것도 템플릿/콜백의 고유한 특징이다. 템플릿/콜백 방식은 전략 패턴과 DI의 장점을 익명 내부 클래스 사용 전략과 결합한 독특한 방식이다. 

 

3.5.2 편리한 콜백의 재활용

실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/3.5.2

변하는 것과 변하지 않는 것을 분리하고 변하지 않는 건 유연하게 재활용할 수 있게 만든다는 간단한 원리를 계속 적용했을 때 이렇게 단순하면서도 안전하게 작성 가능한 JDBC 활용 코드가 완성된다.

 

콜백과 템플릿의 결합

일반적으로 성격이 다른 코드들은 가능한 한 분리하는 편이 낫지만, 이 경우는 반대로 하나의 목적을 위해서 서로 긴밀하게 연관되어 동작하는 응집력이 강한 코드들이기 때문에 한 군데 모여 있는 게 유리하다. 구체적인 구현과 내부의 전략패턴, 코드에 의한 DI, 익명 내부 클래스 등의 기술은 최대한 감춰두고, 외부에서 꼭 필요한 기능을 제공하는 단순한 메소드만 노출해주는 것이다.

 

3.5.3 템플릿/콜백의 응용

실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/3.5.3-1

고정된 작업 흐름을 갖고 있으면서 여기저기서 자주 반복되는 코드가 있다면, 중복되는 코드를 분리할 방법을 생각해보는 습관을 기르자. 중복된 코드는 먼저 메소드로 분리하는 간단한 시도를 한다. 그 중 일부 작업이 필요에 따라 바꾸어 사용해야 한다면 인터페이스를 사이에 두고 분리해서 전략 패턴을 적용하고 DI로 의존관계를 관리하도로 만든다. 그런데 바뀌는 부분이 한 애플리케이션 안에서 동시에 여러 종류가 만들어질 수 있다면 이번에 템플릿/콜백 패턴을 적용하는 것을 고려해볼 수 있다. 가장 전형적인 템플릿/콜백 패턴 후보는 try/catch/finally 블록을 사용하는 코드다. 

 

중복의 제거와 템플릿/콜백 설계

실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/3.5.3-2

템플릿/콜백을 적용할 때는 템플릿과 콜백의 경계를 정하고 템플릿이 콜백에게, 콜백이 템플릿이게 각각 전달하는 내용이 무엇인지 파악하는 게 가장 중요하다.

 

템플릿/콜백의 재설계

실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/3.5.3-3

 

제네릭스를 이용한 콜백 인터페이스

실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/3.5.3-4

 

3.6 스프링의 JdbcTemplate

3.6.1 update()

실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/3.6.1

 

3.6.2 queryForInt()

실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/3.6.2

 

3.6.3 queryForObject()

실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/3.6.3

 

3.6.4 query()

실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/3.6.4

 

3.6.5 재사용 가능한 콜백의 분리

실습 코드 링크 : https://github.com/vvshinevv/toby-spring/tree/feature/3.6.5


[참고자료]

토비 스프링 vol.1 - 이일민

'Study with book > 토비의 스프링 3.1' 카테고리의 다른 글

5장. 서비스 추상화  (0) 2020.04.05
4장. 예외  (0) 2020.03.29
3장. 템플릿1  (0) 2020.03.22
2장. 테스트  (0) 2020.03.15
1장. 오브젝트 의존관계2  (0) 2020.03.15