Command 패턴: 동작 캡슐화
실행 취소 및 다시 실행과 매크로 기록을 지원하도록 요청을 Command 객체로 감쌉니다.
Command 패턴: 동작 캡슐화은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Command의 의도
Command는 요청을 객체로 캡슐화하여 서로 다른 요청으로 클라이언트를 매개변수화하고, 큐잉과 로그 기록, 실행 취소 가능한 작업을 지원합니다.
Command 인터페이스
execute() 메서드와 선택적으로 undo() 메서드를 포함하는 인터페이스를 정의합니다. 각 명령 객체는 하나의 동작을 수행하고 되돌리는 방법을 알고 있습니다.
public interface Command {
void execute();
void undo();
}구체적인 Command: TextEditor
각 구체적인 명령은 수신자와 동작 매개변수를 캡슐화합니다. 실행은 동작을 수행하고, 실행 취소는 동작을 되돌립니다.
public class InsertTextCommand implements Command {
private final TextEditor editor;
private final String text;
private final int position;
public InsertTextCommand(TextEditor editor, String text, int pos) {
this.editor = editor; this.text = text; this.position = pos;
}
public void execute() { editor.insert(position, text); }
public void undo() { editor.delete(position, text.length()); }
}호출자: CommandHistory
호출자는 실행된 명령의 기록을 보관합니다. execute()를 호출하고 스택에 추가합니다. 실행 취소를 수행하면 스택에서 꺼낸 뒤 undo()를 호출합니다.
public class CommandHistory {
private final Deque<Command> history = new ArrayDeque<>();
public void execute(Command cmd) {
cmd.execute();
history.push(cmd);
}
public void undo() {
if (!history.isEmpty()) history.pop().undo();
}
}실행 취소 / 다시 실행 스택
다시 실행 스택을 추가하십시오. 실행 취소할 때는 다시 실행 스택에 추가하고, 다시 실행할 때는 다시 실행 스택에서 꺼내 다시 실행합니다.
private final Deque<Command> undoStack = new ArrayDeque<>();
private final Deque<Command> redoStack = new ArrayDeque<>();
public void redo() {
if (!redoStack.isEmpty()) {
Command cmd = redoStack.pop();
cmd.execute();
undoStack.push(cmd);
}
}MacroCommand
매크로 명령은 명령 목록을 포함하고 명령을 순서대로 실행하는 복합 객체입니다. 실행 취소할 때는 역동작을 역순으로 실행합니다.
public class MacroCommand implements Command {
private final List<Command> commands;
public MacroCommand(List<Command> commands) { this.commands = commands; }
public void execute() { commands.forEach(Command::execute); }
public void undo() { for (int i = commands.size()-1; i>=0; i--) commands.get(i).undo(); }
}작업 처리를 위한 명령 큐
명령을 큐에 저장하고 비동기적으로 처리하십시오. 작업자 스레드가 큐에서 명령을 꺼내 실행하므로, 생산자와 실행 스레드가 분리됩니다.
BlockingQueue<Command> queue = new LinkedBlockingQueue<>();
// Producer:
queue.put(new SendEmailCommand(recipient, subject, body));
// Consumer thread:
Command cmd = queue.take();
cmd.execute();실행기를 사용하는 Command
명령을 Runnable 람다로 감싼 뒤 ExecutorService에 제출하십시오. 이때 람다가 명령 객체가 됩니다.
ExecutorService exec = Executors.newFixedThreadPool(4);
exec.submit(() -> sendEmail(recipient, subject));
exec.submit(() -> generateReport(params));감사 로그 기록을 위한 명령
직렬화 가능한 Command 객체는 로그에 저장할 수 있습니다. 복구할 때 객체를 다시 재생하여 최종 상태를 재구성하며, 이것이 이벤트 소싱의 기반이 됩니다.
void execute(Command cmd) {
cmd.execute();
auditLog.append(cmd.toString()); // log every action
history.push(cmd);
}GUI 동작 버튼
GUI 프레임워크에서는 각 버튼이나 메뉴 항목이 Command를 포함합니다. 버튼을 클릭하면 command.execute()가 호출됩니다. 실행 중에 명령을 교체하여 버튼의 동작을 바꿀 수 있습니다.
Button saveBtn = new Button("Save");
saveBtn.setOnAction(() -> new SaveDocumentCommand(doc).execute());Command와 전략
두 패턴 모두 동작을 캡슐화합니다. 전략은 실행 중에 교체할 수 있는 알고리즘을 캡슐화합니다. Command는 매개변수와 수신자를 포함한 완전한 요청을 캡슐화하며, 기록과 큐잉을 지원합니다.
Spring의 Command
Spring 배치의 Tasklet과 Spring 통합의 MessageHandler는 애플리케이션 수준의 명령 패턴입니다. 각 Tasklet은 배치 작업의 한 단계를 캡슐화합니다.
빠른 확인
실행 취소를 지원하기 위해 Command가 execute() 외에 추가하는 메서드는 무엇입니까?
복습
Command는 동작을 객체로 캡슐화합니다. 실행 취소/다시 실행 스택, 작업 큐, 매크로 기록, 감사 로그 기록에 사용하십시오. 명령 기록을 관리하는 호출자와 결합하면 좋습니다.
자주 묻는 질문
“Command 패턴: 동작 캡슐화” 강의는 무료인가요?
네 — “Command 패턴: 동작 캡슐화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Command 패턴: 동작 캡슐화”에서 뭘 배우나요?
실행 취소 및 다시 실행과 매크로 기록을 지원하도록 요청을 Command 객체로 감쌉니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“Command 패턴: 동작 캡슐화” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Observer 패턴: 이벤트 알림
- Strategy 패턴: 교체 가능한 알고리즘
- Command 패턴: 동작 캡슐화
- Template Method: 알고리즘 뼈대 정의