dev.Log
템플릿 콜백 패턴 본문
다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 콜백이라 한다.
"콜백 정의"
프로그래밍에서 콜백 또는 콜애프터 함수는 다른 코드의 인수로서 넘겨주는 실행가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다.
"자바언어에서 콜백"
1. 자바 언어에서 실행가능한 코드를 인수로 넘기려면 객체가 필요하다. 자바8부터는 람다를 사용할 수 있다.
2. 자바 8이전에는 보통하나의 메소드를 가진 인터페이스를 구현하고, 주로 익명 내부 클래스를 사용했다.
3. 최근에는 주로 람다를 사용한다.
"템플릿 콜백 패턴"
스프링에서는 콜백함수를 인자로 넘겨주는 방식을 템플릿 콜백 패턴이라고 부르는데, GOF패턴은 아니고 스프링 내부에서 이런 방식을 자주 사용하기 때문에 스프링 안에서만 이렇게 부른다. 전략 패턴에서 템플릿과 콜백부분이 강조된 패턴이라고 생각하면 된다.
스프링에서는 'JdbcTemplate', 'RestTemplate', 'TransactionTemplate', 'RedisTemplate' 처럼 다양한 템플릿 콜백 패턴이 사용된다. 스프링에서 이름에 'XxxTemplate'가 있다면 템플릿 콜백 패턴으로 만들어져 있다 생각하면 된다.
public interface Callback {
void call();
}
@Slf4j
public class TimeLogTemplate {
public void execute(Callback callback) {
long startTime = System.currentTimseMillis();
callback.call(); //콜백호출
long endTime = System.currentTImeMillis();
long resultTime = endTime - startTime;
log.info("resultTime={}", resultTime);
}
}
@Test
void callbackV1() {
TimeLogTemplate template = new TimeLogTemplate();
template.execute(new Callback() {
@Override
public void call() {
log.info("비즈니스 로직실행~");
}
});
}
@Test
void callbackV2() {
TimeLogTemplate template = new TimeLogTemplate();
template.execute(() -> log.info("비즈니스 로직1 실행"));
template.execute(() -> log.info("비즈니스 로직2 실행"));
}
별도의 클래스를 만들어서 전달해도 되지만, 콜백을 사용할 경우 익명 내부 클래스나 람다를 사용하는것이 편리하다.
물론 여러곳에서 함께 사용되는 경우 재사용을 위해 콜백을 별도의 클래스로 만들어도 된다.
'BACKEND.* > JAVA' 카테고리의 다른 글
프록시 (0) | 2024.06.13 |
---|---|
Spring 1.X 대 보안취약점과 3.X와 비교 (0) | 2024.05.31 |
전략 패턴 (0) | 2024.05.31 |
템플릿 메서드 패턴 (0) | 2024.05.31 |
동시성제어 - ThreadLocal (0) | 2024.05.29 |
Comments