์๋์ ๋งํฌ๋ Node.js ๊ถ์ฅ ์ฌํญ์ ๋ฐ๋ผ process.exit() ํธ์ถ( run.js ์ ๋ช ์์ต๋๊น ? ์ ๊ฒฝ์ฐ์๋ ๋น๋๊ธฐ ํ์ผ ๋ก๊ฑฐ๊ฐ ์ด๋ฒคํธ ๋ฃจํ์ ๋ค๋ฅธ ๊ฐ๋ฅํ ๋ณด๋ฅ ์์ ์ค์์ ํ๋ฌ์ํ ๊ธฐํ๊ฐ ์๊ธฐ ์ ์ Cucumber.js๊ฐ ๋ ธ๋๋ฅผ ์ข ๋ฃํฉ๋๋ค.
https://nodejs.org/api/process.html#process_process_exit_code
process.stdout ๋ฐ process.stderr์ ๋ํ I/O ์์ ์ ํฌํจํ์ฌ ์์ง ์์ ํ ์๋ฃ๋์ง ์์ ๋น๋๊ธฐ ์์ ์ด ๋ณด๋ฅ ์ค์ธ ๊ฒฝ์ฐ์๋ process.exit()๋ฅผ ํธ์ถํ๋ฉด ํ๋ก์ธ์ค๊ฐ ์ต๋ํ ๋นจ๋ฆฌ ์ข ๋ฃ๋ฉ๋๋ค. . ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ค์ ๋ก process.exit()๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํ ํ์๋ ์์ต๋๋ค. ์ด๋ฒคํธ ๋ฃจํ์ ๋ณด๋ฅ ์ค์ธ ์ถ๊ฐ ์์ ์ด ์์ผ๋ฉด Node.js ํ๋ก์ธ์ค๊ฐ ์์ฒด์ ์ผ๋ก ์ข ๋ฃ๋ฉ๋๋ค. process.exitCode ์์ฑ์ ํ๋ก์ธ์ค๊ฐ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋ ๋ ์ฌ์ฉํ ์ข ๋ฃ ์ฝ๋๋ฅผ ํ๋ก์ธ์ค์ ์๋ฆฌ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
ํํฌ/๋จ๊ณ ์ ์์์ ๋ก๊ฑฐ๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ์ ์์ต๋๊น? ๋๋ ์กฐ์ฌ์ค๋ฝ๊ฒ ๋ชจ๋ ๊ฒ์ด ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ข ๋ฃํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ค์ด-js๊ฐ ์ข ๋ฃ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค.
ํ์ฌ ๋ด๊ฐ ์ฌ์ฉํ๊ณ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ AfterFeatures
์ ์์์ setTimeout
์ด์ง๋ง exitCode
์ ๋ํด ๋ ์ผ์ฐ ๋ฐฐ์ฐ๊ณ ๋ค๊ฐ์ค๋ registerHandler
๊ฐ๊ฐ์๊ฐ์ผ๋ก ์ธํด ํดํน์ ๋ค์ ๋ฐฉ๋ฌธํ ํ I ๋ก์ปฌ run.js๋ฅผ ํธ์งํ์ผ๋ฉฐ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. 1) ๋
ธ๋ ๊ณต์ ๊ถ์ฅ ์ฌํญ, 2) ๋ณ๋ ฌ๋ก ์คํ๋ ๋ ๋๋ฏธ setTimeout์ด ๋์
ํ๋ ํ๋ก์ธ์ค๋ณ ์ง์ฐ, 3) ๋ค๋ฅธ ๋
ธ๋ ํ๋ก์ธ์ค์ ์ํด Cucumber๋ฅผ ์คํํ ๋ ๋ฐ์ํ๋ฏ๋ก ๋ค์ ๋ฐฉ๋ฌธํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์์ํ ๋งค๋ฌ๋ ค ์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ฐ๋ณ ๋จ๊ณ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฌดํํ ๊ฒ์ ์ฒ๋ฆฌํ์ง ์์๊น์? ์ฆ์ ์ข ๋ฃํ์ง ์๊ณ Node์์ ์๊ฐ ์ด๊ณผ๋ก ์ข ๋ฃ๋ฅผ ์์ฒญํ๋ ์ฐ์ํ ๋ฐฉ๋ฒ์ด ์์ด์ผ ํฉ๋๋ค.
registerHandler('AfterFeatures', function (features, callback) {
setTimeout(callback, 1000);
});
๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋ฌธ์ ๋ฅผ ๊ฒช์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์์
์ ์ํํ๋ ๊ฒ์ ์ฃผ์ ํฉ๋๋ค(์ ๋ ์ฃผ๋ก ๋ธ๋ผ์ฐ์ ํ
์คํธ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ๋ํด ์๊ฐํ๊ณ ์์ต๋๋ค. ๋ํ ํด๋น ๋
ธ๋ ๊ถ์ฅ ์ฌํญ์ ๋ฒ์ 6 ๋ฐ 8์๋ง ์กด์ฌํฉ๋๋ค. 2018๋
4์(๋
ธ๋๊ฐ ์ง์ ์ค๋จ๋ ๋)๊น์ง ์ง์๋๋ ๋ฒ์ 4์๋ ์กด์ฌํ์ง ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ ์ํด CLI ์ต์
์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ ๊ฒ์
๋๋ค. process.exit ๋์ process.exitCode๋ฅผ ์ฌ์ฉํ๋ --drain-event-loop
์ ๊ฐ์ ๊ฒ์
๋๋ค.
์ด ๋ฌธ์ ๋ Cucumber.js๋ฅผ ์์ ํ๋ก์ธ์ค๋ก ์คํํ๋ ๋ฐ ์์ด ์ค์ ๋ฌธ์ ๋ฅผ ๋ํ๋ธ๋ค๊ณ ๋ง๋ถ์ด๊ณ ์ถ์ต๋๋ค. ๋๋ --format json
๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ์ด stdout ์คํธ๋ฆผ์ 8K ์ฒญํฌ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๋ฉด Cucumber์ process.exit
๊ฐ ์์ ํ๋ก์ธ์ค๋ฅผ ์กฐ๊ธฐ์ ์ข
๋ฃํ๊ธฐ ์ ์ ์ฒซ ๋ฒ์งธ ์ฒญํฌ๋ง ๋ค์ ๊ฐ์ ธ์ ์๋ฆฝ๋๋ค. ์ถ๋ ฅ. process.exit
์ ๊ฑฐํ๊ณ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
์ด์ ๋ํ ํ ๋ฆฌํ์คํธ๋ฅผ ๊ณง ์ ์ถํ๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค.
@charlierudolph ๊ฐ ์ ํธํ๋ ์๋ฃจ์ ์ ๋ฐ๋ผ ๋ถ์์ ํ์ง๋ง pull ์์ฒญ์ ์ ์ถํ์ต๋๋ค. CLI ํ๋๊ทธ ๋ถ๋ถ์ ์ํํ์ง ์์์ต๋๋ค.
๋๋ ์ฒซ ๋ฒ์งธ ํ์ค ์ถ๋ ฅ ์คํธ๋ฆผ ์ฒดํฌ ํ ํ ์ถ๋ ฅ์ ์ ๋จ ํ ํฌ๋งท json์ผ๋ก์ ์์ ํ๋ก์ธ์ค์์ Cucumber.js๋ฅผ ์คํํ๋ ๋๋ฌธ์ด์๋ค ๋ด๊ฐ๋ก ์คํ์ค์ธ ํน์ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด process.exit
ํ๋ ์ข
๋ฃ์
๋๋ค ๊ทธ ์์ ํ๋ก์ธ์ค๋ ๋๋จธ์ง๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํด๊ฒฐ์ฑ
์ | cat
๋ฅผ ๋ด ์์ ํ๋ก์ธ์ค ๋ช
๋ น์ ์ถ๊ฐํ๋ ๊ฒ์ด์๊ณ , ์ด๋ฅผ ํตํด ์์ ํ๋ก์ธ์ค์์ ์ ์ฒด ์ถ๋ ฅ์ ๋ฐ์ ์ ์์์ต๋๋ค.
๋๊ตฌ๋ ์ง ์์ PR์ ์ถ๊ฐํ ์ ์๊ฑฐ๋ ๋ฒ์ 4๊ฐ ์ผ๋ชฐ๋๋ ๋ช ๋ฌ ์์ ์๋ ๊ทธ๋๋ก ๋ณํฉํ๋ ๊ฒ์ด ์ ์ ํ ์ ์์ต๋๋ค.
์ด ์ค๋ ๋๋ ๋ซํ ํ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ ๊ฒผ์ต๋๋ค. ๊ด๋ จ ๋ฒ๊ทธ์ ๋ํ ์ ๋ฌธ์ ๋ฅผ ์ฌ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋ฌธ์ ๋ฅผ ๊ฒช์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์์ ์ ์ํํ๋ ๊ฒ์ ์ฃผ์ ํฉ๋๋ค(์ ๋ ์ฃผ๋ก ๋ธ๋ผ์ฐ์ ํ ์คํธ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ๋ํด ์๊ฐํ๊ณ ์์ต๋๋ค. ๋ํ ํด๋น ๋ ธ๋ ๊ถ์ฅ ์ฌํญ์ ๋ฒ์ 6 ๋ฐ 8์๋ง ์กด์ฌํฉ๋๋ค. 2018๋ 4์(๋ ธ๋๊ฐ ์ง์ ์ค๋จ๋ ๋)๊น์ง ์ง์๋๋ ๋ฒ์ 4์๋ ์กด์ฌํ์ง ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ ์ํด CLI ์ต์ ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค. process.exit ๋์ process.exitCode๋ฅผ ์ฌ์ฉํ๋
--drain-event-loop
์ ๊ฐ์ ๊ฒ์ ๋๋ค.