단계별 실행 가이드
달빛 약속은 코드 실행 과정을 한 단계씩 추적하고 제어할 수 있는 강력한 단계별 실행(Step-by-step Execution) 기능을 제공합니다. 이 기능을 활용하면 코드의 흐름을 면밀히 관찰하고 디버깅하는 데 큰 도움이 됩니다.
단계별 실행 활성화
단계별 실행 기능은 YaksokSession
인스턴스의 stepByStep
속성을 true
로 설정하여 활성화할 수 있습니다.
const session = new YaksokSession();
session.stepByStep = true;
stepByStep
속성이 true
로 설정되면, 코드의 각 실행 단위(예: 한 줄의 코드, 함수 호출 등)가 실행될 때마다 자동으로 일시 중지됩니다.
실행 흐름 제어
코드가 일시 중지되면, YaksokSession
의 resume()
메서드를 호출하여 다음 실행 단위로 진행할 수 있습니다.
// 코드 실행 시작 (첫 번째 실행 단위에서 일시 중지됨)
session.runModule('main');
// 다음 실행 단위로 진행
session.resume();
// 또 다시 다음 실행 단위로 진행
session.resume();
각 session.resume()
호출은 다음 실행 단위가 완료될 때까지 코드를 진행시키고, 다시 자동으로 일시 중지시킵니다.
내부 동작 원리
stepByStep
기능이 활성화되면, 모든 Node
의 onRunChild
메서드가 호출될 때마다 실행이 일시 중지됩니다. 이는 YaksokSession
의 pubsub
시스템을 통해 resume
이벤트를 기다리는 방식으로 구현됩니다. session.resume()
이 호출되면 resume
이벤트가 발행되어 기다리던 코드가 다음 단계로 진행하게 됩니다.
예시
다음은 간단한 달빛 약속 코드를 단계별로 실행하는 예시입니다.
import { YaksokSession } from '@dalbit-yaksok/core';
async function runStepByStep() {
let output = '';
const session = new YaksokSession({
stdout(message) {
output += message;
},
});
session.stepByStep = true;
session.addModule(
'main',
`
"안녕하세요" 보여주기
"달빛 약속" 보여주기
"단계별 실행" 보여주기
`,
);
console.log('코드 실행 시작...');
const runPromise = session.runModule('main');
// 첫 번째 '보여주기' 전에 일시 중지됨
await new Promise(resolve => setTimeout(resolve, 100)); // 짧은 대기
console.log('첫 번째 일시 중지. resume 호출...');
session.resume(); // "안녕하세요" 실행
// 두 번째 '보여주기' 전에 일시 중지됨
await new Promise(resolve => setTimeout(resolve, 100)); // 짧은 대기
console.log('두 번째 일시 중지. resume 호출...');
session.resume(); // "달빛 약속" 실행
// 세 번째 '보여주기' 전에 일시 중지됨
await new Promise(resolve => setTimeout(resolve, 100)); // 짧은 대기
console.log('세 번째 일시 중지. resume 호출...');
session.resume(); // "단계별 실행" 실행
await runPromise;
console.log('코드 실행 완료. 최종 출력:', output);
}
runStepByStep();
이 예시를 실행하면 각 console.log
메시지 사이에 session.resume()
을 호출하여 수동으로 다음 코드 줄로 진행시킬 수 있습니다. 이를 통해 코드의 각 부분이 어떻게 실행되는지 명확하게 이해할 수 있습니다.