๊นœ์ง€

๐Ÿ“Node.js ์š”์•ฝ ์ด์ •๋ฆฌ ๊นœ์ง€

์ธํŒŒ_ 2022. 1. 10. 19:05

Node.js-์š”์•ฝ-์ด์ •๋ฆฌ

 

NODE.JS

 

๐Ÿ“Œ npm

Node.js-์š”์•ฝ-์ด์ •๋ฆฌ

Major(์ฃผ ๋ฒ„์ „), Minor(๋ถ€ ๋ฒ„์ „), Patch(์ˆ˜ ๋ฒ„์ „)

  • Major๋Š” ํ•˜์œ„ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์€ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ƒ๊ฒผ์„ ๋•Œ ์˜ฌ๋ฆผ
  • Minor๋Š” ํ•˜์œ„ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ƒ๊ฒผ์„ ๋•Œ ์˜ฌ๋ฆผ
  • Patch๋Š” ๊ธฐ๋Šฅ์— ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ–ˆ์„ ๋•Œ ์˜ฌ๋ฆผ
 

[NODE] ๐Ÿ“š npm ์ด๋ž€?

npm(node package manager) npm(node package manager)์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์ด๋‹ค. Node.js์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ๋“ค์„ ํŒจํ‚ค์ง€ํ™”ํ•˜์—ฌ ๋ชจ์•„๋‘” ์ €์žฅ์†Œ ์—ญํ• ๊ณผ ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ CLI(Command li..

inpa.tistory.com

 

๐Ÿ“Œ os ๋ชจ๋“ˆ

CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ, ๋””์Šคํฌ ์šฉ๋Ÿ‰์ด ์–ผ๋งˆ๋‚˜ ๋‚จ์•˜๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ

 

 

๐Ÿ“Œ process ๋ชจ๋“ˆ

  • proces.cwd() : node๋ช…๋ น์„ ํ˜ธ์ถœํ•œ ์ž‘์—…๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ ˆ๋Œ€๊ฒฝ๋กœ. ๋งŒ์ผ C: > node Users/ano/temp/directory.js ์ผ ๊ฒฝ์šฐ C: ๊ฐ€ ํ˜ธ์ถœ ๊ฒฝ๋กœ
  • process.env : ํ™˜๊ฒฝ๋ณ€์ˆ˜
  • process.nextTick : ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰ํ•˜๋Š” ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ. setTimeout < promise < nextTick
 

[NODE] ๐Ÿ“š OS / Process ๋ชจ๋“ˆ (์‹œ์Šคํ…œ ํ™•์ธ)

OS ๋ชจ๋“ˆ OS ๋ชจ๋“ˆ์€ ์‹ค์ œ ๊ฐœ๋ฐœ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“ˆ์€ ์•„๋‹ˆ์ง€๋งŒ ์šด์˜์ฒด์ œ์™€ ์‹œ์Šคํ…œ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ, ๋””์Šคํฌ ์šฉ๋Ÿ‰์ด ์–ผ๋งˆ๋‚˜ ๋‚จ์•˜๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ

inpa.tistory.com

 

๐Ÿ“Œ Event ๋ชจ๋“ˆ

// events ๋ชจ๋“ˆ ์‚ฌ์šฉ
var events = require('events');

// EventEmitter ๊ฐ์ฒด ์ƒ์„ฑ
var eventEmitter = new events.EventEmitter();

// EventHandler ํ•จ์ˆ˜ ์ƒ์„ฑ
var connectHandler = function connected(){
    console.log("Connection Successful");
    
    // data_recevied ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ
    eventEmitter.emit("data_received");
}

// connection ์ด๋ฒคํŠธ์™€ connectHandler ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฐ๋™
eventEmitter.on('connection', connectHandler);

// data_received ์ด๋ฒคํŠธ์™€ ์ต๋ช… ํ•จ์ˆ˜์™€ ์—ฐ๋™
// ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์•ˆ์— ๋‹ด๋Š” ๋Œ€์‹ ์—, .on() ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ์ง์ ‘ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ
eventEmitter.on('data_received', function(){
    console.log("Data Received");
});

// connection ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ
eventEmitter.emit('connection');

console.log("Program has ended");
 

[NODE] ๐Ÿ“š Event ๋ชจ๋“ˆ (์ด๋ฒคํŠธ ์ œ์–ด)

Event ๋ชจ๋“ˆ Node.js ์—์„  Event๋ฅผ ๋งค์šฐ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ , ์ด ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋น„์Šทํ•œ ๊ธฐ์ˆ ๋“ค๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅธ ์†๋„๋ฅผ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค. Node.js ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์„œ๋ฒ„๊ฐ€ ๊ฐ€๋™๋˜๋ฉด, ๋ณ€์ˆ˜๋“ค์„ initialize ํ•˜๊ณ , ํ•จ์ˆ˜๋ฅผ ์„ 

inpa.tistory.com

 

๐Ÿ“Œ path ๋ชจ๋“ˆ

path ๋ชจ๋“ˆ์€ ์šด์˜์ฒด์ œ๋ณ„๋กœ ๊ฒฝ๋กœ ๊ตฌ๋ถ„์ž๊ฐ€ ๋‹ฌ๋ผ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅ

  • path.dirname(๊ฒฝ๋กœ): ํŒŒ์ผ์ด ์œ„์น˜ํ•œ ํด๋” ๊ฒฝ๋กœ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • path.extname(๊ฒฝ๋กœ): ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • path.basename(๊ฒฝ๋กœ, ํ™•์žฅ์ž): ํŒŒ์ผ์˜ ์ด๋ฆ„(ํ™•์žฅ์ž ํฌํ•จ)์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ์ด๋ฆ„๋งŒ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด basename์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • path.join(๊ฒฝ๋กœ, .. .): ์—ฌ๋Ÿฌ ์ธ์ž๋ฅผ ๋„ฃ์œผ๋ฉด ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ๋กœ ํ•ฉ์ณ์ค๋‹ˆ๋‹ค. ์ƒ๋Œ€๊ฒฝ๋กœ์ธ ..(๋ถ€๋ชจ ๋””๋ ‰ํ„ฐ๋ฆฌ)๊ณผ .(ํ˜„ ์œ„์น˜)๋„ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.
 

[NODE] ๐Ÿ“š Path ๋ชจ๋“ˆ (๊ฒฝ๋กœ ์ œ์–ด)

Path ๋ชจ๋“ˆ path ๋ชจ๋“ˆ์€ ์šด์˜์ฒด์ œ๋ณ„๋กœ ๊ฒฝ๋กœ ๊ตฌ๋ถ„์ž๊ฐ€ ๋‹ฌ๋ผ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์šด์˜์ฒด์ œ ๋ณ„๋กœ ๋‹ฌ๋ผ์ง€๋Š” ๊ตฌ๋ถ„์ž์— ๋Œ€ํ•œ ์ด์Šˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ํฌ๊ฒŒ Windows, POSIX ๋กœ ๊ฐˆ

inpa.tistory.com

 

๐Ÿ“Œ utility ๋ชจ๋“ˆ

  • util.deprecate: ํ•จ์ˆ˜๊ฐ€ deprecated ์ฒ˜๋ฆฌ๋˜์—ˆ์Œ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
    ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„ฃ์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
    ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์„ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์กฐ๋งŒ๊ฐ„ ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋  ๋•Œ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์–ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • util.promisify: ์ฝœ๋ฐฑ ํŒจํ„ด์„ ํ”„๋กœ๋ฏธ์Šค ํŒจํ„ด์œผ๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.
    ๋ฐ”๊ฟ€ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ œ๊ณตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ”๊พธ์–ด๋‘๋ฉด async/await ํŒจํ„ด๊นŒ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ข‹์Šต๋‹ˆ๋‹ค.
    ๋‹จ, ์ฝœ๋ฐฑ ํ˜•ํƒœ๊ฐ€ (error, data) => { } ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋…ธ๋“œ์˜ ๋Œ€๋ถ€๋ถ„ ๋ฉ”์†Œ๋“œ๋Š” ์ €๋ ‡๊ฒŒ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
 

[NODE] ๐Ÿ“š Utility ๋ชจ๋“ˆ (๋ณด์กฐ ๊ธฐ๋Šฅ ๋ชจ์Œ)

Utility ๋ชจ๋“ˆ Utility ๋ชจ๋“ˆ์€ node.js์˜ ๋ณด์กฐ์ ์ธ ๊ธฐ๋Šฅ ์ค‘ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ๋งŒ์„ ๋ชจ์•„๋†“์€ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋Š” API ๋ฌธ์„œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. util.format(format, [...]) : console.log() ๋ฉ”์†Œ๋“œ์™€ ๋น„์Šทํ•œ ๊ธฐ..

inpa.tistory.com

 

๐Ÿ“Œ fs ๋ชจ๋“ˆ

 

[NODE] ๐Ÿ“š fs ๋ชจ๋“ˆ (ํŒŒ์ผ ์ œ์–ด)

File System ๋ชจ๋“ˆ ํŒŒ์ผ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ ์ž‘์—…์„ ํ•˜๋Š” ๋ชจ๋“ˆ๋กœ, ๋ณดํ†ต FileSystem์„ ์ค„์—ฌ์„œ fs ๋ชจ๋“ˆ์ด๋ผ๊ณ  ์ค„์—ฌ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋…ธ๋“œ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ชจ๋“ˆ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๋ฉ”์†Œ๋“œ๋Š” API ๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜

inpa.tistory.com

 

๐Ÿ“Œ ๋ฒ„ํผ / ์ŠคํŠธ๋ฆผ / ํŒŒ์ดํ”„

๋ฒ„ํผ : ์ผ์ •ํ•œ ํฌ๊ธฐ๋กœ ๋ชจ์•„๋‘๋Š” ๋ฐ์ดํ„ฐ

์ŠคํŠธ๋ฆผ : ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด ๋ฒ„ํผ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒŒ ์ŠคํŠธ๋ฆผ

Node.js-์š”์•ฝ-์ด์ •๋ฆฌ

ํŒŒ์ดํ”„ : ๋ฒ„ํผ ์ฒ˜๋ฆฌ๋ฅผ ํŒŒ์ดํ”„ ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ

 

 

[NODE] ๐Ÿ“š ๋ฒ„ํผ / ์ŠคํŠธ๋ฆผ / ํŒŒ์ดํ”„ ์ •๋ฆฌ

๋ฒ„ํผ : ์ผ์ •ํ•œ ํฌ๊ธฐ๋กœ ๋ชจ์•„๋‘๋Š” ๋ฐ์ดํ„ฐ ์ผ์ •ํ•œ ํฌ๊ธฐ๊ฐ€ ๋˜๋ฉด ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ. ๋”ฐ๋ผ์„œ ํŒŒ์ผ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ปค์•ผ๋œ๋‹ค. ๋ฒ„ํผ๋ง: ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ฐฐ ๋•Œ๊นŒ์ง€ ๋ชจ์œผ๋Š” ์ž‘์—… ๋ฉ”์†Œ๋“œ buffer.from(๋ฌธ์ž์—ด): ๋ฌธ์ž์—ด

inpa.tistory.com

 

๐Ÿ“Œ url ๋ชจ๋“ˆ

 

[NODE] ๐Ÿ“š url ๋ชจ๋“ˆ (๋งํฌ ์ •๋ณด ์ œ์–ด)

URL ๋ชจ๋“ˆ ๋…ธ๋“œ์—์„œ๋Š” url ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์ดํŠธ ์ฃผ์†Œ ์ •๋ณด๋ฅผ url ๊ฐ์ฒด๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. url ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด ์ฃผ์†Œ ๋ฌธ์ž์—ด์„ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค๋ฉด ๋ฌธ์ž์—ด ์•ˆ์— ์žˆ๋˜ ๊ฐ๊ฐ์˜ ์ •๋ณด๋ฅผ ๋‚˜๋ˆ„์–ด ๊ทธ ๊ฐ์ฒด์˜ ์†์„ฑ

inpa.tistory.com

 

๐Ÿ“Œ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌํ•˜๊ธฐ (์ตœํ›„์˜ ์ˆ˜๋‹จ)

// uncaughtException ์ด ๋ชจ๋“  ์—๋Ÿฌ๋ฅผ ์žก์•„์ฃผ์ง€๋Š” ์•Š์Œ.
// ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์— ๋ณต๊ตฌ ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š”๊ฑด ๋น„์ถ”์ฒœํ•จ.
// ๋‹จ์ˆœํžˆ ์—๋Ÿฌ ๋ฐœ์ƒ ํ™•์ธ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉ
process.on('uncaughtException', err => {
   console.error("์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์—๋Ÿฌ ", err);
})

 


EXPRESS.JS

 

๐Ÿ“Œ morgan ๋ฏธ๋“ค์›จ์–ด

morgan์€ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ์ž์„ธํžˆ ์ฝ˜์†”์— ๊ธฐ๋ก

 

[EXPRESS] ๐Ÿ“š morgan ๋ฏธ๋“ค์›จ์–ด

morgan const express = require('express'); const path = require('path'); const morgan = require('morgan'); // ๋ฏธ๋“ค์›จ์–ด ์—ฐ๊ฒฐ const app = express(); app.set('port', process.env.PORT || 3000); app.use..

inpa.tistory.com

 

๐Ÿ“Œ cookie-parser ๋ฏธ๋“ค์›จ์–ด

 - cookie-parser๋Š” ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ๋“ค์–ด์˜จ ์ฟ ํ‚ค๋ฅผ ํ•ด์„ํ•˜์—ฌ ๊ณง๋ฐ”๋กœ req.cookies๊ฐ์ฒด๋กœ ๋งŒ๋“ ๋‹ค.

 - ์„œ๋ช…๋œ ์ฟ ํ‚ค๋Š” req.cookies ๋Œ€์‹  req.signedCookies ๊ฐ์ฒด์— ๋“ค์–ด๊ฐ„๋‹ค.

 - ์ฟ ํ‚ค๋ฅผ ๊ฐœ์ธ ์ €์žฅ ๋ฐ์ดํ„ฐ๋กœ ์‚ฌ์šฉํ• ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด ์‡ผํ•‘๋ชฐ ์ถ”์ฒœ ๋ชฉ๋ก, ๊ด‘๊ณ  ํŒ์—… ๋“ฑ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

๐Ÿ“Œ body-parser ๋ฏธ๋“ค์›จ์–ด

ํผ ๋ฐ์ดํ„ฐ ๋˜๋Š” AJAX ์š”์ฒญ์œผ๋กœ ์˜จ POST ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฉ€ํ‹ฐํŒŒํŠธ (์ด๋ฏธ์ง€, ๋™์˜์ƒ. ํŒŒ์ผ) ๋ฐ์ดํ„ฐ๋Š” ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ ๊ฒฝ์šฐ multer ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

[EXPRESS] ๐Ÿ“š bodyParser, cookieParser ๋ฏธ๋“ค์›จ์–ด

cookie-parser http ๋ชจ๋“ˆ์„ ์“ธ๋•Œ๋Š”, ์ด๋ ‡๊ฒŒ ์ผ์ผํžˆ ์ฟ ํ‚ค ์„ค์ •์„ ์ฝ”๋”ฉํ•ด ์ค˜์•ผ ํ–ˆ์—ˆ๋‹ค. // ์ฟ ํ‚ค ๋ฌธ์ž์—ด์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ const parseCookies = (cookie = '') => cookie .split(';') .map(v =>..

inpa.tistory.com

 

๐Ÿ“Œ static ๋ฏธ๋“ค์›จ์–ด

๊ธฐ๋ณธ ๊ฒฝ๋กœ์ธ / ๋กœ ์™”์„ ๋•Œ, express๋Š” public ํด๋” ์•ˆ์— ์žˆ๋Š” ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์„ ์ฐพ๋Š”๋‹ค.

app.use('/', express.static(path.join(__dirname, 'public')));

 

๐Ÿ“Œ expression-session ๋ฏธ๋“ค์›จ์–ด

์„ธ์…˜ ๊ด€๋ฆฌ์šฉ ๋ฏธ๋“ค์›จ์–ด.

๋กœ๊ทธ์ธ ๋“ฑ์˜ ์ด์œ ๋กœ ์„ธ์…˜์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ์ ์œผ๋กœ ์ €์žฅํ•ด๋‘˜ ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.

์„ธ์…˜์€ ์‚ฌ์šฉ์ž๋ณ„๋กœ req.session ๊ฐ์ฒด ์•ˆ์— ์œ ์ง€๋œ๋‹ค.

 

+ Session Store

์„ธ์…˜ ์Šคํ† ์–ด๋Š” ์„ธ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์„ ๋งํ•œ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ Memory Store, File Store, Mongo Store ๊ฐ€ ์žˆ๋‹ค. ๋ณดํ†ต Redis๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

[EXPRESS] ๐Ÿ“š express-session ๋ฏธ๋“ค์›จ์–ด

์„ธ์…˜ ๋™์ž‘์ˆœ์„œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ (์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ ์ ‘๊ทผ) ์„œ๋ฒ„๋Š” ์ ‘๊ทผํด๋ผ์ด์–ธํŠธ์˜ Request-Headerํ•„๋“œ์ธ cookie๋ฅผ ํ™•์ธํ•˜์—ฌ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น ์„ธ์…˜ID๋ฅผ ๋ณด๋ƒˆ๋Š”์ง€ ํ™•์ธ ์„ธ์…˜ID๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด

inpa.tistory.com

 

๐Ÿ“Œ multer ๋ฏธ๋“ค์›จ์–ด

์ด๋ฏธ์ง€, ๋™์˜์ƒ ๋“ฑ์„ ๋น„๋กฏํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํŒŒ์ผ๋“ค์„ ๋ฉ€ํ‹ฐํŒŒํŠธ ํ˜•์‹์œผ๋กœ ์—…๋กœ๋“œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด์ด๋‹ค.

๋ฉ€ํ‹ฐํŒŒํŠธ ํ˜•์‹์ด๋ž€ enctype์ด multipart/form-data ์ธ ํผ์„ ํ†ตํ•ด ์—…๋กœ๋“œํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์„ ์˜๋ฏธํ•œ๋‹ค.

const upload = multer({
    storage: multer.diskStorage({ // ์ €์žฅํ•œ๊ณต๊ฐ„ ์ •๋ณด : ํ•˜๋“œ๋””์Šคํฌ์— ์ €์žฅ
        destination(req, file, done) { // ์ €์žฅ ์œ„์น˜
            done(null, 'uploads/'); // uploads๋ผ๋Š” ํด๋” ์•ˆ์— ์ €์žฅ
        },
        filename(req, file, done) { // ํŒŒ์ผ๋ช…์„ ์–ด๋–ค ์ด๋ฆ„์œผ๋กœ ์˜ฌ๋ฆด์ง€
            const ext = path.extname(file.originalname); // ํŒŒ์ผ์˜ ํ™•์žฅ์ž
            done(null, path.basename(file.originalname, ext) + Date.now() + ext); // ํŒŒ์ผ์ด๋ฆ„ + ๋‚ ์งœ + ํ™•์žฅ์ž ์ด๋ฆ„์œผ๋กœ ์ €์žฅ
        }
    }),
    limits: { fileSize: 5 * 1024 * 1024 } // 5๋ฉ”๊ฐ€๋กœ ์šฉ๋Ÿ‰ ์ œํ•œ
});
// => ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•œ upload๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋’ค์— ๋ผ์šฐํ„ฐ์— ์žฅ์ฐฉํ•˜๋ฉด ๋œ๋‹ค.
  • upload.single() : ๋ฏธ๋””์–ด ํŒŒ์ผ ํ•˜๋‚˜ ์—…๋กœ๋“œ
  • upload.array() : ๋ฏธ๋””์–ด ํŒŒ์ผ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋™์‹œ์— ์—…๋กœ๋“œ
  • upload.field() : ๋ฏธ๋””์–ด ํŒŒ์ผ ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ์—…๋กœ๋“œ ๋”ฐ๋กœ๋”ฐ๋กœ
  • upload.none() : ๋ฏธ๋””์–ด ํƒ€์ž…์ด ์•„๋‹Œ ๊ฑฐ
 

[EXPRESS] ๐Ÿ“š multer ๋ฏธ๋“ค์›จ์–ด

multer ๋ฉ€ํ„ฐ๋Š” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ๋‹ค์†Œ ์–ด๋ ค์šด ๋ฏธ๋“ค์›จ์–ด๋‹ค. ์ด๋ฏธ์ง€, ๋™์˜์ƒ ๋“ฑ์„ ๋น„๋กฏํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํŒŒ์ผ๋“ค์„ ๋ฉ€ํ‹ฐํŒŒํŠธ ํ˜•์‹์œผ๋กœ ์—…๋กœ๋“œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด์ด๋‹ค. ๋ฉ€ํ‹ฐํŒŒํŠธ ํ˜•์‹์ด๋ž€ enctype์ด multipart/

inpa.tistory.com

 

๐Ÿ“Œ dotenv ๋ฏธ๋“ค์›จ์–ด

dotenv๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ .envํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  process.env๋กœ ๋กœ๋“œํ•˜๋Š” ์˜์กด์„ฑ ๋ชจ๋“ˆ์ด๋‹ค.

 

[EXPRESS] ๐Ÿ“š dotenv ๋ฏธ๋“ค์›จ์–ด

์„ ํ–‰ํ•™์Šต [NODE] ๐Ÿ“š ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋‹ค๋ฃจ๊ธฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ž€? ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ ๋ฒ ์ด์Šค๋Š” ํ•˜๋‚˜๋งŒ ๊ด€๋ฆฌํ•˜๊ณ , ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ์šด์˜ ๋“ฑ ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š”๋ฐ์š”. ์–ด๋Š ํ™˜๊ฒฝ์— ๋ฐฐํฌํ•˜๋Š

inpa.tistory.com

 

๐Ÿ“Œ ๋ผ์šฐํ„ฐ

next('route') ๋ผ๋Š” ์ฝ”๋“œ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ผ์šฐํ„ฐ์— ์—ฐ๊ฒฐ๋œ ๋‚˜๋จธ์ง€ ๋ฏธ๋“ค์›จ์–ด๋“ค์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

req.params.id : ๋ผ์šฐํ„ฐ ๋งค๊ฐœ๋ณ€์ˆ˜. '/user/:id'

router.route(์ฃผ์†Œ).get().post() : ๋ผ์šฐํ„ฐ ๊ทธ๋ฃนํ™”

 

[EXPRESS] ๐Ÿ“š ๋ผ์šฐํ„ฐ (Router)

๋ผ์šฐํ„ฐ (Router) ์ต์Šคํ”„๋ ˆ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ผ์šฐํŒ…์„ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, app.js์—์„œ app.get ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ผ์šฐํ„ฐ ๋ถ€๋ถ„์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ผ์šฐํ„ฐ๋ฅผ ๋งŽ์ด ์—ฐ๊ฒฐํ•˜๋ฉด

inpa.tistory.com

 

๐Ÿ“Œ req, res ๊ฐ์ฒด ์ •๋ฆฌ

[response]

  • res.app: ๋˜‘๊ฐ™์ด res ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด app ๊ฐ์ฒด์— ์ ‘๊ทผํ•œ๋‹ค. res.app.get('')๊ฐ™์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
  • res.cookie(ํ‚ค, ๊ฐ’, ์˜ต์…˜): ์ฟ ํ‚ค๋ฅผ ์‘๋‹ต์— ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
  • res.clearCookie(ํ‚ค, ๊ฐ’, ์˜ต์…˜): ์ฟ ํ‚ค๋ฅผ ์‘๋‹ต์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
  • res.end(): ๋ฐ์ดํ„ฐ ์—†์ด ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.
  • res.json(JSON): JSON ํ˜•์‹์˜ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.
  • res.redirect(์ฃผ์†Œ): ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•  ์ฃผ์†Œ์™€ ํ•จ๊ป˜ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.
  • res.render(๋ทฐ, ๋ฐ์ดํ„ฐ): ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ๋ Œ๋”๋งํ•˜์—ฌ ์‘๋‹ตํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
  • res.send(๋ฐ์ดํ„ฐ): ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๋ฌธ์ž์—ด, HTML, ๋ฒ„ํผ, ๊ฐ์ฒด, ๋ฐฐ์—ด ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
  • res.sendFile(๊ฒฝ๋กœ): ๊ฒฝ๋กœ์— ์œ„์น˜ํ•œ ํŒŒ์ผ์„ ์‘๋‹ตํ•œ๋‹ค.
  • res.set(ํ—ค๋”, ๊ฐ’) / res.setHeader(ํ—ค๋”, ๊ฐ’): ์‘๋‹ต์˜ ํ—ค๋”๋ฅผ ์„ค์ •ํ•œ๋‹ค. req.get()์ด ํ—ค๋”๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š”๊ฑฐ๋ผ๋ฉด ์ด๊ฑด ํ—ค๋” ์„ค์ •
  • res.status(์ฝ”๋“œ): ์‘๋‹ต ์‹œ์˜ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
res.end()
res.json(JSON)
res.redirect(์ฃผ์†Œ)
res.render(๋ทฐ, ๋ฐ์ดํ„ฐ)
res.send(๋ฐ์ดํ„ฐ)
res.sendFile(๊ฒฝ๋กœ)

๋Š” ๊ฐ ๋ผ์šฐํ„ฐ์— ๋ฐ˜๋“œ์‹œ ํ•œ๋ฒˆ๋งŒ ์จ์•ผ๋˜๋Š”๊ฑด ์žŠ์ง€๋ง์ž.

 

[request]

  • req.app: req ๊ฐ์ฒด๋ฅผ ํ†ตํ•œ app ๊ฐ์ฒด๋กœ์˜ ์ ‘๊ทผ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด req.app.get('port')์™€ ๊ฐ™์€ ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • req.body: body-parser ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋งŒ๋“œ๋Š” ์š”์ฒญ์˜ ๋ณธ๋ฌธ์„ ํ•ด์„ํ•œ ๊ฐ์ฒด์ด๋‹ค.
  • req.cookies: cookie-parser ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋งŒ๋“œ๋Š” ์š”์ฒญ์˜ ์ฟ ํ‚ค๋ฅผ ํ•ด์„ํ•œ ๊ฐ์ฒด์ด๋‹ค.
  • req.ip: ์š”์ฒญ์˜ ip ์ฃผ์†Œ๋ฅผ ๋‹ด๋Š”๋‹ค.
  • req.params: ๋ผ์šฐํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด๋‹ค.
  • req.query: ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด๋‹ค.
  • req.signedCookies: ์„œ๋ช…๋œ ์ฟ ํ‚ค๋“ค์€ req.cookies ๋Œ€์‹  ์—ฌ๊ธฐ์— ๋‹ด๊ธด๋‹ค.
  • req.get(ํ—ค๋” ์ด๋ฆ„): ํ—ค๋”์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค. req.get('Content-type')
 

[EXPRESS] ๐Ÿ“š ์š”์ฒญ ๊ฐ์ฒด์™€ ์‘๋‹ต ๊ฐ์ฒด (req, res)

response res.app: ๋˜‘๊ฐ™์ด res ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด app ๊ฐ์ฒด์— ์ ‘๊ทผํ•œ๋‹ค. res.app.get('')๊ฐ™์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ. res.cookie(ํ‚ค, ๊ฐ’, ์˜ต์…˜): ์ฟ ํ‚ค๋ฅผ ์‘๋‹ต์— ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. res.clearCookie(ํ‚ค, ๊ฐ’, ์˜ต์…˜): ์ฟ ํ‚ค๋ฅผ ์‘๋‹ต..

inpa.tistory.com