먹고 사는 이야기/프로그래밍
[toby의스프링] 3장 - 템플릿
Kunner
2011. 9. 23. 23:58
이번 장에서는 템플릿과 콜백의 개념, 그리고 이것들을 적용해야 할 상황과 이를 구현하는 방식에 대해 설명한다.
템플릿과 콜백은 객체지향 설계의 핵심 원칙인 개방폐쇄원칙과 깊은 관계가 있다.
개방폐쇄원칙
개발된 코드 중 어떤 부분은 변경을 통해 그 기능이 다양해지고 확장하려는 성질이 있고, 어떤 부분은 고정되어 있고 변하지 않으려는 성질이 있을 때 변화의 특성이 다른 부분을 구분해주고, 각각 다른 목적과 다른 이유에 의해 다른 시점에 독립적으로 변경될 수 있는 효율적인 구조를 만들어 주는 원칙을 말한다. (본문 211p)
개발된 코드 중 어떤 부분은 변경을 통해 그 기능이 다양해지고 확장하려는 성질이 있고, 어떤 부분은 고정되어 있고 변하지 않으려는 성질이 있을 때 변화의 특성이 다른 부분을 구분해주고, 각각 다른 목적과 다른 이유에 의해 다른 시점에 독립적으로 변경될 수 있는 효율적인 구조를 만들어 주는 원칙을 말한다. (본문 211p)
한마디로 말해서, 반복적으로 재사용 되는 코드를 별도로 묶어서 언제든 재활용할 수 있도록 만들어야 한다는 것이다.
사실 이게 객체지향의 핵심인데, 그 중 템플릿/콜백은 메소드나 클래스와는 달리 특정 코드의 일부분만 재사용한다. (엄밀히 말하면 '메소드나 클래스와는 달리'라는 표현 역시 잘못된 것이다.)
책에서는 자바의 동작 원리에 따라 템플릿/콜백의 구현에 대한 자세한 이야기가 나오지만, 이미 현업에서 대부분 체득하여 사용되는 개념이므로 대체로 한번 쭉 훑어 보면서 이해하고 넘어 갈 성질의 것이라 본다.
이번 장의 대부분이 위와 같은 내용에 대한 것이므로 별도로 축약하기는 어렵다. 따라서 맨 마지막 부분의 정리 내용을 한번 적어 내려가면서 마무리 하고자 한다. 앞으로 학습을 진행하면서 이와 같이 정리 부분만 복기하고 넘어가는 장이 종종 나올지도 모르겠다.
정리
- JDBC와 같은 예외가 발생할 가능성이 있으며 공유 리소스의 반환이 필요한 코드는 반드시 try/catch/finally 블록으로 관리해야 한다.
- 일정한 작업흐름이 반복되면서 그 중 일부 기능만 바뀌는 코드가 존재한다면 전략 패턴을 적용한다. 바뀌지 않는 부분은 컨텍스트로, 바뀌는 부분은 전략으로 만들고 인터페이스를 통해 유연하게 전략을 변경할 수 있도록 구성한다.
- 같은 애플리케이션 안에서 여러가지 종류의 전략을 다이내믹하게 구성하고 사용해야 한다면 컨텍스트를 이용하는 클라이언트 메소드에서 직접 전략을 정의하고 제공하게 만든다.
- 클라이언트 메소드 안에 익명 내부 클래스를 사용하여 전략 오브젝트를 구현하면 코드도 간결해지고 메소드의 정보를 직접 사용할 수 있어서 편리하다.
- 컨텍스트가 하나 이상의 클라이언트 오브젝트에서 사용된다면 클래스를 분리해서 공유하도록 만든다.
- 컨텍스트는 별도의 빈으로 등록해서 DI 받거나 클라이언트 클래스에서 직접 생성해서 사용한다. 클래스 내부에서 컨텍스트를 사용할 때 컨텍스트가 의존하는 외부의 오브젝트가 있다면 코드를 이용해서 직접 DI 해 줄 수 있다.
- 단일 전략 메소드를 갖는 전략 패턴이면서 익명 내부 클래스를 사용해서 매번 전략을 새로 만들어 사용하고, 컨텍스트 호출과 동시에 전략 DI를 수행하는 방식을 템플릿/콜백 패턴이라고 한다.
- 콜백의 코드에도 일정한 패턴이 반복된다면 콜백을 템플릿에 넣고 재활용하는 것이 편리하다.
- 템플릿과 콜백의 타입이 다양하게 바뀔 수 있다면 제네릭스를 이용한다.
- 스프링은 JDBC 코드 작성을 위해 JdbcTemplate 을 기반으로 하는 다양한 템플릿과 콜백을 제공한다.
- 템플릿은 한번에 하나 이상의 콜백을 사용할 수도 있고, 하나의 콜백을 여러 번 호출할 수도 있다.
- 템플릿/콜백을 설계할 때는 템플릿과 콜백 사이에 주고 받는 정보에 관심을 둬야 한다.
또한 이번 장에서 새로 언급된 내용 중 다음과 같은 개념이 있다.
제네릭스 타입 파라미터
제네릭스 타입 파라미터는 처음 인수를 선언할 때 이게 String 인지, Integer 인지 구분하지 않고 실제 사용할 때 정의할 수 있도록 하는 파라미터이다.
VB에서 사용하던 개념을 차용한 게 아닐까 싶다. 같은 기능을 수행하지만 인수나 반환값이 달라서 몇개씩 만들었던 메소드들을 하나로 합칠 수 있을 것이다.
제네릭스 타입 파라미터는 처음 인수를 선언할 때 이게 String 인지, Integer 인지 구분하지 않고 실제 사용할 때 정의할 수 있도록 하는 파라미터이다.
VB에서 사용하던 개념을 차용한 게 아닐까 싶다. 같은 기능을 수행하지만 인수나 반환값이 달라서 몇개씩 만들었던 메소드들을 하나로 합칠 수 있을 것이다.
JdbcTemplate
Spring에서 제공하는 JDBC의 표준 API(에 가까운) 템플릿이다.
jdbcTemplate.update(SQL_Statement) : 단순 구문 실행
jdbcTemplate.queryForInt(SQL_Statement) : Integer 반환. count(), sum()...
jdbcTemplate.queryForObject(SQL_Statement) : 1개 행의 RecordSet 반환
jdbcTemplate.query(SQL_Statement) : 다수 행의 RecordSet 반환
Spring에서 제공하는 JDBC의 표준 API(에 가까운) 템플릿이다.
jdbcTemplate.update(SQL_Statement) : 단순 구문 실행
jdbcTemplate.queryForInt(SQL_Statement) : Integer 반환. count(), sum()...
jdbcTemplate.queryForObject(SQL_Statement) : 1개 행의 RecordSet 반환
jdbcTemplate.query(SQL_Statement) : 다수 행의 RecordSet 반환
굳이 책에서의 설명이 없더라도, 코드 개발 시 중복 코드의 제거를 통한 코드 재사용은 매우 중요한 개념이다.
이때 제네릭스 타입 파라미터는 매우 유용한 수단이 될 것이다.
JdbcTemplate은 대표적인 템플릿/콜백 적용의 예가 될 것인데, 사실 현업에서는 거의 사용되지 않는다. Spring에서 이에 대한 확장 API로 SimpleJdbcTemplate를 사용하기 때문이다.