μ»€λ§¨λ“œ νŒ¨ν„΄(command pattern)

2024. 7. 8. 00:51Β·πŸ“‚ programming-language/java

1. μ»€λ§¨λ“œ νŒ¨ν„΄(command pattern)

μ»€λ§¨λ“œ νŒ¨ν„΄μ€ 호좜자(ν΄λΌμ΄μ–ΈνŠΈ λ˜λŠ” 호좜자) 와 μˆ˜μ‹ μž(μž‘μ—… μˆ˜ν–‰ 개체)μ—μ„œ 뢄리(decoupling) ν•˜μ—¬ μœ μ—°μ„±κ³Ό ν™•μž₯성을 μ œκ³΅ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€. 즉, 호좜자의 μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  λ‹€μ–‘ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄ λ‹€μ–‘ν•œ λͺ…령을 생성할 수 μžˆλ‹€. μš”μ²­μ„ μΊ‘μŠν™”ν•΄μ„œ ν•΄λ‹Ή μš”μ²­ μ•ˆμ—μ„œ μˆ˜ν–‰ν•  λ™μž‘μ„ μ„€μ •ν•˜κ³  μˆ˜μ‹ μžλ₯Ό ν˜ΈμΆœν•  λ•Œ ν˜ΈμΆœν•  행동과 ν•„μš”ν•œ νŒŒλΌλ―Έν„°μ— κ΄€ν•œ λͺ¨λ“  정보듀을 μ»€λ§¨λ“œ(command) λΌλŠ” μΈν„°νŽ˜μ΄μŠ€ μ•ˆμœΌλ‘œ μΊ‘μŠν™”ν•˜κΈ° λ•Œλ¬Έμ— κΈ°λŠ₯을 μž¬μ‚¬μš©ν•  수 μžˆλ‹€.

 

 

μ»€λ§¨λ“œ νŒ¨ν„΄μ˜ OCP 을 μ‹€ν˜„ν•  수 μžˆλŠ” μž₯점이 μžˆλ‹€. 호좜자 μͺ½μ˜ μ½”λ“œκ°€ λ³€κ²½λ˜μ§€ μ•ŠμœΌλ©° κΈ°λŠ₯(command) μΊ‘μŠν™” 및 μΆ”κ°€ν•  수 있기 λ•Œλ¬Έμ΄λ‹€. ν•˜μ§€λ§Œ, κΈ°λŠ₯(command) κ°€ μ¦κ°€ν• μˆ˜λ‘ λ³΅μž‘λ„κ°€ 증가할 수 μžˆλŠ” 단점이 μ‘΄μž¬ν•œλ‹€.

 

sample code (좜처 : inflearn - μ½”λ”©μœΌλ‘œ ν•™μŠ΅ν•˜λŠ” GoF의 λ””μžμΈ νŒ¨ν„΄)

public static void main(String[] args) {
    Button button = new Button();
    button.press(new LightOnCommand(new Light()));
    button.undo();
}


public class Button {

    private Stack<Command> commands = new Stack<>();

    public void press(Command command) {
        command.execute();
        commands.push(command);
    }

    public void undo() {
        if (!commands.isEmpty()) {
            Command command = commands.pop();
            command.undo();
        }
    }

}

public class LightOnCommand implements Command {

    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.on();
    }

    @Override
    public void undo() {
        new LightOffCommand(this.light).execute();
    }
}

 

2. μ‚¬μš© μ˜ˆμ‹œ

java μ—μ„œλŠ” ExecutorService interface μ—μ„œ μ»€λ§¨λ“œ νŒ¨ν„΄μœΌλ‘œ κΈ°λ°˜μ„ μ„€κ³„λ˜μ–΄ κ΅¬ν˜„λ˜μ—ˆλ‹€. νŒŒλΌλ―Έν„°λ₯Ό Runnable interface ν•˜μœ„ κ΅¬ν˜„μ²΄λ₯Ό μƒμ„±ν•˜μ—¬ 행동을 μ •μ˜ν•΄ κΈ°λŠ₯을 λ™μž‘ν•œλ‹€.

public static void main(String[] args) {
    Light light = new Light();
    Game game = new Game();
    ExecutorService executorService = Executors.newFixedThreadPool(4);
    executorService.submit(light::on);
    executorService.submit(game::start);
    executorService.submit(game::end);
    executorService.submit(light::off);
    executorService.shutdown();
}

ExecutorService.submit

 

 

