본 게시물은 스스로의 공부를 위한 글입니다.
잘못된 내용이 있으면 댓글로 알려주세요!
context
에, 변하는 부분은 Strategy
라는 인터페이스로 선언하여 구현체를 생성하여 문제를 해결한다.🎈 템플릿 메소드 패턴과 유사한 느낌이 든다.
Strategy
가 변하지 않는 이상, 구현체들을 변경할 필요가 없다.public interface Strategy {
void call();
}
@Slf4j
public class StrategyLogic1 implements Strategy{
@Override
public void call() {
log.info("비즈니스 로직1 실행");
}
}
@Slf4j
public class StrategyLogic2 implements Strategy{
@Override
public void call() {
log.info("비즈니스 로직2 실행");
}
}
@Slf4j
public class Context {
private Strategy strategy;
public ContextV1(Strategy strategy) {
this.strategy = strategy;
}
public void execute(){
log.info("템플릿 시작");
//변해야 하는 로직 시작
strategy.call(); //위임
//변해야 하는 로직 끝
log.info("템플릿 종료");
}
}
Strategy
를 필드 주입받은 후, 변해야 하는 로직을 실행해준다.void strategyV1() {
Strategy strategyLogic1 = new StrategyLogic1();
ContextV1 context1 = new ContextV1(strategyLogic1);
context1.execute();
Strategy strategyLogic2 = new StrategyLogic2();
ContextV1 context2 = new ContextV1(strategyLogic2);
context2.execute();
}
//출력
템플릿 시작
비즈니스 로직1 실행
템플릿 종료
템플릿 시작
비즈니스 로직2 실행
템플릿 종료
void strategyV2() { //익명 내부 클래스 이용 + 인라인화
ContextV1 contextV1 = new ContextV1(new Strategy() {
@Override
public void call() {
log.info("비즈니스 로직1 실행");
}
});
contextV1.execute();
ContextV1 contextV2 = new ContextV1(new Strategy() {
@Override
public void call() {
log.info("비즈니스 로직2 실행");
}
});
contextV2.execute();
}
Strategy
인터페이스에 메소드가 1개만 있어야 사용 가능하다.@Test
void strategyV3() {
ContextV1 context1 = new ContextV1(() -> log.info("비즈니스 로직1 실행"));
context1.execute();
ContextV1 context2 = new ContextV1(() -> log.info("비즈니스 로직2 실행"));
context2.execute();
}
new Context( 구현체! )
형식으로 필드에 주입해서 사용했다.execute( 구현체! )
형식으로 직접 파라미터로 전달해서 사용해보자.이전에 사용한 필드 주입과 다른점
Context
생성 시 선 조립. 이미 조립이 끝났기 때문에 단순히 실행만 하면 된다.context
를 생성해야 한다는 단점.📌 스프링에서는 이렇게 변하는 부분의 코드를 인수로 넘겨주어 사용한 패턴을 템플릿 콜백 패턴이라 한다.
JdbcTemplate
, RestTemplate
, TransactionTemplate
등 XxxTemplate
형식은 템플릿 콜백 패턴으로 만들어져 있다고 생각하면 된다.🎈 context 수정
@Slf4j
public class Context {
public void execute(Strategy strategy){
log.info("템플릿 시작");
//변해야 하는 로직 시작
strategy.call(); //위임
//변해야 하는 로직 끝
log.info("템플릿 종료");
}
}
🎈 사용 시
void strategyV1() {
ContextV2 context = new ContextV2();
context.execute(new StrategyLogic1());
context.execute(new StrategyLogic2());
}
void strategyV2() {
ContextV2 context = new ContextV2();
context.execute(new Strategy() {
@Override
public void call() {
log.info("비즈니스 로직1 실행");
}
});
context.execute(new Strategy() {
@Override
public void call() {
log.info("비즈니스 로직2 실행");
}
});
}
void strategyV3() {
ContextV2 context = new ContextV2();
context.execute(() -> log.info("비즈니스 로직1 실행"));
context.execute(() -> log.info("비즈니스 로직2 실행"));
}
인프런의 '스프링 핵심 원리 고급편(김영한)'을 스스로 정리한 글입니다.
자세한 내용은 해당 강의를 참고해주세요.