# [Spring] ๋””์ž์ธ ํŒจํ„ด - Template Method ํŒจํ„ด
Study Repository

[Spring] ๋””์ž์ธ ํŒจํ„ด - Template Method ํŒจํ„ด

by rlaehddnd0422

๋กœ๊ทธ ์ถ”์ ๊ธฐ์— ThreadLocal์„ ๋„์ž…ํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ธฐ๋Š” ๋ถˆํŽธํ•จ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ๋กœ๊ทธ ์ถ”์ ๊ธฐ์— ์—ฌ๋Ÿฌ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ์ ์šฉ์‹œ์ผœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์ธ ๋กœ๊ทธ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•ด๋ด…์‹œ๋‹ค.

 

"ํ•ต์‹ฌ ๊ธฐ๋Šฅ"

  • ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ณ ์œ ์˜ ๊ธฐ๋Šฅ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค๋ฉด OrderService์˜ orderItem()์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ ์ฃผ๋ฌธ ๋กœ์ง์ž…๋‹ˆ๋‹ค.
  • OrderService์˜ orderItem()์˜ ์ฃผ๋ฌธ ๋กœ์ง : orderRepository์˜ save()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฃผ๋ฌธ์„ ์ €์žฅ

"๋ถ€๊ฐ€ ๊ธฐ๋Šฅ"

  • ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๋ณด์กฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ๊ธฐ๋Šฅ
  • ์˜ˆ๋ฅผ ๋“ค๋ฉด OrderService์˜ orderItem()์˜ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์€ ๋กœ๊ทธ ์ถ”์  ๋กœ์ง, ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋Šฅ

 

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ๊ณผ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ์— ๋’ค์„ž์—ฌ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์ข‹์€ ์ฝ”๋“œ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ์ง์ด ๋‹จ์ˆœํ•ด์„œ ์ด์ •๋„์ง€ ๋กœ์ง์ด ๊ฝค๋‚˜ ๋ณต์žกํ•ด์งˆ ๊ฒฝ์šฐ ํ•ต์‹ฌ๊ธฐ๋Šฅ์ด ์–ด๋–ค ์ฝ”๋“œ์ด๊ณ  ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ์–ด๋–ค ์ฝ”๋“œ์ธ์ง€ ๊ฐ€๋…ํ•˜๊ธฐ ๊ต‰์žฅํžˆ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ํ•œ ๊ตฐ๋ฐ์— ๋ชจ์•„์„œ ์ž‘์„ฑํ•˜๊ธฐ ๋ณด๋‹ค, ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์„ค๊ณ„๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public void orderItem(TraceId traceId, String itemId) {
	// ๋ถ€๊ฐ€๊ธฐ๋Šฅ
    TraceStatus status = trace.begin("OrderService.orderItem()");

    try {  
        orderRepository.save(itemId); // ํ•ต์‹ฌ ๊ธฐ๋Šฅ 
        trace.end(status); // ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ 
    } catch (Exception e) {
        trace.exception(status, e); // ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ
        throw e;
    }
}

 

์ด์ œ 1) ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ณ , 2) ์˜ˆ์ œ ์ฝ”๋“œ๋กœ ์ ์šฉํ•ด๋ณธ ํ›„, 3) ๊ธฐ์กด ๋กœ๊ทธ ์ถ”์ ๊ธฐ์— ์ ์šฉ์‹œ์ผœ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด(Template Method Pattern)

