본문 바로가기

스프링

[디자인패턴] 템플릿 콜백 패턴

1.     Com.springsource.junit : junit

2.     Commons-logging : Spring-context가 사용

3.     Mysql-connector : Mysql JDBC

4.     Spring-aop : 스프링 기능 자체의 aop

5.     Spring-bean : 스프링 빈을 활용하는 경우 필요. 스프링의 XML 설정파일과 자바 애노테이션을 파싱 하는데 필요한 클래스 포함

6.     Spring-context : 스프링 코어를 확장한 많은 클래스가 들어 있는데 모든 클래스는 EJB, JNDI(Java Naming Directory Interface), JMX용 클래스와 연동하는데 applicationcontext기능을 사용해야 하며 스프링 리모팅 클래스, 동적 스크립팅 언어(제이루비, 그루비등)와 연동하는 클래스, 빈 유효성검증(JSR-303) API, 스케줄링을 하는 클래스도 포함되어 있다.

7.     Spring-core : 모든 스프링 모듈에서 필요한 모듈. 다른 스프링 모듈에서 사용하는 공통 클래스가 포함됨.

8.     Spring-dao : EmpltyResultDataAccessException 등 사용을 위한 jar

9.     Spring-expression : 스프링 표현언어(SpEL) 지원 클래스 포함.

10.   Spring-jdbc : 스프링이 지원하는 jdbc.

11.   Spring-test.jar

-       @RunWith : Junit 프레임워크의 테스트 실행방법을 확장시 사용.

-       SpringJUnit4ClassRunner : 어플리케이션컨텍스트를 만들고 관리하는 확장 클래스

-       @ContextConfiguration(경로) : 자동으로 만들어줄 어플리케이션 컨텍스트 설정파일

간단하게 텍스트파일의 숫자를 읽어 더하는 로직을 짜보자.

스프링에는 수십가지의 템플릿/콜백 패턴이 있다 잘 이해하자.

 

9. BufferedReader : 한줄씩 읽기 편하게 사용

템플릿/콜백 패턴 : 보통 try/catch/finally 블록을 사용하는 코드가 여기저기 반복되는 부분에 사용된다.

* 파일이 정상적으로 닫히지 않고 메소드를 빠져나가는 문제가 발생시 try/catch/finally 블록을 적용해서 어떤 경우에라도 파일이 열렸으면 반드시 닫아주도록 만들어보자.

 

 

파일을 읽거나 처리할 때 파일이 정상적으로 닫히지 않고 메소드를 빠져나가는 문제가 발생한다. 어떤 경우에라도 반드시 닫아주도록 코딩해야함.

 

만들어야 할 기능이 이게 전부라면, 테스트도 만들었고 예외 상황에 대한 처리도 모두 해줬으니 이쯤에서 마무리해도 좋겠지만, 곱셈기능 등 여러가지 처리 기능이 추가될 것이라는 소식이 들어왔다. 템플릿/콜백 패턴을 적용해보자.

템플릿/콜백 패턴 적용시 고려해야할 점.

템플릿과 콜백의 경계 파악

템플릿이 콜백에게 전달하는 내용 파악

콜백이 템플릿에게 전달하는 내용 파악

템플릿 : IO 연결하는 부분과 닫아주는 부분, 값을 클라이언트에게 리턴

*  콜백 : IO를 이용하여 연산한 값을 템플릿에게 리턴

 

 

콜백(변하는 부분(전략:인터페이스)) : 각 라인을 읽어서 알아서 처리한 최종 결과를 템플릿에게 돌려준다(익명내부클래스로 보통 이루어짐).

 

콜백이 돌려준 결과는 최종적으로 클라이언트에게 전달함.

36~53. 템플릿 : BufferedReader를 만들어 넘겨주는 것 외에는 번거로운 작업의 흐름을 진행하고 모든 처리를 마친 후에 다시 클라이언트에게 돌려줌

8, 22. 콜백 : 읽어서 연산처리(안의 익명내부클래스(자바는 메서드를 인자로 넘길 수 없고, 인터페이스를 구현하면 클래스의 개수가 엄청 늘어나므로))

12,13. 사용할 오브젝트와 파일 이름이 공유되므로 @Before로 멤버변수 세팅

l  템플릿/콜백 패턴을 통해 코드가 상당히 깔끔히 정리되었지만, 또 다시 어떤 공통적인 부분이 없는지 관찰해보자.

Calculator 클래스의 콜백(전략) 부분을 살펴보면 위의 노란 부분을 제외하고는 모두 동일한 것을 알 수 있다.

템플릿/콜백 패턴 : 코드의 특성이 바뀌는 경계를 잘 살피고 이것을 인터페이스를 사용해 분리하는것.

 

 

템플릿

14. 파일의 각 라인을 루프를 돌면서 가져오는 것도 템플릿이 담당.

15. 계산하는 부분만 콜백에게 맡긴다.

 

현재 템플릿, 콜백이 만들어내는 결과가 Integer타입으로 거정되어 있다. 만약 결과의 타입을 다양하게 가져가고 싶다면 제네릭스가 필요하다.

만약 sum1234 로 모두 연결해서 하나의 스트링으로 돌려주는 기능이 필요하다면?

*  반복적인 try/catch/finally 문이 반복된다면 템플릿/콜백 패턴이 제격임

 

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

라인별 숫자 더하기

 

타입이 정해져있지 않을 때 사용한다.

3. <T> : 제네릭 타입을 1T로 사용하겠다는 의미