토비의 스프링 3.1 정독기 - 템플릿

문지은·2021년 9월 13일
0

토비의 스프링

목록 보기
3/6

템플릿과 콜백

예를 들어서 한 코드가 있다. 그 코드는 A - B - C 이런 형태를 가지고 있다. 그런데 우리는 새로운 코드를 가지고 싶어졌다. 그 코드의 형태는 A - D - C 의 형태이다. 앞선 코드와 가운데 부분만 다른 형태다. 이것 때문에 함수 하나를 통째로 새로 작성하는 것도 재사용과 분리의 측면에서 비효율적인 것 같다. 이럴 땐 어떻게 해야 할까?

제일 효과적인 방법은 가운데 부분을 인터페이스로 선언하고 해당 인터페이스를 상속받은 B, C를 각각 만드는 것이다. 그리고 상황에 따라서 B 혹은 C를 선택해서 동작한다면 좋겠다.

이렇게 변하지 않는 부분과 변하는 부분을 나눠서 코딩하는 방식을 템플릿/콜백 패턴이라고 부른다. 그리고 변하지 않는 즉, 전체적인 내용을 담고 있는 부분을 컨텍스트, 변하는 부분을 클라이언트라고 부른다.

컨텍스트는 빈으로 선언해서 DI 를 받아서 적용하기도 한다! 스프링의 특성을 아주 잘 이용하는 부분이라 할 수 있다.👏👏👏

그렇다면 템플릿콜백은 무엇일까??

템플릿은 전략 패턴에서의 컨텍스트를 의미하고 콜백 템플릿에 전달되는 실행될 오브젝트를 말한다. 보통 익명 내부 클래스로 만들어진다. 이렇게 템플릿과 콜백을 사용해서 재사용성을 높일 수 있다.

제네릭스

여기서 템플릿이 콜백에 전달할 내부 정보와 콜백이 템플릿에 반환할 내용이 중요해진다. 왜냐하면 이 정보에 따라서 인터페이스가 결정되기 때문이다. 하지만 콜백 함수에 따라서 주고 받는 정보의 타입이 달라질 수 있다.

이 때 사용하는 것이 제네릭스이다. 제네릭스는 아래 코드 예시를 통해서 후루룩 살펴보고 넘어가자!

// 콜백 메소드의 리턴 타입과 파라미터가 제네릭 타입을 가지는 콜백 인터페이스 선언

public interface LineCallbck<T>
{
	T doSomethingWithLines(String line, T value);
}

// 제네릭 메소드로 만든 템플릿

public <T> T lineReadTemplate(String filepath, LineCallback<T> callback, T initVal)
{
	try
    {
    	T res = initVal;
        callback.doSomethingWithLines(filepath, res);
        .
        .
        .
    }
}

사실 스프링에서는 템플릿/콜백 패턴 관련해서 다양한 라이브러리를 제공해주고 있었다!🙀 지금까지 우리가 그게 템플릿/콜백 패턴인지도 모르고 사용했을 뿐이다. 대표적인 예시를 아래 코드에서 확인해보자.

// 내장 콜백 라이브러리를 사용한 메서드

public void deleteAll()
{
	this.jdbcTemplate.update("delete from users");
}
profile
백엔드 개발자입니다.

0개의 댓글