์ •์˜ : ์–ด๋–ค ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ผ๋ถ€๋ถ„(๋ถ€๊ฐ€ ๊ธฐ๋Šฅ)์„ ์„œ๋ธŒ ํด๋ž˜์Šค๋กœ ์บก์Šํ™”ํ•ด์„œ ์ „์ฒด ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌ์กฐ๋Š” ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉด์„œ ํŠน์ • ๋‹จ๊ณ„์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‚ด์—ญ(ํ•ต์‹ฌ ๊ธฐ๋Šฅ)์„ ๋ฐ”๊พธ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

  • ๋‹ค์‹œ ๋งํ•ด ์ „์ฒด์ ์œผ๋กœ ๊ตฌ์กฐ๋Š” ๋™์ผํ•˜๋˜, ๋ถ€๋ถ„์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฉ”์†Œ๋“œ์˜ ์ฝ”๋“œ ์ค‘๋ณต์„ ์ตœ์†Œํ™”ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  • ์•ž์„œ ๊ฐœ๋ฐœํ•œ ๋กœ๊ทธ ์ถ”์ ๊ธฐ๋กœ ๋Œ€์ž… ํ•ด๋ณด๋ฉด Controller๊ณ„์ธต, Service ๊ณ„์ธต, Repository ๊ณ„์ธต์—์„œ ๋กœ๊ทธ ์ถ”์ ๊ธฐ๋ฅผ ์ ์šฉ์‹œํ‚ด์œผ๋กœ์จ ๋ชจ๋“  ๊ณ„์ธต์— ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ค‘๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„๋“ค์„ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ž‘์„ฑํ•ด์„œ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ๋“ค์„ ์ถ”์ƒ ํด๋ž˜์Šค์—๋Š” ๊ตฌํ˜„ํ•˜๊ณ , ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋“ค์€ ์ถ”์ƒ ํด๋ž˜์Šค์— ์„ ์–ธ๋งŒ ํ•ด๋†“์€ ํ›„, ์ด ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์•„ ๊ฐ ๊ณ„์ธต์— ์ ์šฉํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด : ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ณจ๊ฒฉ์ธ ํ…œํ”Œ๋ฆฟ์„ ์ •์˜ํ•œ ํ›„,
์ผ๋ถ€ ๋ณ€๊ฒฝ๋˜๋Š” ๋กœ์ง์€ ์ž์‹ ํด๋ž˜์Šค์— ์ •์˜ํ•˜๋Š” ๊ฒƒ.

 

์„ค๋ช…์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฝ”๋“œ๋กœ ๋ณด๋ฉด ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ ์ฝ”๋“œ๋กœ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด ์˜ˆ์‹œ ์ฝ”๋“œ

@Slf4j
public abstract class AbstractTemplate {

    public void execute() {
        long startTime = System.currentTimeMillis();
        // ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์‹คํ–‰
        call();
        // ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ข…๋ฃŒ
        long endTime = System.currentTimeMillis();
        log.info("result Time = {}", endTime - startTime);
    }

    protected abstract void call();
}
  • ์ด ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ๋Š” ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์€ ์ฝ”๋“œ ์‹คํ–‰ ์‹œ๊ฐ„ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค.
  • execute() ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๋ฉด ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ call()๋กœ ํ˜ธ์ถœํ•˜๊ณ , ๋‚˜๋จธ์ง€ ๊ณตํ†ต ๋ถ€๊ฐ€๊ธฐ๋Šฅ์€ ์ง์ ‘ ๊ตฌํ˜„์„ ํ•ด๋†“์Œ์œผ๋กœ์จ ์„ ์–ธํ•˜์—ฌ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ ํ…œํ”Œ๋ฆฟ์„ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„

@Slf4j
public class SubClassLogic1 extends AbstractTemplate {
    @Override
    protected void call() {
        log.info("๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง1 ์‹คํ–‰");
    }
}
  • ์ค‘๋ณต ์ฝ”๋“œ์ธ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ์ฝ”๋“œ๋Š” ์ง์ ‘ ์„ ์–ธํ•˜๊ณ , ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๊ฐ๊ฐ์˜ ๋ฉ”์†Œ๋“œ์˜ ๊ณ ์œ  ๊ธฐ๋Šฅ์€ ํ…œํ”Œ๋ฆฟ์„ ์ƒ์†๋ฐ›์•„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์—ฌ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์˜ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์˜€๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

/**
 * ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด ์ ์šฉ
 */
