ํฐ์คํ ๋ฆฌ ๋ทฐ
node js ๋ฅผ ์ด์ฉํ ์น ์ปดํ์ผ๋ฌ ๋ง๋ค๊ธฐ
๋๋์ด๋ฐ๐พ 2018. 5. 17. 19:43์์ง ํ๋ก์ ํธ์ ์ด์ฉํ๊ฒ ๋ ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์น ๊ธฐ์ ์ ๊ฑฐ์ ๋ชจ๋ฅด๋ ์ํ์์ ์์ํํฐ๋ผ ์๊ฐ์ด ์์ฒญ ๊ฑธ๋ ธ๋ค์ ใ
์ผ๋จ ์ ๊ฐ ๊ตฌํํ ๊ฒฐ๊ณผ๋ฌผ์ ์ด๋ ์ต๋๋ค
๋ฑ๋ณด๋ฉด ์๊ฒ ์ง๋ง ์น์ฌ์ดํธ ์์์ C ์ฝ๋๋ฅผ ์ ๋ ฅํ๊ณ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ปดํ์ผ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด์ฃผ๋ ๊ฒ์ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํ์ํ ํ์ผ์ html ํํ๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ์ผ๊ณผ html ์์ ์ ๋ ฅํ ๊ฐ์ ์ฒ๋ฆฌํ ์๋ฒ๊ฐ ํ์ํฉ๋๋ค.
์ฐธ๊ณ ๋ก ์๋ฒ์๋ gcc ์ปดํ์ผ๋ฌ๊ฐ ์ค์น๋์ด์์ด์ผํฉ๋๋ค. ์น์์์ ์ปดํ์ผ ๋๋ค๊ธฐ๋ณด๋ค๋ ๋ด ์ปดํจํฐ(์๋ฒ)์์ ์ปดํ์ผ ํ๊ณ ๋์จ ๊ฒฐ๊ณผ ๊ฐ์ ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ๋๊ฒจ์ฃผ๋ ํํ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ๋ ํด๋ผ์ด์ธํธ ๋ถ๋ถ์ pug ํ ํ๋ฆฟ ์์ง์ผ๋ก ์์ฑํํฐ๋ผ ๊ธฐ๋ณธ html ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ๋ ๋ชจ์์ด ์ข ๋ค๋ฆ ๋๋ค.
์ปดํ์ผ ๋๋ ๊ธฐ๋ฅ๋ง์ ์ค์ ์ ์ผ๋ก ํ๊ธฐ์ํด ๋ถํธ์คํธ๋ฉ ๋ถ๋ถ์ ๋ค ๋นผ๊ณ ๊ธฐ์ฌํ๊ฒ ์ต๋๋ค.
form.pug
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 32 33 34 35 36 37 | doctype html html(lang='en') head script(src='https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js') body h1 ๋ฌธ์ select#language(name='language') option(name='1') C option(name='2') C++ option(name='3') Java p textarea#code(style='resize:none; width:400px; height:300px;' name='code') p input#output(type='text' name='output' style='resize:none; width:400px; height:50px;' readonly='readonly') p input#ajax_post(type = 'button' value='์ ์ถํ๊ธฐ' class='ajaxsend') p script. document.querySelector('.ajaxsend').addEventListener('click',function(){ sendAjax('http://localhost:3000/form_receive',code.value); }) function sendAjax(url,data,language){ var data = {'code': data}; data = JSON.stringify(data); var xhr = new XMLHttpRequest(); xhr.open('POST',url,true); xhr.setRequestHeader('Content-type','application/json'); xhr.send(data); xhr.addEventListener('load',function() { var result = JSON.parse(xhr.responseText); if(result.result !='ok')return; document.getElementById('output').value=result.output; }); } script(src='https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js') p | cs |
์์์ ๋งํ๋ ๊ฒ์ฒ๋ผ ์ด๊ฒ์ ๊ฒ ๋นผ๋ค๋ณด๋ ์ด๊ฒ ์ ํํ ๋์๊ฐ๋ ์ฝ๋์ผ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ฃผ์ ๋์๋ถ๋ถ์ ๋ค ๊ธฐ์ ๋์ด ์์ต๋๋ค.
์ผ๋จ ์ ๊ฐ ํ์ํ ๋ถ๋ถ์ textarea ๋ถ๋ถ์ ์์ฑ๋๋ ์ฝ๋์ ๋๋ค. ๊ทธ ๋ถ๋ถ์ ์ ๋ ฅ ๋ฐ์ ๊ฐ์ ์๋ฒ๋ก ๋๊ธฐ๋๋ฐ ์ฌ๊ธฐ์ ์ค์ํ๊ฑด Ajax ํต์ ์ผ๋ก ๊ฐ์ ๋๊ฒจ์ค์ผํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํ๋ฉด ์ด๋์ ํด์ค์ผํ๋ ๋ถ๋ถ์ด ์๋๋ฐ ์ ๋ ๊ฒฐ๊ณผ ์ฐฝ๋ง ๊ฐ์ ๋ฐ๊พธ๊ณ ์ถ์ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฒด ํ๋ฉด์ ๋ฆฌ๋ก๋ ํ๋๊ฑด ๋ถํ์ํ๊ธฐ๋ํ๊ณ ๋ณด๊ธฐ์๋ ์ข์ง ์์ฃ .
< AJAX ์ ํน์ง>
AJAX์ ๊ฐ๋ ฅํ ํน์ง์ ํ์ด์ง ์ ์ฒด๋ฅผ ๋ฆฌํ๋ ์ฌ ํ์ง ์๊ณ ์๋ ์ํ ๋๋ "๋น๋๊ธฐ์ฑ"์ ๋๋ค. ์ด๋ฌํ ๋น๋๊ธฐ์ฑ์ ํตํด ์ฌ์ฉ์์ Event๊ฐ ์์ผ๋ฉด ์ ์ฒด ํ์ด์ง๊ฐ ์๋ ์ผ๋ถ๋ถ๋ง์ ์ ๋ฐ์ดํธ ํ ์ ์๊ฒ ํด์ค๋๋ค.
ํด๋น์ฝ๋ ์ ๋ถ์์ ๋ถ๋ถ๋ถ๋ถ ๋ฝ์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1 | input#ajax_post(type = 'button' value='์ ์ถํ๊ธฐ' class='ajaxsend') | cs |
1 2 3 4 | script. document.querySelector('.ajaxsend').addEventListener('click',function(){ sendAjax('http://localhost:3000/form_receive',code.value); }) | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function sendAjax(url,data){ var data = {'code': data}; data = JSON.stringify(data); var xhr = new XMLHttpRequest(); xhr.open('POST',url,true); xhr.setRequestHeader('Content-type','application/json'); xhr.send(data); xhr.addEventListener('load',function() { var result = JSON.parse(xhr.responseText); if(result.result !='ok')return; document.getElementById('output').value=result.output; }); } | cs |
=> ๋งค๊ฐ๋ณ์๋ก url๊ณผ data ๋ฅผ ๋ฐ๋ function ์ด๋ค. var data = { 'code' : data }; ๋ฅผ ํ๊ฒ๋๋ฉด json ํํ๋ก data ๋ณ์์ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๊ณ ๊ทธ ๊ฐ์ ๋ค์ ๋ฌธ์์ด๋ก ๋ณํํ๋ ํจ์์ธ JSON.stringify ๋ฅผ ์์ฑํด์ค๋๋ค.
url ๊ฐ์ ํด๋ผ์ด์ธํธ์์ ๋ณด๋ธ ๊ฐ์ ์ฒ๋ฆฌํ ์๋ฒ ์ชฝ์ app.post๋ก ์์ฑ๋ ๋ผ์ฐํฐ ์ ๋๋ค.
XMLHttpRequest ์ด ๋ถ๋ถ์ ๊ทธ๋ฅ ๊ทธ๋๋ก ์จ์ฃผ๋ฉด ๋ ๋ฏํฉ๋๋ค. ์์ธํ ๊ณต๋ถํ๊ฑด ์๋์ง๋ง Javascript ๋ฅผ ์ด์ฉํ์ฌ ํต์ ์ ํ ๋ ํ์ํ ๊ฐ์ฒด? ๋ผ๊ณ ๋ณด๋ฉด ๋ ๋ฏ ํฉ๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก๋ POSTํ์์ผ๋ก data๋ฅผ ์๋ฒ์ ์ ๋ฌํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
addEventListener ๋ถ๋ถ์ ์๋ฒ์ชฝ์์ ๋ค์ ํด๋ผ์ด์ธํธ ์ชฝ์ผ๋ก ๊ฐ์ ์ ๋ฌํด์คฌ์ ๋ ๋์ํ๋ ๋ถ๋ถ์ ๋๋ค. ์๋ฒ ์ชฝ์์ ์ ๋ฌํ ๊ฐ์ ํ ๋๋ก ์กฐ๊ฑด๋ฌธ์ ํตํด ์คํ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ํํ์ ๋๋ค. ์ฌ๊ธฐ์ 'ok' ๊ฐ ์ ๋ฌ๋์ ๋ ๊ฒฐ๊ณผ์ฐฝ์๋ค๊ฐ ์ปดํ์ผ ๊ฒฐ๊ณผ ๊ฐ์ ์ฝ์ ํด์ค๋๋ค.
app.js
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | const express = require('express'); const parse = require('parse-json'); const app = express(); const fs = require('fs'); const spawn = require('child_process').spawn; const bodyParser = require('body-parser'); app.set('view engine','pug'); app.set('views','./views'); app.use(bodyParser.urlencoded({extended: false})); app.use(bodyParser.json()); app.use(express.static(__dirname + '/public')); app.get('/form',function(req,res){ res.render("form"); }); app.post('/form_receive',function(req,res) { var code = req.body.code; var source = code.split(/\r\n|\r\n/).join("\n"); var file='test.c'; fs.writeFile(file,source,'utf8',function(error) { console.log('write end'); }); var compile = spawn('gcc',[file]); compile.stdout.on('data',function(data) { console.log('stdout: '+data); }); compile.stderr.on('data',function(data){ console.log(String(data)); }); compile.on('close',function(data){ if(data ==0) { var run = spawn('./a.out',[]); run.stdout.on('data',function(output){ console.log('์ปดํ์ผ ์๋ฃ'); var responseData = {'result':'ok','output': output.toString('utf8')}; res.json(responseData); }); run.stderr.on('data', function (output) { console.log(String(output)); }); run.on('close', function (output) { console.log('stdout: ' + output); }); } }); }); ๋งจ ์๋ app.listen ๋ถ๋ถ ์๋ต๋จ.. ๊น๋จน์์ต๋๋ค ์จ์ค์ผ ํจ | cs |
=> ๋งจ ์์ ์์ฑ๋๋ app. ~~~ ์ ๊ฐ์ ์ฝ๋๋ค์ ํด๋น ์์ ์์ ๋ค ํ์ํ ์ฝ๋๋ค๋ง ๋จ๊ฒจ๋ ๊ฒ์ ๋๋ค.
app.get์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ pug ์ฝ๋๋ฅผ render ํด์ค๋ค. ๊ทธ๋ผ localhost:3000/form ์ ํํ๋ก ์ ์ํ์ ๋ ์์ ์์ฑํ html ์ฝ๋์ ํ์ด์ง๊ฐ ๋์ค๊ฒ ์ฃ ?
์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ์ปดํ์ผํ๊ณ ๊ฒฐ๊ณผ ๊ฐ์ ๋ค์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด ์ค ๊ณณ์ app.post ๋ถ๋ถ์ ๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var code = req.body.code; var source = code.split(/\r\n|\r\n/).join("\n"); var file='test.c'; fs.writeFile(file,source,'utf8',function(error) { console.log('write end'); }); var compile = spawn('gcc',[file]); compile.stdout.on('data',function(data) { console.log('stdout: '+data); }); compile.stderr.on('data',function(data){ console.log(String(data)); }); | cs |
=> ํด๋ผ์ด์ธํธ์์ ๋ณด๋ธ ๊ฐ์ ๋ณ์ ๊ฐ์ ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ code ๊ฐ์ ํ๋ฒ ๊ฐ๊ณตํด์ค์ผํฉ๋๋ค. ์๋๋ฉด ํด๋ผ์ด์ธํธ์ชฝ์์ ๋ณด๋ด์ค๋ ์ฝ๋๊ฐ์ ๊ฐํ์ฒ๋ฆฌ๊ฐ ์๋๋ ํํ๋ก ๋ ๋ผ์ค๋๋ฐ ์ปดํ์ผ์ ํ๊ธฐ ์ํด์ ์ ์ด๋ ๊ฐํ์ฒ๋ฆฌ๋ ๋ค ๋์ด์ผํ๋ฏ๋ก ๊ทธ๋ ๊ฒ ์ฒ๋ฆฌํ ๊ฐ์ ๋ค์ source๋ผ๋ ๋ณ์ ๊ฐ์ ๋ฃ๊ณ ์ฐ๋ฆฐ ์ด ๊ฐ์ ์ค์ ์ฝ๋ ๊ฐ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
ํ์ผ์์คํ ์ ์ด์ฉํ์ฌ source ๋ณ์์ ๊ฐ์ ์์ค์ฝ๋ ํ์ผ๋ก ์๋ฒ ์ปดํจํฐ์ ์ ์ฅํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ gcc ์ปดํ์ผ๋ฌ๋ฅผ ์ด์ฉํด์ ์๋ฒ ๋ด๋ถ์์ ๋ง๋ค์ด์ง ์์ค์ฝ๋ ํ์ผ์ ์ปดํ์ผ ํด์ฃผ๊ณ ๊ทธ ํ์ผ์ ์คํํด์ ๊ฒฐ๊ณผ ๊ฐ์ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | compile.on('close',function(data){ if(data ==0) { var run = spawn('./a.out',[]); run.stdout.on('data',function(output){ console.log('์ปดํ์ผ ์๋ฃ'); var responseData = {'result':'ok','output': output.toString('utf8')}; res.json(responseData); }); run.stderr.on('data', function (output) { console.log(String(output)); }); run.on('close', function (output) { console.log('stdout: ' + output); }); } }); }); | cs |
=> ๋ง์ง๋ง ์ด ๋ถ๋ถ์์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ์๋ผ ์ ์์ต๋๋ค. ์ปดํ์ผ ๊ฒฐ๊ณผ๋ก ๋์จ ์คํํ์ผ (a.out) ์ ์คํ์์ผ์ ๋์ค๋ ๊ฒฐ๊ณผ ๊ฐ (output)์ ๋ค์ ํด๋ผ์ด์ธํธ ์ชฝ์ผ๋ก ์ ๋ฌํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ ๋ฌํ๋ ํํ๋ jsonํํ๋ก ์ ๋ฌํ๋ฉฐ output ์ ๋ฌ ์์ toString('utf8') ์ ํ์ง ์์ผ๋ฉด bufferType ์ผ๋ก ๊ฐ์ด ์ ๋ฌ๋์ด ์์คํค ์ฝ๋ ๊ฐ์ผ๋ก ์ ๋ฌ์ด ๋๊ธฐ ๋๋ฌธ์ ์ด ์์ ์ ๊ผญ ํด์ค์ผ ํฉ๋๋ค.
1 2 3 4 5 | xhr.addEventListener('load',function() { var result = JSON.parse(xhr.responseText); if(result.result !='ok')return; document.getElementById('output').value=result.output; }); | cs |
์๊น ํด๋ผ์ด์ธํธ์์ ์๋ฒ์ชฝ์์ ์ ๋ฌํ๋ ๊ฐ์ ์ ๋ฐ์ดํธํ๋ ๋ถ๋ถ์ธ๋ฐ json ํํ์ ์ ๋ฌ๋๋ ๊ฐ ์ค์์ ์ฒซ ๋ฒ์งธ ๊ฐ์ธ result์ ๊ฐ์ด ok ๊ฐ ์๋๋ผ๋ฉด return ; ์ฆ ์๋ฌด ์์ ๋ ํ์ง ์๊ณ ok์ผ ๋์๋ง output์ด๋ผ๋ textarea์ ์ปดํ์ผ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ ๋ฐ์ดํธ ์์ผ์ฃผ๋ฉด ๋!
Ajax๋ json์ ์ต์์น๊ฐ ์์์ ์ ๋ง ์ ๋จน์ ์์ ์ด์๋ค์.... ํ์์ค์ ํ์๋๊น ๋ ์ฐ์ตํด์ผ๊ฒ ๋ค์ ใ
'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 async ๋ชจ๋ ์ฌ์ฉํ๊ธฐ (0) | 2018.07.20 |
- Total
- Today
- Yesterday
- @nestjs/config
- Promise bulk
- DeferredResult
- Request_Limit_Exceeded
- foreignkey
- ๋น๋๊ธฐ ์์ฒญ
- nestjs typeorm
- nestjs directory
- Spring Async
- Spring
- docker mysql
- node.js backend
- typeorm ์ฐ๊ฒฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- backend-framework
- nestjs/cli
- typeorm
- sequelize
- ๊ธฐ์์ฒญAPI
- ์๊ณ ๋ฆฌ์ฆ
- nestjs configService
- Promise error
- nestjs config
- nestjs doc
- NestJS
- JavaScript
- nestjs module
- nestjs project
- node.js
- android
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |