[TIL]230409 - 템플릿 콜백 패턴(AOP #03)

insightp25·2023년 4월 9일

콜백(callback)

다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 '콜백'이라 한다.

전략 패턴에서의 콜백

  • 지난 포스팅 중 '인수 전달 방식'을 활용한 전략 패턴에서 context에는 변하지 않는 템플릿 역할을 위임하고, 변하는 부분은 인수로 넘어온 strategy의 코드를 실행해 처리하는 방법을 소개하였다.
    • 전략 패턴의 인수 전달 방법에서 콜백은 strategy(알고리즘)이다.
    • 클라이언트는 직접 strategy를 실행하지 않고 context 실행 함수를 실행할 때 넘겨주며, context 뒤에서 strategy가 실행된다.

Java 언어에서의 콜백

  • Java 언어는 실행 가능한 코드를 인수로 넘기려면 객체가 필요하다. Java 8부터는 람다를 사용할 수 있게 되었다.
    • Java 8 이전에는 익명 내부 클래스를 사용하였고, 이후에는 주로 람다를 사용한다.

프로그래밍에서의 콜백

  • 일반적으로 프로그래밍에서 콜백 또는 콜애프터 함수(call-after function)는 인수로 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 즉시 실행할 수도, 나중에 실행할 수도 있다.

템플릿 콜백 패턴

스프링과 템플릿 콜백 패턴

  • 스프링에서는 '인수 전달 방식'의 전략 패턴을 템플릿 콜백 패턴이라고 칭한다.
    • 템플릿 콜백 패턴은 GoF 패턴은 아니다. 스프링에서 이런 방식이 자주 사용되기 때문에 스프링 안에서만 따로 이렇게 불린다.
    • 전략 패턴에서 '템플릿'과 '콜백' 부분이 강조된 패턴이라 이해하면 된다.
  • 스프링에서 흔히 JdbcTemplate, RestTemplate, TransactionTemplate, RedisTemplateXxxTemplate의 이름을 자주 보게 되는데, 이들 모두 템플릿 콜백 패턴으로 구현돼있다고 생각하면 된다.

구현 방법

  • strategy 전달 시 별도의 클래스를 만들어 전달해도 되지만, 콜백 사용의 경우 익명 내부 클래스나 람다를 사용하는 것이 편리하다.

한계

  • 템플릿 메서드 패턴, 전략 패턴, 템플릿 콜백 패턴 모두 변하는 코드와 변하지 않는 코드를 분리하기 위한 시도들이었다.

  • 하지만 이 패턴들은 아무리 최적화를 해도 결국 context를 호출하는 클라이언트 원본 코드에서

    • context 의존성 주입 코드, context 실행 코드 등

    코드를 모두 수정해야 한다는 점은 마찬가지다.

    • 특정 패턴을 사용하는 클래스가 100개일 시, 템플릿에 변화가 생기면 코드를 100번 다 수정해야 한다.
  • 원본 코드를 손대지 않기 위해선 '프록시'의 개념을 알아야 한다.



reference

profile
backend, data-streaming, AI

0개의 댓글