Skip to content

단계별 실행 가이드

달빛 약속은 코드 실행 과정을 한 단계씩 추적하고 제어할 수 있는 강력한 단계별 실행(Step-by-step Execution) 기능을 제공합니다. 이 기능을 활용하면 코드의 흐름을 면밀히 관찰하고 디버깅하는 데 큰 도움이 됩니다.

단계별 실행 활성화

단계별 실행 기능은 YaksokSession 인스턴스의 stepByStep 속성을 true로 설정하여 활성화할 수 있습니다.

typescript
const session = new YaksokSession();
session.stepByStep = true;

stepByStep 속성이 true로 설정되면, 코드의 각 실행 단위(예: 한 줄의 코드, 함수 호출 등)가 실행될 때마다 자동으로 일시 중지됩니다.

실행 흐름 제어

코드가 일시 중지되면, YaksokSessionresume() 메서드를 호출하여 다음 실행 단위로 진행할 수 있습니다.

typescript
// 코드 실행 시작 (첫 번째 실행 단위에서 일시 중지됨)
session.runModule('main');

// 다음 실행 단위로 진행
session.resume();

// 또 다시 다음 실행 단위로 진행
session.resume();

session.resume() 호출은 다음 실행 단위가 완료될 때까지 코드를 진행시키고, 다시 자동으로 일시 중지시킵니다.

내부 동작 원리

stepByStep 기능이 활성화되면, 모든 NodeonRunChild 메서드가 호출될 때마다 실행이 일시 중지됩니다. 이는 YaksokSessionpubsub 시스템을 통해 resume 이벤트를 기다리는 방식으로 구현됩니다. session.resume()이 호출되면 resume 이벤트가 발행되어 기다리던 코드가 다음 단계로 진행하게 됩니다.

예시

다음은 간단한 달빛 약속 코드를 단계별로 실행하는 예시입니다.

typescript
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()을 호출하여 수동으로 다음 코드 줄로 진행시킬 수 있습니다. 이를 통해 코드의 각 부분이 어떻게 실행되는지 명확하게 이해할 수 있습니다.