ํฐ์คํ ๋ฆฌ ๋ทฐ
Node ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ์์ผ๋ก ์๋์ ํฉ๋๋ค. ์ฆ 1 2 3 4 5 ์์๋ก ์ฝ๋ฉ์ ํ์ด๋ ๋ฐ๋์ 1 2 3 4 5 ์ ์์๋ก ์คํ์ ํ์ง ์๋ ๋ค๋ ์๊ธฐ์ ๋๋ค. ์๋ฒ์ชฝ์์๋ ๋น๋๊ธฐ์์ผ๋ก ์๋ํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ธ ์ํฉ์ด ๋ง์ง๋ง ๋ฐ๋์ ์์ฐจ์ ์ผ๋ก ์๋ํด์ผํ ํ๋ก์ธ์ค๋ ์๊ธฐ ๋ง๋ จ์ ๋๋ค. ์ ๊ฐ ์์ ํ๋ ๊ณผ์ ์ค ๊ทธ๋ฌํ ๊ณผ์ ์ด ์์ด์ async๋ผ๋ ๋ชจ๋์์ waterfall์ ์ฌ์ฉํ ๊ฒฝํ ๋ฐ ์ฝ๋๋ฅผ ์จ๋ณด๊ณ ์ ํฉ๋๋ค. ์ผ๋จ ์ ๊ณผ์ ์ ์ด๋ ์ต๋๋ค.
์น ์์์ ์ปดํ์ผ์ด ๊ฐ๋ฅํ ์๋ํฐ๋ฅผ ๊ตฌํํ์๋๋ฐ ๊ณผ์ ์ ๋ณด์๋ฉด ์์๊ฒ ์ง๋ง ์์ฑ๋์ง๋ ์์ ํ์ผ์ ์ปดํ์ผ ํ ์๋ ์์ ๊ฒ์ด๊ณ ์ปดํ์ผ์ด ์๋ ํ์ผ์ ์คํํ๋ ๊ฒ๋ ๋น์ฐํ ๋ถ๊ฐ๋ฅ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ์์ ๊ฐ์ ๊ณผ์ ์ ๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ์ผํ๋ ๊ณผ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ ์์ฐจ์ ์ธ ์ฝ๋ ํน์ ํจ์ ํํ๋ก ์ง๋ฉด ์๋๊ณ ์ฝ๋ฐฑํ์์ ์ด์ฉํ๋ ๋๊ธฐ์ ์ธ ํํ๋ก ์์ฑํด์ผ ํ์ต๋๋ค.
์ ์ฒด์ ์ธ ์ฝ๋์ ๋๋ค.
let fs = require('fs'); let spawn = require('child_process').spawn; let cp = require('child_process'); let exec = require('child_process').exec; let models = require('../models'); let async = require('async'); function compileFunction(lan,path,source,res){ let file, compile,run,responseData; let tasks = [ //ํ์ผ ์์ฑ function(callback){ if(lan==='c') file = path+'test.c'; else if(lan==='java') file = path+'Test.java'; else if(lan==='python') file = path+'test.py'; fs.writeFile(file,source,'utf-8',err=>{if(err) throw err;}); callback(null,file); }, //์์ฑ๋ ํ์ผ์ ์ปดํ์ผ function(file,callback){ if(lan==='c'){ compile = exec('gcc test.c',{cwd:'sources'},(err,stdout,stderr)=>{ if(stderr.length===0){ let run = spawn('./sources/./a.out',[]); run.stdout.on('data',stdout=>{ callback(null,stdout.toString('utf8')); }) } else callback(true,stderr) }) } else if(lan==='java'){ compile = exec('javac Test.java',{cwd:'sources'},(err,stdout,stderr)=>{ if(stderr.length===0) { let run = exec("java Test",{cwd:'sources'},(err,stdout,stderr)=>{ callback(null,stdout); }); } else callback(true,stderr) }) } else if(lan==='python'){ compile = exec('python3 test.py',{cwd:'sources'},(err,stdout,stderr)=>{ if(stderr.length===0) { callback(null,stdout) } else callback(true,stderr) }) } }, //์ปดํ์ผ ํ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ function(stdout,callback){ callback(null,stdout) } ] async.waterfall(tasks,(err,msg)=>{ if(err){ responseData = {'result':'err','output':msg}; res.json(responseData); } else{ responseData = {'result':'ok','output':msg}; res.json(responseData); console.log('done'); } }); } exports.compileFunction = compileFunction;
์ ๋๋ก ์คํ๋๋ ๊ฒ๋ง ํ์ธํ๊ณ ์์ง ๋ค๋ฌ์ง๋ ์์ ์ํ์ฌ์ ์ฝ๋๊ฐ ์ง์ ๋ถํ ์ํ์ ๋๋ค. waterfall์ด๋ผ๋๊ฒ ๋ง ๊ทธ๋๋ก ํญํฌ์์ ํํ๋ฅผ ๋๋ค๊ณ ํด์ ๋ถ์ฌ์ง ์ด๋ฆ์ธ๋ฐ function์ด ๋ง์น ํญํฌ์์ฒ๋ผ ๋์ด๋๋ฉฐ, ์ ๋จ๊ณ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋จ๊ณ์ ๋ณ์๊ฐ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ callback ํํ๋ฅผ ๋๊ณ ์์ต๋๋ค. ์ฌ์ฉ์ ๋ชจ๋ํํ๋ก ์ฐ๊ธฐ์ํด์ ๋ฐ๋ก ๋ถ๋ฆฌ์์ผ ๋์ js ํ์ผ์ด๊ธฐ๋๋ฌธ์ ๋งค๊ฐ๋ณ์๋ ์ด๋ฏธ app.js ํ์ผ์์ ๋์ด์จ ์ํ์ธ๋ฐ ๊ทธ๋ฐ๊ฑด ์ ์ณ๋๊ณ ๋์ ๊ณผ์ ๋ง ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
let tasks = [ //ํ์ผ ์์ฑ function(callback){ if(lan==='c') file = path+'test.c'; else if(lan==='java') file = path+'Test.java'; else if(lan==='python') file = path+'test.py'; fs.writeFile(file,source,'utf-8',err=>{if(err) throw err;}); callback(null,file); }, //์์ฑ๋ ํ์ผ์ ์ปดํ์ผ function(file,callback){ if(lan==='c'){ compile = exec('gcc test.c',{cwd:'sources'},(err,stdout,stderr)=>{ if(stderr.length===0){ let run = spawn('./sources/./a.out',[]); run.stdout.on('data',stdout=>{ callback(null,stdout.toString('utf8')); }) } else callback(true,stderr) }) } else if(lan==='java'){ compile = exec('javac Test.java',{cwd:'sources'},(err,stdout,stderr)=>{ if(stderr.length===0) { let run = exec("java Test",{cwd:'sources'},(err,stdout,stderr)=>{ callback(null,stdout); }); } else callback(true,stderr) }) } else if(lan==='python'){ compile = exec('python3 test.py',{cwd:'sources'},(err,stdout,stderr)=>{ if(stderr.length===0) { callback(null,stdout) } else callback(true,stderr) }) } }, //์ปดํ์ผ ํ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ function(stdout,callback){ callback(null,stdout) } ]
=> ๋๊ธฐ์ ์ผ๋ก ์๋ํด์ผํ function๋ค์ ๋ฐฐ์ดํํ๋ก ์์ฑํด์ค ๊ฒ์ ๋๋ค. ์๊น ์์์๋ ํ๋ฆ๋๋ฅผ ์ฒจ๋ถํ์๋๋ฐ ๊ฑฐ๊ธฐ์ ์ฝ๊ฐ์ ์ค๋ช ์ ๋ํด๋ณด๊ฒ ์ต๋๋ค.
์ ๋นจ๊ฐ์ ์๊ตฌ์ฌํญ๋ค์ด callback ํจ์์ ๋งค๊ฐ๋ณ์๋ก ๋ค์ด๊ฐ ๊ฐ๋ค์ ๋๋ค. ํ์ผ์ ์ ๋ฌํด์ค์ผ ์ปดํ์ผ์ ํ ํ ๊ณ ์คํํ์ผ์ด ์์ด์ผ ์คํ์ ํ๊ฒ ์ฃ ๊ต์ฅํ ๋จ์ํ ์ด์น์ ๋๋ค. ํญ์ ํจ์์ ๋์ callback(null, ์ ๋ฌํ ๋ณ์) ์ ํํ๋ก ํธ์ถ์ ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๊ทผ๋ฐ null์ ๋๋์ฒด ์ ๋ค์ด๊ฐ๋๊ฑด๊ฐ ๊ถ๊ธํด์ ์ ๋ ์ฐพ์ ๋ดค์ต๋๋ค.
๊ตฌ๊ธ ๋ฒ์ญ๊ธฐ์ ๋์์ผ๋ก ๋ฒ์ญ์ ํด๋ณด๋
--------------------google ๋ฒ์ญ-------------------------
์ผ๋ฐ์ ์ผ๋ก ๋ ธ๋์์ ์ฝ๋ฐฑ์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๊ฒ์ด null์ด ์๋ ๋ค๋ฅธ ๊ฒ์ด๋ผ๋ฉด, ์ด๋ค ์ด์ ๋ก ๋ ์์ ์ด ์คํจํ์ต๋๋ค. ์๋ง๋ ํธ์ถ ์์ ์๊ฐ ๋ณต๊ตฌ ํ ์ ์์ง๋ง ํธ์ถ์๊ฐ ๋ณต๊ตฌ ํ ์์๋ ๊ฒ์ผ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์ ์ดํ์ ๋ค๋ฅธ ์ธ์๋ ์ฐ์ฐ์ ๋ฐํ ๊ฐ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค (์ฑ๊ณตํ ๋ฉ์์ง, ๊ฒ์ ๋ฑ).
---------------------------------------------------------
๋ผ๊ณ ํด์์ด ๋์ต๋๋ค. ๋ถ์๊ธฐ์ ๋ง์น ๊ด์ต์ ์ผ๋ก ๊ทธ๋ ๊ฒ ์ฐ์ธ๋ค ๋ผ๋ ๋์์ค๋ฅผ ๋ณด์ด๋๊ฑธ ๋ณด๋ ๋ค๋ฅธ ์ธ์ด์์๋ ์๋ ์๋ ์๊ฒ ์ง๋ง node์์๋ ๊ด์ต์ ์ผ๋ก ๊ทธ๋ ๊ฒ ์ฐ๋๋ณด๋ค ํ๊ณ ์ผ๋จ ๋์ด๊ฐ๊ฒ ์ต๋๋ค. ์ฆ ์ฐ๋ฆฌ๊ฐ ์ ๊ฒฝ์จ์ผํ ์ธ์๋ ์ฒซ ๋ฒ์งธ ์ธ์ ์ดํ๋ผ๋ ๊ฒ์
๋๋ค.
์๋ฌดํผ ๋ฐฐ์ดํํ๋ก ์ฌ๋ฌ๊ฐ์ ํจ์๋ฅผ ๋ชจ๋ ์์ฑํ๋ค ์น๋ฉด ๋๊ธฐ์์ผ๋ก ์๋์ํค๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค.
async.waterfall(tasks,(err,msg)=>{ if(err){ responseData = {'result':'err','output':msg}; res.json(responseData); } else{ responseData = {'result':'ok','output':msg}; res.json(responseData); console.log('done'); } });
async์ waterfall์ ์ด์ฉํ์ฌ ๋งค๊ฐ๋ณ์๋ก ์์ฑํ ํจ์์ ๋ฐฐ์ด๊ณผ ์ฝ๋ฐฑํจ์๋ฅผ ์ด์ฉํ์ฌ ์ ๋๋ก ์คํ์ด ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์๋๋ฉด ๊ฐ ํจ์์ ๋จ๊ณ๋ง๋ค log๋ฅผ ์ฐ์ด์ ๋ด๊ฐ ์๊ฐํ ์์๋๋ก ์คํ๋๊ณ ์๋์ง ํ์ธํ์ ๋ ๋ฉ๋๋ค.
'Node.js > Node.js ์ค์ต' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
session์ผ๋ก ๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ (Sequelize DB ํ์ฉ) (0) | 2018.10.23 |
---|---|
sementic url ์ ์ฉํด๋ณด๊ธฐ (0) | 2018.10.10 |
callback ํจ์ ์ดํดํ๊ธฐ (0) | 2018.09.08 |
์ด๋ฏธ์ง url๊ณผ ํ์ผ์์คํ ์ ํตํ ์ด๋ฏธ์ง ๋ค์ด๋ก๋ (Flickr API ์ฌ์ฉ) (0) | 2018.09.05 |
node js ๋ฅผ ์ด์ฉํ ์น ์ปดํ์ผ๋ฌ ๋ง๋ค๊ธฐ (7) | 2018.05.17 |
- Total
- Today
- Yesterday
- sequelize
- docker mysql
- Promise error
- Request_Limit_Exceeded
- nestjs doc
- node.js
- @nestjs/config
- typeorm
- backend-framework
- Promise bulk
- nestjs configService
- nestjs module
- ๋น๋๊ธฐ ์์ฒญ
- ๊ธฐ์์ฒญAPI
- ์๊ณ ๋ฆฌ์ฆ
- nestjs directory
- Spring
- Spring Async
- JavaScript
- foreignkey
- nestjs/cli
- NestJS
- android
- typeorm ์ฐ๊ฒฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- nestjs config
- node.js backend
- DeferredResult
- nestjs typeorm
- nestjs project
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |