Node.js ๐Ÿ‰ ๊ฒ‰ํ•ฅ๊ธฐ

yeeun leeยท2020๋…„ 3์›” 13์ผ
0

Node.js

๋ชฉ๋ก ๋ณด๊ธฐ
1/3

2020.3.13

javascript๊ฐ€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋ผ๊ณ  ํ•˜์—ฌ, ํ’€์Šคํƒ์ด๋ผ๋Š” ๋ถ€ํ‘ผ ๊ฟˆ์„ ์•ˆ๊ณ  node.js๋„ ์ฐ”๋” ๊ณต๋ถ€ํ•ด๋ณด์•˜๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ... ๋”ฐ๋ผํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ดˆ์งœ์ธ ๋‚˜์—๊ฒŒ๋Š” ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค ๐Ÿฅบ ... ๊ทธ๋ž˜์„œ ์ง€๊ธˆ๊นŒ์ง€ ์•Œ๊ฒŒ๋œ ๊ฐœ๋…๋งŒ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ์€ ์ฝ”๋“œ์นด๋ฐ๋ฏธ, ์ƒํ™œ์ฝ”๋”ฉ ๋“ฑ ๊ฐ•์˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ๋‹ค.


2020.7.1
4๊ฐœ์›” ์ „์— ๋ญฃ๋„ ๋ชจ๋ฅด๊ณ  ์ •๋ฆฌํ•œ node๊ฐœ๋…๋“ค์„ ๋‹ค์‹œ ๋ณด๋‹ˆ๊นŒ ๋ญ” ๋ง์ธ์ง€ ์•Œ ๊ฒƒ ๊ฐ™์•„์„œ ๋„ˆ๋ฌด ์‹ ๊ธฐํ•˜๋‹ค. ๊ทธ ๋•Œ ์ •๋ฆฌํ•ด๋†“์€ ๋‚˜ ์ž์‹  ์นญ์ฐฌํ•ด

Node.js? ๐Ÿค”

node.js๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์ด๋‹ค. ๋Ÿฐํƒ€์ž„์€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๋œปํ•˜๊ณ , ๋‹ค์‹œ ๋งํ•˜๋ฉด ๋…ธ๋“œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ™˜๊ฒฝ์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ €์— ์ข…์†๋˜์–ด ์žˆ๋˜ Javascript๊ฐ€ ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ์›น์„œ๋ฒ„ ๊ธฐ๋Šฅ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๊ฐ€ ๋œ ๊ฒƒ์ด๋‹ค.

์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์ „์— ๋ช‡ ๊ฐ€์ง€ ๊ฐœ๋…๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

  • node -v: ๋ฒ„์ „ ํ™•์ธ
  • node: node repl ์—ด๊ธฐ
  • .editor: ์—ฌ๋Ÿฌ ์ค„๋กœ ์ž‘์„ฑํ•˜๊ธฐ. ^d๋Š” ์™„๋ฃŒ, ^c๋Š” ์ทจ์†Œ.
  • node filename.js : ํŒŒ์ผ ์—ด๊ธฐ

1. ๋ชจ๋“ˆ

๋ชจ๋“ˆ์€ ๊ฐ„๋‹จํžˆ ๋งํ•ด ํŒŒ์ผ์— ์œ„์น˜ํ•œ ์ฝ”๋“œ์˜ ์ง‘ํ•ฉ์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ํ•„์š”๋กœ ํ• ๋•Œ ๋ถˆ๋Ÿฌ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ์ธ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ๋•Œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋„ฃ๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์ˆ˜์ •ํ•  ์ผ์ด ์ƒ๊ธฐ๊ฑฐ๋‚˜, ํŠน์ • ๋ถ€๋ถ„์„ ์ฐพ์„ ๋•Œ ๋งค์šฐ ๊ท€์ฐฎ์„ ๊ฒƒ์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ๋‚˜๋ˆ„๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ์€ ์ค‘์š”ํ•˜๋‹ค.

1.1 core module

๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ๋ชจ๋“ˆ๋กœ, Node.js์˜ ์†Œ์Šค ์•ˆ์—์„œ ์ •์˜๋˜๊ณ  lib.folder์— ์œ„์น˜ํ•œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์†Œ๊ด„ํ˜ธ ์‚ฌ์ด์— string์„ ๋„ฃ์–ด ์‚ฌ์šฉํ•œ๋‹ค.

let events = require('http');

require() : node.js ์˜ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ•จ์ˆ˜

  • ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋ฉด: require('./name.js')
  • ๋ถˆ๋Ÿฌ์˜จ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ฐ์ฒด๋ฅผ ๋ถ€๋ฅผ ๋•Œ: console.log(name.a) // name.js ํŒŒ์ผ์— a ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •

*** Require()ํ•จ์ˆ˜๋ฅผ ์“ฐ๋”๋ผ๋„ ํ•ด๋‹น ๋ชจ๋“ˆ ์•ˆ์˜ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€ํ•˜๋‹ค. exports์˜ key, value chain์— ๋“ค์–ด๊ฐ€์•ผ ๊ฐ’์ด ์ €์žฅ๋˜์–ด Return์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

- http module

core module ์ค‘ ํ•˜๋‚˜๋กœ, http ์›น์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ์›น์„œ๋ฒ„ ๋ชจ๋“ˆ๋กœ๋Š” express(๋ผ์šฐํŒ…, ํŒŒ์‹ฑ, ๋กœ๊ทธ ๋“ฑ)๋ผ๊ณ  ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋ชจ๋“ˆ์ด ์žˆ๋‹ค.

var http = require('http');
http.createserver(function (req, res) { 
  res.writeHead(200, {'content-Type': 'text/html'}); 
  res.write('hello world!') // ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ–ˆ์„ ๋•Œ์— ๋Œ€ํ•œ ๋ฐ˜์‘
  res.end(); // ๋ฐ˜์‘ ์ข…๋ฃŒ 
}).listen(8080); // ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค

Server method

  • createServer(): ์›น์„œ๋ฒ„๋ฅผ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜. ํ•จ์ˆ˜๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋‚˜ํƒ€๋‚ด๋Š” req ์ธ์ž๋ฅผ ๊ฐ์ฒด๋กœ์„œ ๊ฐ€์ง„๋‹ค.
  • listen(port[,callback]): ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • close(): ์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

Server Property

  • req.url: req ๊ฐ์ฒด์˜ url ๋ถ€๋ถ„์„ return. ์ฆ‰ ๋„๋ฉ”์ธ ์ด๋ฆ„ ๋’ท ๋ถ€๋ถ„์„ ๊ฐ–๊ณ  ์žˆ๋Š” property์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด http://localhost:8080/summer ์ฃผ์†Œ๋ฅผ ์—ด์—ˆ์„ ๋•Œ, terminal์—์„œ /summer ๋ฅผ returnํ•œ๋‹ค.

Response method

  • res.writeHead(): ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๊ฐ€์ง€๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.
    - ์ฒซ ๋ฒˆ์งธ ์ธ์ž: ์›น์„œ๋ฒ„๊ฐ€ ์›น๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ 200์„ ์ฃผ๋ฉด ๋ฌธ์ œ ์—†์ด ์ „์†ก๋˜์—ˆ๋‹ค๋Š” ๋œป์ด๋ฉฐ, 404๋ฅผ ์ฃผ๋ฉด ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๋“ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค.
    - ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๊ฐ์ฒด์˜ response header๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. (text/html ๋“ฑ ์–ด๋–ค ํ˜•์‹์œผ๋กœ ๋ณด์ผ์ง€์— ๋Œ€ํ•ด ์ฝ˜ํ…์ธ  ํƒ€์ž…์„ ์ •์˜)
  • res.end(): ๊ด„ํ˜ธ ์•ˆ์— ์‘๋‹ต ๋ณธ๋ฌธ์„ ์ž‘์„ฑํ•œ๋‹ค. ์ฆ‰ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†กํ•  ๋ฐ์ดํ„ฐ. ex. 404์ผ ๊ฒฝ์šฐ Not found๋ผ๋“ ์ง€...

- url module

url ๋ชจ๋“ˆ์€ ์›น ์ฃผ์†Œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์ชผ๊ฐœ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

  • url.parse() : url ์ฃผ์†Œ์˜ property(host, pathname, search ๋“ฑ)๋ฅผ ๋‚˜๋ˆ„์–ด returnํ•œ๋‹ค.

ํŒŒ์‹ฑ(parsing): ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๋ชจ์–‘์œผ๋กœ ๊ฐ€๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

w3school์˜ ์˜ˆ์‹œ๐Ÿ”ฝ

var url = require('url');
var adr = 'http://localhost:8080/default.htm?year=2017&month=february';
var q = url.parse(adr, true);

console.log(q.host); //returns 'localhost:8080'
console.log(q.pathname); //returns '/default.htm'
console.log(q.search); //returns '?year=2017&month=february'

var qdata = q.query; //returns an object: { year: 2017, month: 'february' }
console.log(qdata.month); //returns 'february'

url์˜ ๊ตฌ์„ฑ์š”์†Œ

url ๋ชจ๋“ˆ์— ์‚ฌ์šฉ๋˜๋Š” url์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด, ์ด๊ณ ์ž‰๋‹˜์˜ ์ƒํ™œ์ฝ”๋”ฉ ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค. ์•„๋ž˜ ์ด๋ฏธ์ง€์˜ ์ƒํ™œ์ฝ”๋”ฉ ์›น ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ €์˜ ์ •๋ณด ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ๊ฐ•์˜ ํ™”๋ฉด์ด๋‹ค.

  • protocol: ์ œ์ผ ์•ž์—๋Š” ์ž์›์— ์ ‘๊ทผํ•  ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ด๋‘” ํ”„๋กœํ† ์ฝœ์„ ์ ๋Š”๋‹ค. http๋Š” ์›น๋ธŒ๋ผ์šฐ์ €์™€ ์›น์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ํ†ต์‹  ๊ทœ์น™ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
  • host(domain): ์ธํ„ฐ๋„ท์— ์ ‘์†ํ•ด์žˆ๋Š” ์ปดํ“จํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์ด๋‹ค.
  • port: ํ•œ ์ปดํ“จํ„ฐ ์•ˆ์— ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„ ๋‚ด ์–ด๋–ค ํฌํŠธ์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ (์›น์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ๊ฐ’์ด 80์ด๋‹ค)
  • path: ์ปดํ“จํ„ฐ ์•ˆ์˜ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ /๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ์–ด๋–ค ๋””๋ ‰ํ† ๋ฆฌ์˜ ์–ด๋–ค ํŒŒ์ผ์ธ์ง€ ์ฐพ๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • query string: database์—์„œ ํŠน์ •ํ•œ ์ •๋ณด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ปดํ“จํ„ฐ๋‚˜ ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž…๋ ฅ๋˜๋Š” ๊ฐ’๋“ค. ๋ฌผ์Œํ‘œ๋กœ ์‹œ์ž‘ํ•˜๊ณ , key๋ผ๋ฆฌ๋Š” &๋กœ ๊ตฌ๋ถ„, key์™€ value๋Š” =๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. ex. ?id=html&page=12

- fs module

file system์˜ ์•ฝ์ž๋กœ, ์„œ๋ฒ„์— ์กด์žฌํ•˜๋Š” ํŒŒ์ผ์„ ์ฐพ์•„ ํด๋ผ์ด์–ธํŠธ์— ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

  • fs.readFile: ํŒŒ์ผ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๋‚ด์šฉ๋ฅผ ์ฝ์–ด์˜จ๋‹ค.
  • fs.readdir: ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์žˆ๋Š” ํŒŒ์ผ๋ฅผ ์ฝ์–ด์˜จ๋‹ค. ํŒŒ์ผ๋“ค์€ ๋ฐฐ์—ด๋กœ ํ‘œ์‹œ๋œ๋‹ค.
fs.readFile('/etc/passwd', (err, data) => {
  if (err) throw err;
  console.log(data);
});

์œ„ ํ•จ์ˆ˜์˜ ์ธ์ž์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ err๋Š” ์—๋Ÿฌ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ์ฃผ๋ผ๋Š” ๋œป, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ธ์ž๋กœ์„œ ๊ณต๊ธ‰ํ•˜๋ผ๋Š” ๋œป์ด๋‹ค.

- event

ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ๋•Œ, ์œ ์ €๊ฐ€ ์–ธ์ œ ํด๋ฆญํ• ์ง€ ๋ชจ๋ฅธ๋‹ค๋Š” ์ „์ œ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฒคํŠธ ๋“œ๋ฆฌ๋ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ, ํด๋ฆญ ์‹œ์ ์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ)

eventemitter

  • .on(): ์ด๋ฆ„์ด ์žˆ๋Š” ์ด๋ฒคํŠธ์— listener ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” method
  • .emit():
// Require in the 'events' core module
let events = require('events');

// Create an instance of the EventEmitter class
let myEmitter = new events.EventEmitter();

1.2 local module

๊ธฐ๋ณธ ์ €์žฅ๋œ ๋ชจ๋“ˆ์ด ์•„๋‹ˆ๋ผ ๋‚ด๊ฐ€ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ, ๋ชจ๋“ˆ์˜ ์ƒ๋Œ€์  ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์–ด์„œ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

// app.js
let Dog = require('./dog.js');
const tadpole = new Dog('Tadpole');
console.log(tadpole.praise());

2. ํŒจํ‚ค์ง€๋งค๋‹ˆ์ €

npm

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์œ„ํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž & node.js์˜ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ด๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์„ค์น˜, ์—…๋ฐ์ดํŠธ ๋ฐ ์‚ญ์ œ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

pm2

node.js์˜ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์ž. ์›๋ž˜ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ ctr+c ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๊ป๋‹ค ์ผœ์ค˜์•ผ ํ•˜๋Š”๋ฐ, pm2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์š”๊ฑฐ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์ž‘์—…์ด ๋“ค์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ ์ผœ๋‘” ์ƒํƒœ์—์„œ node filename.js ๋ช…๋ น์–ด๋กœ ์‹คํ–‰์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋œฐ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ(ํฌํŠธ๊ฐ€ ์‚ฌ์šฉ์ค‘์ด๋ผ๋Š” ์—๋Ÿฌ), ์›๋ž˜ ์ˆ˜๋™์˜ ์ƒํƒœ๋กœ ๋Œ์•„์˜ค๋ ค๋ฉด pm2 stop filename.js ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

profile
์ด์‚ฌ๊ฐ„ ๋ธ”๋กœ๊ทธ: yenilee.github.io

0๊ฐœ์˜ ๋Œ“๊ธ€