원본 코드

export function runServer(app: Koa) {
    app.listen(serverConfig.port, () => {
        
        // .. Do Something Here
    });
}

목표

수정 코드

export async function runServer(app: Koa) {

    let releaseLock = () => {};
    const lockHandle = new Promise((resolve) => {
        releaseLock = () => { resolve(null); };
    });
    
    app.listen(serverConfig.port, () => {
        
        // .. Do Something Here

        releaseLock();
    });

    await lockHandle;
}

상세(실행 순서 표시)

export async function runServer(app: Koa) {

    let releaseLock = () => {};
    // => [1]
    const lockHandle = new Promise((resolve) => {
        // => [2]
        releaseLock = () => { 
		        // => [6]
            resolve(null); 
        };
    });
    
    // => [3]
    app.listen(serverConfig.port, () => {
        
				// => [5]
        releaseLock();
    });
    
		// => [4]
    await lockHandle;
    // => [7]
}