Spring μ§„μ˜μ—μ„œ μ»€λ§¨λ“œ νŒ¨ν„΄μ„ 기반으둜 κ΅¬ν˜„λœ μ˜ˆμ‹œλ‘œλŠ” SimpleJdbcInsert, SimpleJdbcCall 이닀. insert 쿼리와 stored procedure λ₯Ό ν˜ΈμΆœν•  λ•Œ ν•„μš”ν•œ λͺ¨λ“  정보λ₯Ό κ°€μ§€κ³  ν•˜λ‚˜μ˜ μ»€λ§¨λ“œ 였브젝트λ₯Ό 톡해 κ΄€λ¦¬ν•˜κ³  둜직이 λ™μž‘ν•˜λŠ” 클래슀λ₯Ό λ³„λ„λ‘œ μ •μ˜ν•΄μ„œ μˆ˜ν–‰ν•˜κ³  μžˆλ‹€.

SimpleJdbcInsert insert = new SimpleJdbcInsert(dataSource)
            .withTableName("command")
            .usingGeneratedKeyColumns("id");

    Map<String, Object> data = new HashMap<>();
    data.put("name", command.getClass().getSimpleName());
    data.put("when", LocalDateTime.now());
    insert.execute(data);

 

 

λ‹€μ΄μ–΄κ·Έλž¨μ„ 확인해보면 μƒμœ„μ— SimpleJdbcInsertOperations interface κ°€ μ‘΄μž¬ν•˜λ©°, excute() λ©”μ„œλ“œμ— κ΄€ν•΄ μ •μ˜λ˜μ–΄ μžˆλ‹€.

SimpleJdbcInsert diaram

 

Reference

  • [geeksforgeeks] command-pattern : https://www.geeksforgeeks.org/command-pattern/?ref=lbp
  • [inflearn] μ½”λ”©μœΌλ‘œ ν•™μŠ΅ν•˜λŠ” GoF의 λ””μžμΈ νŒ¨ν„΄

'πŸ“‚ programming-language > java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

μ–΄λŒ‘ν„° νŒ¨ν„΄(adapter pattern)  (1) 2024.07.09
νΌμ‚¬λ“œ νŒ¨ν„΄(Facade Pattern)  (0) 2024.07.08
μ±…μž„ 연쇄 νŒ¨ν„΄ (chain of responsibility pattern)  (1) 2024.07.05
싱글톀 νŒ¨ν„΄(singleton pattern)  (0) 2024.07.03
μ •λ°€ μ—°μ‚°μ—λŠ” BigDecimal 을 μ‚¬μš©ν•˜μž  (0) 2024.04.24
'πŸ“‚ programming-language/java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • μ–΄λŒ‘ν„° νŒ¨ν„΄(adapter pattern)
  • νΌμ‚¬λ“œ νŒ¨ν„΄(Facade Pattern)
  • μ±…μž„ 연쇄 νŒ¨ν„΄ (chain of responsibility pattern)
  • 싱글톀 νŒ¨ν„΄(singleton pattern)
cooper25
cooper25
  • cooper25
    dev cooper
    cooper25
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (84)
      • πŸ“‚ backend (34)
        • spring (19)
        • architecture (10)
        • test (5)
      • πŸ“‚ computer-science (5)
      • πŸ“‚ programming-language (12)
        • java (12)
      • πŸ“‚ infra (9)
        • mysql (4)
        • redis (2)
        • message-queue (3)
      • πŸ“‚ cloud (2)
        • aws (2)
      • πŸ“‚ frontend (1)
        • react (0)
      • πŸ“‚ education & lecture (16)
        • 인프라 곡방 (11)
        • ν•­ν”Œ λ°±μ—”λ“œ 7κΈ° (5)
      • πŸ“‚ ai (1)
        • claude (1)
      • πŸ“‚ etc (2)
        • 회고 (1)
        • 컨퍼런슀 (1)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    spring
    spring-batch
    mysql
    react
    nGrinder
    JPA
    kafka
    ν•­ν•΄ν”ŒλŸ¬μŠ€
    λ™μ‹œμ„±
    데이터 쀑심 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀계
    AWS
    μŠ€ν”„λ§μΊ ν”„ ν›„κΈ°
    spring AOP
    가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ 섀계
    Redisson
    UUID
    spring camp 2025
    회고
    인프라곡방
    gof
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.6
cooper25
μ»€λ§¨λ“œ νŒ¨ν„΄(command pattern)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”