ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ



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๋ฅผ ์ฐ์–ด์„œ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
๊ธ€ ๋ณด๊ด€ํ•จ