November 16, 2020
๋จผ์ nodemon ์ ์ค์นํด์ผ ํ๋ค.
npm install --save nodemon
(-g ๋ก ๊ธ๋ก๋ฒ ์ค์น๋ ์ํด๋ดค๋๋ฐ.. โsave ๋ฅผ ํตํด package.json ์ dependencies ์ ์ค์น ๋ด์ฉ์ ํ์ธํ ์ ์๊ฒ ํด์ผ ํ๋ค. ๋๋ฃ์์ ๋ถํ๋ฅผ ์๋ฐฉ..)
"scripts": {
"start": "nodemon server/basic-server.js",
"test": "jest",
"submit": "node .travis/submit.js"
},
npm start ๋ช ๋ น์ด๋ฅผ ํตํด ์ด๋ค ๋ด์ฉ์ ์คํํ๊ฒ ํ ๊ฑด์ง ์ง์ ํด ์ฃผ๋ ๊ฒ์ด๋ค.
node server/basic-server.js ๋ฅผ ํตํด์๋ ๊ฐ๋ฅํ์ง๋ง, ์ด ๊ฒฝ์ฐ์๋ ๋ณ๋์ฌํญ์ด ์ ์ฉ๋์์ ๋ ๋์์ ์ํด์๋ ๋งค๋ฒ ์๋ฒ ์คํ์ ๊ป๋ค๊ฐ ๋ค์ ์ผ์ผ ํ๋ ๋ถํธํจ์ด ๋ฐ์ํ๊ฒ ๋๋ค.
์ด์ npm start ๋ฅผ ํตํด ์๋ฒ๋ฅผ ์คํ์ํฌ ์ ์์ง๋ง ๋ญ๊ฐ ์๋ฌ๊ฐ ๋ฌ๋ค.
์ด๋ basic-server.js ๋ด์์ requestHandler ๋ผ๋ ๋ณ์๋ฅผ ๋ถ๋ฌ์ค์ง ๋ชปํด์ ์ธ๋ฐ,
๊ธฐ์กด ํ์ผ์์ ํ ๋๋ฒ์งธ ์ค์๋ค๊ฐ requestHandler.js ํ์ผ์ (๋ชจ๋์) ๋ถ๋ฌ์ค๊ฒ ํ์๋ค.
// ๋์ ํ์ผ ํ์ฅ์ js ๋ ์๋ต ๊ฐ๋ฅํ๋ค.
const requestHandler = require('./request-handler')
์ ํ์ผ ์์ฒด ์ฝ๋๋ฅผ ๋ค ๊ฐ์ ธ์ ๋ณด์. (์ด๋ฌ๋ฉด ๋์ค์ ๋ค ๊น๋จน์ด..)
const http = require('http') // Node.js ์ Http ๋ชจ๋์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ถ๋ฌ์๋ค.
const requestHandler = require('./request-handler')
const port = 3000 // Port (์๋ฒ๋ก ์์ฒญ์ ๋ฐ๊ธฐ ์ํ ์ํํธ ํธ์ ์ค์ )
const ip = '127.0.0.1' // Local basic ip address
// const ip = "localhost";
const server = http.createServer(requestHandler)
// http.createServer ๋ก ์์ฑ๋ ์๋ฒ๋ ๋ชจ๋ incoming requests๋ฅผ ์ฒ๋ฆฌํ ๊ฒ์ด๋ค.
console.log('Listening on http://' + ip + ':' + port)
server.listen(port, ip) // node ์๋ฒ๊ฐ ๊ณ์ํด์ ๋๋๋ก ํ๋ก์ธ์ค๋ฅผ ์ ์งํ๋ค.
module.exports = server
Full IM 00 200JH 8:27 PM
module.exports๋ ๋ค๋ฅธํ์ผ์์ ํด๋น ๋ชจ๋์ ์ฌ์ฉํ๊ธฐ์ํ ์ค๋น๋จ๊ณ?๊ฐ์๊ฑฐ๋ผ ์ด๊ฑฐ์ฃ . ์ ํํ ์ด๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ค๋ฅธํ์ผ์์ server๋ชจ๋์ require()๋ฅผ ์จ์ ์ฌ์ฉํ๋ ๊ณณ์ด ์๊ฒ ์ฃ ?
Full IM 00 XXX 8:27 PM
์์ ๊ฐ์ฌํฉ๋๋ค ใ ใ
Full IM 00 200JH 8:27 PM
requestHandler๋ ๋์ผํ๊ฒ ์ฐ์ จ์ผ๋ ์ดํดํ์ จ์๊ฒ ๊ฐ์ต๋๋น
Full IM 00 XXX 8:27 PM
๊ทธ๋ผ ์ server ๋ผ๋ ํค์๋๋ฅผ ๋ค๋ฅธ ํ์ผ์์ ์ธ์ ์๋ค๋ ์๋ฏธ์ธ๊ฑฐ๊ฐ์์:)
basic-server.js ๋ด์์ requestHandler ๋ผ๋ ์ธ๋ถ ํ์ผ์ ํจ์๋ฅผ ์ฌ์ฉํ๋๋ฐ ๊ทธ ํจ์๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋ฐ๋ก
request-handler.js ํ์ผ์์ ์์ฑํด์ผ ํ๋ ๊ฒ์ด์๋ค.
reuqestHandler ํจ์๋ ์ด๋ฏธ basic-server.js ํ์ผ์์ ์ฌ์ฉ ํ์ง๋ง, ์์ง ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์
requestHandler ํจ์๋ฅผ export ํ์ฌ basic-server.js ์์ ์ฌ์ฉ ํ ์ ์๊ฒ ํด์ผ ํ๋ค.
module.exports = requestHandler
request-handler.js ํ์ผ ๋งจ ์๋์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ฃ์ด ์ฃผ์๋ค.
๊ทผ๋ฐ ๋ญ ์ด๋ป๊ฒ ํ๋ผ๊ตฌ.. ใ ใ ์์..๐ญ๐ญ๐ญ๐ญ๐ญ๐ญ๐ญ๐ญ๐ญ๐ญ
const requestHandler = function(request, response) {
// node server ์ requestHandler๋ ํญ์ request, response๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค.
// ๋ํ http ์์ฒญ์ ํญ์ ์์ฒญ๊ณผ ์๋ต์ด ๋๋ฐ ๋์ด์ผ ํฉ๋๋ค.
// ์ด๊ฒ๋ค์ ์์ฒญ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค. ์๋ฅผ๋ค๋ฉด, ์์ฒญ url๊ณผ method ๋ฑ์ ๋ด๊ณ ์์ต๋๋ค.
// ์๋๋ ๋ชจ๋ ๋ฆฌํ์คํธ์ ๋ฉ์๋์ url์ ๋ก๊น
ํด์ค๋๋ค.
console.log(
'Serving request type ' + request.method + ' for url ' + request.url
)
// ์ด ์๋ ์๋ ์์๋ ์ฝ๋.
}
์ด์ GET ๋ฐฉ์์ผ๋ก, ์ฆ ํด๋ผ์ด์ธํธ๊ฐ (๊ตฌ๊ธ ํฌ๋กฌ) ๋ด ๋ก์ปฌ ์๋ฒ๋ก๋ถํฐ ChatterBox ์ฑํ ๋ด์ญ์ โ์กฐํโ ํ ์ ์๊ฒ ๋ง๋ค์ด ์ค์ผ ํ๋ค!
let body ๋ฅผ ํตํด, ์ผ๋จ ๋ชฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด ๋ด์ (์์ ์๋ฒ๋ผ ์น์) ๋ฃ์ด๋์๋ค.
์ด์ ์๋ฒ (body) ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์กฐํํ ์ ์๋๋ ๊ฑฐ๋ค. GET!
let body = {
results: [
{
username: '๊ด๋ฆฌ์',
roomname: '์ฝ๋์คํ
์ด์ธ ',
date: '2020-11-16T03:44:53.221Z',
text: '์ด๋จธ์๋ธ ์ฌ๋ฌ๋ถ๋ค ํ์ํฉ๋๋ค',
},
{
username: '๊ด๋ฆฌ์',
roomname: '์ฝ๋์คํ
์ด์ธ ',
date: '2020-11-16T03:44:53.221Z',
text: 'chatterbox client ์คํ๋ฆฐํธ๋ฅผ ์ํ ์๋ฒ์
๋๋ค',
},
{
username: '๊ด๋ฆฌ์',
roomname: '์ฝ๋์คํ
์ด์ธ ',
date: '2020-11-16T03:44:53.221Z',
text: '์์ ์์ ํ์ดํ
!!!',
},
],
}
const requestHandler = function(request, response) {
// node server ์ requestHandler๋ ํญ์ request, response๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค.
// ๋ํ http ์์ฒญ์ ํญ์ ์์ฒญ๊ณผ ์๋ต์ด ๋๋ฐ ๋์ด์ผ ํฉ๋๋ค.
// ์ด๊ฒ๋ค์ ์์ฒญ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค. ์๋ฅผ๋ค๋ฉด, ์์ฒญ url๊ณผ method ๋ฑ์ ๋ด๊ณ ์์ต๋๋ค.
// ์๋๋ ๋ชจ๋ ๋ฆฌํ์คํธ์ ๋ฉ์๋์ url์ ๋ก๊น
ํด์ค๋๋ค.
console.log(
'Serving request type ' + request.method + ' for url ' + request.url
)
// ์ด ์๋ ์๋ ์์๋ ์ฝ๋. ์๋๋ถํฐ ์์
if (request.method === 'GET' && request.url === '/messages') {
request
.on('data', chunk => {
let str = new String(chunk, 'UTF-8')
body = str
})
.on('end', () => {
response.writeHead(200, defaultCorsHeaders)
response.end(JSON.stringify(body))
})
} else if (request.method === 'OPTIONS') {
response.writeHead(201, defaultCorsHeaders)
response.end()
} else if (request.method === 'POST' && request.url === '/messages') {
let body2 = ''
request
.on('data', chunk => {
body2 = body2 + chunk
})
.on('end', () => {
const data = JSON.parse(body2)
body.results.push(data)
response.writeHead(201, defaultCorsHeaders)
response.end(JSON.stringify(data))
})
} else {
response.writeHead(404, defaultCorsHeaders)
response.end()
}
// ๊ธฐ๋ณธ CORS ์ค์ ์ด ๋์ด์๋ ์ฝ๋ ์
๋๋ค. ์๋์ ์์ต๋๋ค.
// console.log(request);
// CORS์ ๋ํด์๋ ์กฐ๊ธ๋ ์์๋ณด์ธ์.
const headers = defaultCorsHeaders
// ์๋ต ํค๋์ ์๋ตํ๋ ์ปจํ
์ธ ์ ์๋ฃ ํ์
์ ํค๋์ ๊ธฐ๋ก ํฉ๋๋ค.
headers['Content-Type'] = 'text/plain'
// .writeHead() ๋ฉ์๋์ ๋๋ฒ์งธ ์ธ์๋ก๋ ์๋ต ํค๋์ ํค์ ๊ฐ์ ๊ฐ์ฒด ํํ๋ก ์ ์ด์ค๋๋ค.
// response.writeHead(200, headers);
// ๋
ธ๋ ์๋ฒ์ ๋ํ ๋ชจ๋ ์์ฒญ์ ์๋ต์ด ์์ด์ผ ํฉ๋๋ค. response.end ๋ฉ์๋๋ ์์ฒญ์ ๋ํ ์๋ต์ ๋ณด๋ด์ค๋๋ค.
// response.end("Hello, World!");
}
const defaultCorsHeaders = {
'access-control-allow-origin': '*',
'access-control-allow-methods': 'GET, POST, PUT, DELETE, OPTIONS',
'access-control-allow-headers': 'content-type, accept',
'access-control-max-age': 10, // Seconds.
}
module.exports = requestHandler
โ< Buffer 22 61 62 63 64 22 >โ ์ ๊ฐ์ด ์ฒ๋ฆฌ ๋๋ ๋ถ๋ถ์ ๋ฌธ์์ด๋ก ๋ณํํ๊ธฐ ์ํด ์์ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
request ๋ on ์ผ๋ก ๋ค์ด์ค๋ ์ฝ๋ฐฑ ํจ์์ ์ฐ๊ฒฐ๋๋ ๋ฏ ํ๋ค. (์๋์๋ฆฌ๋ ๋ชจ๋ฅธ๋ค)
JSON.stringify()๋ ๊ฐ์ JSON ํ๊ธฐ๋ฒ์ผ๋ก ๋ณํํ๋ค.
์ฝ๋๋ฅผ ์ธ์ธํ ํด๋ถํ๋ ค๋ ์๊ฐ์ ์ ํ ์์ง๋ง ๊ทธ๋๋ ๊ฐ์ด ์ ์์์ ๋ญ๊ฐ ๋ ์ฝ์ด๋ณด๊ณ ์ ๋ฆฌ๋ฅผ ํด์ผ ํ ๊ฑฐ ๊ฐ๋ค.
๋ญ๊ฐ ํ์ฌ๋ก์๋ ์ ์ด๋์ผ ๋๋์ง ๋ฉ๋์ด ๋์ง ์์์์ด๋ค.