@Test
public void templateMethodV1() throws Exception {
    AbstractTemplate template1 = new SubClassLogic1();
    template1.execute();
}
  • + ๋ฒˆ์™ธ) ์ƒ์†๊ด€๊ณ„์ธ ๋‘ ํด๋ž˜์Šค๊ฐ€ ์žˆ์„๋•Œ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—, ์„ ์–ธ๋ถ€์—๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์ž‘์„ฑํ•˜์ž.
    • ๋‹คํ˜•์„ฑ์„ ์ ์šฉํ•˜์—ฌ ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๋ฉฐ, ๋™์  ๋ฐ”์ธ๋”ฉ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด.

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

Tip : ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ณผ๋„ํ•œ ํด๋ž˜์Šค ์ƒ์„ฑ ๋ณด์™„
@Slf4j
public class SubClassLogic1 extends AbstractTemplate {
    @Override
    protected void call() {
        log.info("๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง1 ์‹คํ–‰");
    }
}โ€‹โ€‹

@Slf4j
public class SubClassLogic2 extends AbstractTemplate {
    @Override
    protected void call() {
        log.info("๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง2 ์‹คํ–‰");
    }
}โ€‹

 

์œ„์™€ ๊ฐ™์ด ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•  ๋•Œ๋งˆ๋‹ค ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค, ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ์ผํšŒ์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ์—๋Š” ๋‹น์—ฐํ•œ ์–˜๊ธฐ์ง€๋งŒ, ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์ด๋ฏ€๋กœ AbstractTemplate template1 = new AbstractTemplate() ์™€ ๊ฐ™์ด ํ˜•์„ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.

์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์ ์šฉ

@Test
public void templateMethodV2() throws Exception {
    AbstractTemplate template1 = new AbstractTemplate() {
        @Override
        protected void call() {
            log.info("๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง1 ์‹คํ–‰");
        }
    };

    template1.execute();

    AbstractTemplate template2 = new AbstractTemplate() {
        @Override
        protected void call() {
            log.info("๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง2 ์‹คํ–‰");
        }
    };

    template2.execute();
}

๋กœ๊ทธ ์ถ”์ ๊ธฐ์— ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ์ ์šฉ

์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ์ด ์˜ค๋Š”๋ฐ์š”. ๋งˆ์ง€๋ง‰์œผ๋กœ ์•ž์„œ ๊ฐœ๋ฐœํ•œ ๋กœ๊ทธ ์ถ”์ ๊ธฐ์— ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ์ ์šฉ์‹œ์ผœ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

@Slf4j
@RequiredArgsConstructor
public abstract class AbstractTemplate<T> {
    private final LogTrace trace;

    public T execute(String msg) {
        TraceStatus status = null;
        try {
            status = trace.begin(msg);
            // ๋กœ์ง ํ˜ธ์ถœ
            T result = call();
            trace.end(status);

            return result;
        } catch (Exception e) {
            trace.exception(status, e);
            throw e;
        }
    }

    protected abstract T call();
}
  • ๊ณ„์ธต ๋งˆ๋‹ค ๋กœ์ง์— ๋”ฐ๋ผ ๋ฆฌํ„ด ํƒ€์ž…์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋„ˆ๋ฆญ์œผ๋กœ ๋ชจ๋“  ํƒ€์ž…์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ์—ด์–ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
    •  protected abstract T call() : Controller์—์„œ๋Š” ํ•ต์‹ฌ๊ธฐ๋Šฅ์˜ ๋ฆฌํ„ดํƒ€์ž…์ด String์ด๊ณ , ๋‚˜๋จธ์ง€ ๊ณ„์ธต์—์„œ๋Š” ํ•ต์‹ฌ๊ธฐ๋Šฅ์˜ ๋ฆฌํ„ดํƒ€์ž…์ด void์ด๋ฏ€๋กœ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ํ˜ธ์ถœ ๋ฉ”์†Œ๋“œ call() ๋˜ํ•œ ๋ฆฌํ„ด ํƒ€์ž…์„ T๋กœ ์—ด์–ด๋‘ 

Controller

@GetMapping("/v4/request")
public String request(@RequestParam String itemId) {

    AbstractTemplate<String> template = new AbstractTemplate<String>(trace) {
        @Override
        protected String call() {
            orderService.orderItem(itemId);
            return "ok";
        };
    };
    return template.execute("OrderController.request()");
}

์ƒ์† ๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • Controller ๊ณ„์ธต์—์„œ๋Š” ๋ฆฌํ„ดํƒ€์ž…์ด String ์ด๋ฏ€๋กœ ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํƒ€์ž…์„ String์œผ๋กœ ์ง€์ •

 

Service

public void orderItem(String itemId) {

    AbstractTemplate<Void> template = new AbstractTemplate<>(trace) {
        @Override
        protected Void call() {
            orderRepository.save(itemId);
            return null;
        }
    };

    template.execute("OrderService.orderItem()");
}
  • Service๊ณ„์ธต์—์„œ์˜ ํ•ต์‹ฌ๋กœ์ง์˜ ๋ฆฌํ„ดํƒ€์ž…์€ void์ด๋ฏ€๋กœ ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํƒ€์ž…์„ Void๋กœ ์ง€์ •

 

Repository

public void save(String itemId) {

    AbstractTemplate<Void> template = new AbstractTemplate<Void>(trace) {
        @Override
        protected Void call() {
            if (itemId.equals("ex")) {
                throw new IllegalStateException("์˜ˆ์™ธ ๋ฐœ์ƒ");
            }
            sleep(1000);
            return null;
        }
    };
    template.execute("OrderRepository.save()");
}
  • Repository ๊ณ„์ธต ๋˜ํ•œ ๋ฆฌํ„ด ํƒ€์ž…์ด ์—†์œผ๋ฏ€๋กœ ํ…œํ”Œ๋ฆฟ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ํƒ€์ž…์„ Void๋กœ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ์˜ ๋‹จ์  

  • ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ƒ์†์—์„œ ์˜ค๋Š” ๋‹จ์ ๋“ค์ด ๋”ฐ๋ผ์˜ต๋‹ˆ๋‹ค.
    • ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์™€ ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค.
    • ์ด๊ฒƒ์„ ๋Œ๋ ค๋งํ•˜๋ฉด ์ž์‹ ํด๋ž˜์Šค ์ž…์žฅ์—์„œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
      • ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ execute() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€ ? X
    • ์ด๊ฒƒ๋„ ๋”ฐ์ง€๊ณ  ๋ณด๋ฉด ์ข‹์€ ์„ค๊ณ„๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ํŒจํ„ด ์ ์šฉ์„ ์œ„ํ•ด ๋ณ„๋„์˜ ํด๋ž˜์Šค๋‚˜ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„๋„ ๊น”๋”ํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค.
ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด๊ณผ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋ฉด์„œ ์ƒ์†์˜ ๋‹จ์ ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๋””์ž์ธ ํŒจํ„ด์ด ๋ฐ”๋กœ ์ „๋žต ํŒจํ„ด (Strategy Pattern)์ธ๋ฐ, ์ด ๋‹ค์Œ ๊ธ€์—์„œ ์ „๋žต ํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

<์ฐธ๊ณ ์ž๋ฃŒ>

 

[Design Pattern] ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์ด๋ž€ - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ณ ๊ธ‰ํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ์™€ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ๋“ค์„ ๊นŠ์ด์žˆ๊ฒŒ ํ•™์Šตํ•˜๊ณ , ์Šคํ”„๋ง์„ ์ž์‹ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ํ•ต์‹ฌ ๋””์ž์ธ ํŒจํ„ด, ์“ฐ๋ ˆ๋“œ ๋กœ์ปฌ, ์Šคํ”„๋ง AOP์Šคํ”„๋ง์˜ 3๊ฐ€์ง€ ํ•ต์‹ฌ ๊ณ ๊ธ‰ ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ ๐Ÿ“ข ์ˆ˜๊ฐ•

www.inflearn.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