Curl Up Black Cat


์˜ค๋Š˜์€ ์‹ค๋ฌด์—์„œ node ๊ธฐ๋ฐ˜์˜ API ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ๊ณ ๋ฏผํ–ˆ์—ˆ๋˜ ์‘๋‹ต์ฒ˜๋ฆฌ์™€ ์ด๋ฅผ ํ•ด๊ฒฐํ–ˆ์—ˆ๋˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ… ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋Š๋‚  ๊ฐ™์ด ํ˜‘์—…ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ถ„์ด ์‘๋‹ต ๋ฐ์ดํ„ฐ์ค‘์—์„œ ํŠน์ • ์†์„ฑ ๊ฐ’์ด null ์ธ ๊ฒฝ์šฐ๋Š” ๋นˆ๊ฐ’์œผ๋กœ ์น˜ํ™˜ํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญ์„ ๋ฐ›๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. API ๋ฐ์ดํ„ฐ์—์„œ null ๊ฐ’์ด ๋‚ด๋ ค์™€ ํ”„๋ก ํŠธ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค๋Š” ๋‚ด์šฉ๊ณผ ํ•จ๊ป˜.. ํŠน์ • ์†์„ฑํ•„๋“œ๋Š” DB ๊ฐ’์€ null ์ด๊ฒ ์ง€๋งŒ ์‘๋‹ต์—์„œ๋Š” ๋นˆ๊ฐ’์œผ๋กœ ์น˜ํ™˜ํ•ด๋‹ฌ๋ผ๋Š” ์š”์ฒญ์ด์˜€๋˜ ๊ฑฐ์ฃ .

์š”์ฒญ์„ ๋ฐ›๊ณ  ๋‹น์‹œ ์ข€ ๊ณ ๋ฏผ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ณผ์—ฐ null ๊ฐ’์„ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์ด ๋ถ€์ ์ ˆ ํ•œ๊ฐ€? ์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋˜ ์ด์œ ๋Š”.. ํ˜„์žฌ ์ฑ„ํƒํ•œ ์Šคํƒ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” NoSQL DB ๊ฐ€ ์•„๋‹Œ SQL DB์ธ MySql ์ด์˜€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฐจ์ด์ ์„ ์กฐ๊ธˆ ์‚ดํŽด๋ณด๋ฉด..
SQL (๊ด€๊ณ„ํ˜•DB) ์˜ ๋ฐ์ดํ„ฐ๋Š” ์ •ํ•ด์ง„ ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ์— ๋”ฐ๋ผ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ๊ฑด SQL ์€ ์ง€์ •๋œ ํ‹€์ด ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋ฅผ ์ค€์ˆ˜ํ•˜์ง€ ์•Š์€ ๋ ˆ์ฝ”๋“œ๋“ค์€ ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด NoSQL (๋น„๊ด€๊ณ„ํ˜• DB)๋Š” ๋ง ๊ทธ๋Œ€๋กœ SQL(๊ด€๊ณ„ํ˜• DB) ์™€๋Š” ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋„ ์—†๊ณ  ๊ด€๊ณ„๋„ ์—†์Šต๋‹ˆ๋‹ค. NoSQL ์—์„œ๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฌธ์„œ(documents) ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์ด๋ฆ„๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ•ต์‹ฌ์ ์ธ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. SQL ์„ธ์ƒ์—์„œ๋Š” ์ •ํ•ด์ง„ ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์ง€๋งŒ, NoSQL ์—์„œ๋Š” ๋‹ค๋ฅธ ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ™์€ ์ปฌ๋ ‰์…˜(=SQL์—์„œ์˜ ํ…Œ์ด๋ธ”)์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์ž๋Š” ๋‹น์‹œ ์ด์—๋”ฐ๋ผ API ์‘๋‹ต๋ฐ์ดํ„ฐ๋„ ์ฐจ์ด๊ฐ€ ์žˆ์–ด์•ผ ํ•˜์ง€ ์•Š์„๊นŒ? ๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. SQL ์—์„œ๋Š” ๊ฐ’์ด ์žˆ๋˜ ์—†๋˜ ์ง€์ •๋œ ์Šคํ‚ค๋งˆ์˜ ์ˆœ์ˆ˜๋ฐ์ดํ„ฐ๊ฐ€ ์‘๋‹ต๋˜๋Š”๊ฒŒ ๋งž๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ . ๋ฐ˜๋ฉด NoSQL ์—์„œ๋Š” ์†์„ฑ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด response ์—์„œ ์ƒ๋žตํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ฐ–๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์‹œ์—๋Š” REST API ์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์กฐ๊ธˆ ๋ถ€์กฑํ–ˆ๋˜๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค..๐Ÿฅฒ

ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„์˜ ๋””๋น„ํ˜•ํƒœ๋ฅผ ์•Œ์ˆ˜ ์žˆ๊ฒŒ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ์„๊นŒ?.. ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. 


์–ด์จ‹๋“  ๋‹น์‹œ์— ์—…๋ฌด์˜ ์š”์ฒญ์„ ์ˆ˜์šฉํ•˜๊ณ  ์‹ถ์—ˆ๊ณ  ๊ทธ๋ž˜์„œ ๊ทธ๋™์•ˆ ์‘๋‹ต๋ฐ์ดํ„ฐ๋“ค์ค‘ null ๊ฐ’์„ ๊ฐ€์ง„ ์†์„ฑ์ด ์žˆ๋‹ค๋ฉด ๋นˆ๊ฐ’์œผ๋กœ ์น˜ํ™˜ํ•ด ์ฃผ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

 

์‚ฌ์‹ค express ์—์„œ๋Š” json null ํ•„๋“œ๋ฅผ response ์—์„œ ์ƒ๋žตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

const app = express()
// JSON null ํ•„๋“œ ์ƒ๋žต
app.set('json replacer', (k, v) => (v === null ? undefined : v))


์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๋Š”๋ฐ...
์ œ๊ธธ... ๋…ธ๋“œ์™€ express์˜ ์ƒํƒœ๊ณ„๋ฅผ ์ œ๋Œ€๋กœ ์ˆ™๋ จํ•˜์ง€ ๋ชปํ•œ ์ดˆ๋ณด์ž์ธ ํ•„์ž๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์ง€ ๋ชปํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์งœ๊ธฐ ์‹œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ์†์„ฑ๊ฐ’์— ์ ‘๊ทผํ•˜์—ฌ ์น˜ํ™˜ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜์—ฌ ๊ฒฐ๊ตญ ์š”์ฒญ์„ ์ˆ˜์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๐Ÿฅฒ ๋ชจ๋ฅด๋ฉด ๋ชธ์ด ๊ณ ์ƒํ•œ๋‹ค๋Š” ๋ง์„ ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋‘๊ณ  ํ•˜๋Š” ๋ง์ธ๊ฑฐ ๊ฐ™๋„ค์š” 

ํ•„์ž๋Š” ๊ฐ’์„ ๊ตฌํ•˜๋Š” utils ํด๋ž˜์Šค์˜ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€๋Š”๋ฐ์š”.
๊ตฌํ˜„ ํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

const ValueUtils = {}

ValueUtils.empty = (str, includeBlank = true) => {
  const empty = str === null || str === undefined || (includeBlank && str === '')
  return empty
}

ValueUtils.nvl = (str, defaultValue = '') => {
  if (ValueUtils.empty(str)) { return defaultValue }
  return str
}

ValueUtils.clearNull = (obj, defaultValue = '') => {
  if (ValueUtils.empty(obj)) { 
    return ValueUtils.nvl(obj, defaultValue) 
  }
  
  if (Array.isArray(obj)) {
    obj.forEach((el) => ValueUtils.clearNull(el, defaultValue))
    return obj
  }

  Object.keys(obj).forEach((key) => {
    if (Array.isArray(obj[key])) {
      obj[`${key}`] = ValueUtils.clearNull(obj[key], defaultValue)
    } else {
      obj[`${key}`] = ValueUtils.nvl(obj[key], defaultValue)
    }
  })
  return obj
}

module.exports = ValueUtils

clearNull ์ด๋ž€ ํ•จ์ˆ˜๋Š” ์ „๋‹ฌ๋œ obj ์˜ ์†์„ฑ์„ ์ ‘๊ทผํ•˜์—ฌ ์†์„ฑ์ด ๋น„์–ด์žˆ๋Š” ๊ฐ’์„ ์น˜ํ™˜ํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
- ์ „๋‹ฌ๋œ ์†์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์ธ
- ์†์„ฑ์ด ๋ฐฐ์—ด์ธ์ง€ ํ™•์ธ -> ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ๋Š” ์š”์†Œ์— ์ ‘๊ทผํ•˜์—ฌ ์žฌ๊ท€ํ˜ธ์ถœ
- Object ์ธ ๊ฒฝ์šฐ๋Š” ์†์„ฑ๊ฐ’์ด ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ๋Š” ์š”์†Œ์— ์ ‘๊ทผํ•˜์—ฌ ์žฌ๊ท€ํ˜ธ์ถœ, ๋ฐฐ์—ด์ด ์•„๋‹Œ๊ฒฝ์šฐ๋ฅผ ์น˜ํ™˜๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์ž…๋‹ˆ๋‹ค.

nvl ํ•จ์ˆ˜ ์˜ค๋ผํด์—์„œ ์‚ฌ์šฉ๋˜๋Š” NULL ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋กœ์„œ data ๊ฐ’์ด null ๊ฐ’์ผ ๋•Œ ์ž„์˜ ์„ค์ •๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์œ„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‘๋‹ต๋ฐ์ดํ„ฐ์ค‘ null, undefined, ๋นˆ๊ฐ’๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์น˜ํ™˜ํ•ด์ฃผ๋Š” ์ž‘์—…์„ ์†์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

exports.get = async (documentId) => {
  try {
    const responseModel = await Document.findById(documentId)
    return ValueUtils.clearNull(responseModel)
  } catch (err) {
    throw err
  }
}

 

'๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ > ๐Ÿ…ฝ Node.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Factory Design Pattern 2  (0) 2022.09.23
Factory Design Pattern 1  (0) 2022.09.21
Retry Promise Design Pattern  (0) 2022.09.20
Promise.all ๋ณ‘๋ ฌ ์‹คํ–‰  (0) 2022.09.19
return vs return await ํ•จ์ •  (0) 2022.09.19

์ถœ์ฒ˜: pixabay

์ด๋ฒˆ์— ๋‹ค๋ฃฐ ๋‚ด์šฉ์€ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ์บก์Šํ™”๋ฅผ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•ด์„œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํŒฉํ† ๋ฆฌ ํŒจํ„ด ์ฒซ๋ฒˆ์งธ ๋‚ด์šฉ์ด ๊ถ๊ธˆํ•˜์‹ ๋ถ„๋“ค์€ ์—ฌ๊ธฐ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”๐Ÿ™‚

ํŒฉํ† ๋ฆฌ๋Š” ํด๋กœ์ € ๋•๋ถ„์— ์บก์Šํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

JavaScript ์—์„œ ์บก์Šํ™”๋ฅผ ์ ์šฉํ•˜๋Š” ์ฃผ์š” ๋ฐฉ๋ฒ•์€ ํ•จ์ˆ˜์— ์Šค์ฝ”ํ”„(Scope)์™€ ํด๋กœ์ €(Closure)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํŒฉํ† ๋ฆฌ๋Š” ์‰ฝ๊ฒŒ private ๋ณ€์ˆ˜๋“ค์„ ๊ฐ•์ œ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

function createPerson(name) {
  const privateProperties = {}
  
  const person = {
    setName (name) {
      if (!name) {
        throw new Error('A person must have a name')
      }
      privateProperties.name = name
    },
    getName () {
      return privateProperties.name
    }
  }
  
  person.setName(name)
  return person
}

์ฝ”๋“œ์—์„œ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜์•ˆ์— ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‘ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
์ฒซ๋ฒˆ์งธ. ํŒฉํ† ๋ฆฌ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์ธ person ๊ฐ์ฒด
๋‘๋ฒˆ์งธ. ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ  person ๊ฐ์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์„ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” privateProperties

๋งˆ์น˜ class ์—์„œ private ํ•„๋“œ๋ฅผ ์„ ์–ธํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๋ฐฉ์‹์˜ ์ฒ˜๋ฆฌ๋ฅผ..
ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜์— ํด๋กœ์ €๋ฅผ ๋‘์–ด ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.
(name ๊ฐ’์€ ํ•„์ˆ˜๊ฐ’์œผ๋กœ ๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ๋œ person ๊ฐ์ฒด๋Š” name ์†์„ฑ์„ ๋ฐ˜๋“œ์‹œ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์ด๋ ‡๊ฒŒ ํŒฉํ† ๋ฆฌ์—์„œ๋„ ์†์‰ฝ๊ฒŒ ์บก์Šํ™” ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์•Œ์•„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

JS ์—์„œ ํŒฉํ† ๋ฆฌ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ๊ฑด ์บก์Šํ™”๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์„ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ๋‹ค์–‘ํ•˜๊ฒŒ ์‘์šฉํ•  ์ˆ˜ ์žˆ์„๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ณ€ ์บก์Šํ™”์˜ ์žฅ์ ์„ ๋ชจ๋ฅธ๋‹ค๋ฉด ์–ด๋–ค๊ฒŒ ์ข‹์€์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ๋‚ด์šฉ์ผ ์ˆ˜๋„ ์žˆ์„๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ €๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ฉด์„œ ์ œ์ผ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๊ฒŒ ์บก์Šํ™”๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์บก์Šํ™”์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ๋ฒˆ์— ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

์ถœ์ฒ˜: pixabay

Node.js ์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋””์ž์ธ ํŒจํ„ด์€ ํŒฉํ† ๋ฆฌ(Factory) ํŒจํ„ด์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ €๋Š” ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํŒฉํ† ๋ฆฌ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ  ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ž˜ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์‹ถ์–ด ๊ด€๋ จ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๋งค์šฐ ๋‹ค์–‘ํ•˜๋ฉฐ ํ•œ๊ฐ€์ง€ ์ด์ƒ์˜ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์žฅ์ ์€ ํŠน์ • ๊ตฌํ˜„์œผ๋กœ ๋ถ€ํ„ฐ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ์‹คํ–‰์‹œ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์บก์Šํ™” ์ฒ˜๋ฆฌ์— ์ข€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

์šฐ์„  ์ด๋ฒˆ ํฌ์Šคํ„ฐ์—์„œ๋Š” ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

JavaScript ์—์„œ ๋‹จ์ˆœ์„ฑ, ์œ ์šฉ์„ฑ ๋ฐ ์ž‘์€ ๋…ธ์ถœ ๋ฉด์œผ๋กœ ์ธํ•ด ์ˆœ์ˆ˜ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ๋””์ž์ธ ๋ณด๋‹ค ํ•จ์ˆ˜ํ˜• ๋ฐฉ์‹์ด ๋” ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ new ์—ฐ์‚ฐ์ž ํ˜น์€ Object.create() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹ ์— ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์—ฌ๋Ÿฌ ์ธก๋ฉด์—์„œ ํ›จ์”ฌ ๋” ํŽธ๋ฆฌํ•˜๊ณ  ์œ ์—ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋ฌด์—‡๋ณด๋‹ค ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Image ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function createImage(name) {
  return new Image(name)
}
const image = createImage('sample.jpeg')

์œ„ createImage() ํ•จ์ˆ˜๋Š” ์ „ํ˜€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ์™œ new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ง์ ‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•˜์„๊นŒ ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์ •๋„๋กœ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋„ ๋˜์ง€ ์•Š์•˜์„๊นŒ์š”?

const image = new Image('sample.jpeg')


ํ•˜์ง€๋งŒ new ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ํŠน์ • ์œ ํ˜•์˜ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€ ํ˜•์‹๋งˆ๋‹ค ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Image ํด๋ž˜์Šค๋ฅผ ๋” ์ž‘์€ ํด๋ž˜์Šค๋กœ ๋ถ„ํ• ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ณผ ๊ฒฝ์šฐ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ๋Š” ๊ธฐ์กด ์‚ฌ์šฉ๋œ ์ฝ”๋“œ๋“ค์€ ์ „ํ˜€ ์†๋Œˆ ํ•„์š” ์—†์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜์— ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

function createImage(name) {
  if (name.match(/\.jpe?g$/)) {
    return new ImageJpeg(name)
  } else if (name.match(/\.gif$/)) {
    return new ImageGif(name)
  } else if (name.match(/\.png$/)) {
    return new ImagePng(name)
  } else {
    throw new Error('Unsupported format')
  }
}


์œ„์™€ ๊ฐ™์ด ๊ด€๋ จ๋œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ๋˜ํ•œ ํด๋ž˜์Šค๋ฅผ ์ˆจ๊ฒจ, ๋ฉ‹๋Œ€๋กœ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์บก์Šํ™”์˜ ์ด์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
JavaScript ์—์„œ๋Š” ํŒฉํ† ๋ฆฌ๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ ํด๋ž˜์Šค๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํŒฉํ† ๋ฆฌ์— ๊ด€ํ•œ ์ฒซ๋ฒˆ์งธ ํฌ์Šคํ„ฐ๋Š” ์—ฌ๊ธฐ๊นŒ์ง€ ์ž‘์„ฑํ•˜๊ณ  ๋‹ค์Œ ํฌ์Šคํ„ฐ์—์„œ ๋‚ด์šฉ ์ด์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

์ด๋ฏธ์ง€์ถœ์ฒ˜: retry

์ด๋ฒˆ์— ์ž‘์„ฑํ•˜๋Š” ํฌ์ŠคํŠธ๋Š” ์ตœ๊ทผ ํ˜„์—…์—์„œ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ์•Œ์•„๋ณด์•˜๋˜ Promise ์žฌ์‹œ๋„ ๋””์ž์ธํŒจํ„ด์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ• ์ ์— ์šฐ๋ฆฌ๋Š” ๋นˆ๋ฒˆํ•˜๊ฒŒ ์„œ๋“œํŒŒํ‹ฐ API ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” ์„œ๋น„์Šค๋Š” AWS ์™€ ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋“œํŒŒํ‹ฐ ์ธก์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ๋˜์–ด ์ž ์‹œ๋™์•ˆ API ํ˜ธ์ถœ์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์— ์–ด๋–ป๊ฒŒ ๋Œ€์ฒ˜ํ•ด์•ผ ํ• ๊นŒ์š”?

์ €๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ API ํ˜ธ์ถœ์„ ์žฌ์‹œ๋„ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ๊ฒ ๋‹ค๊ณ ๋Š” ์ƒ๊ฐํ–ˆ์ง€๋งŒ .. ์‚ฌ์šฉ์„ฑ๊ณผ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•œ ๋ฐฉ์‹์„ ์ž˜ ์•Œ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ตœ๊ทผ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์–ด ๊ธ€์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆฌ๋ฐ์€ ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„ Rxjs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์€ ์„ ํƒ์œผ๋กœ ๋ณด์˜€์ง€๋งŒ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ˆœ์ˆ˜ Promise ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ API ์™€ DB๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์–ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ†ต์ผ์„ฑ์„ ์ง€ํ‚ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ API ํ˜ธ์ถœ ๋กœ์ง์„ ๊ฐ์‹ธ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ์š”.

์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด..

// PromiseService.js

class PromiseService {
  static #instance
  
  static getInstance() {
    if (!this.#instance) {
      this.#instance = new PromiseService()
    }
    return this.#instance
  }
  
  /**
   * @param promise A promise to resolve
   * @param nthTry Number of tries before rejecting
   */
  retryPromise(promise = () => {}, nthTry = 1) {
    try {
      const data = promise()
      return data
    } catch (e) {
      if (nthTry === 1) { return Promise.reject(e) }
      return this.retryPromise(promise, nthTry - 1)
    }
  }
  
  /**
   * Util function to return a promise which is resolved in provided milliseconds
   */
  waitFor(milliSeconds = 1000) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve()
      }, milliSeconds)
    })
  }
  
  async retryPromiseWithDelay(promise = () => {}, nthTry = 1, delayTime = 1000) {
    try {
      const res = promise()
      return res
    } catch (e) {
      if (nthTry === 1) { return Promise.reject(e) }
      await this.waitFor(delayTime)
      return this.retryPromiseWithDelay(promise, nthTry - 1, delayTime)
    }
  }
}

module.exports = PromiseService

์„œ๋น„์Šค ํŒŒ์ผ์—์„œ๋Š” ํ˜ธ์ถœ ์žฌ์‹œ๋„(retruPromise, retryPromiseWitHDelay) ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋งŒํผ ์žฌ๊ท€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด..

async function main() {
  try {
    const promiseService = PromiseService.getInstance()
    const resposne = await promiseService.retryPromiseWithDelay(
      () => axios.get('https://api.twitter.com/v1/user/1234'), // promise
      4, // retry
      2000 // delayTime
    )
    return response
  } catch (e) {
    throw e
  }
}

main()


๋‹จ์ˆœํ•˜๊ฒŒ ์„ ์–ธ์ ์œผ๋กœ Promise ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ์ž…๋ ฅํ•˜๋ฉด ๋˜๊ธฐ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋ฒ•์ด ์‰ฝ๊ณ  ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•œ ๋ฐฉ์‹ ๊ฐ™์Šต๋‹ˆ๋‹ค.

'๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ > ๐Ÿ…ฝ Node.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Factory Design Pattern 2  (0) 2022.09.23
Factory Design Pattern 1  (0) 2022.09.21
Promise.all ๋ณ‘๋ ฌ ์‹คํ–‰  (0) 2022.09.19
return vs return await ํ•จ์ •  (0) 2022.09.19
Node.js ์ฒ ํ•™  (0) 2022.09.19

์ด๋ฏธ์ง€์ถœ์ฒ˜: rajatexplains

async / await ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ จ์˜ ์ž‘์—…๋“ค์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜๋‚˜๋Š” ์ˆœ์ˆ˜ํ•˜๊ฒŒ await ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Promise.all()์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
2๊ฐ€์ง€ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๊ธฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Promise.all() ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ™‚

์šฐ์„  ์ˆœ์ˆ˜ํ•˜๊ฒŒ await ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌด์ œํ•œ ๋ณ‘๋ ฌ ๋น„๋™๊ธฐ ์‹คํ–‰ ํ๋ฆ„์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async function spiderLinks(currentUrl, content, nesting) {
  if (nesting === 0) { return } 
  
  const links = getPageLinks(currentUrl, content)
  const promises = links.map(link => spider(link, nesting - 1))
  for (const promise of promises) {
    await promise
  }
}

๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์•ž์˜ ์ฝ”๋“œ์—์„œ ๋ชจ๋“  spider() ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์‹œ์ž‘ํ•˜์˜€๊ณ  map()์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๋œ ์ž‘์—…๋“ค์˜ Promise๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ Loop ๋ฅผ ๋Œ๋ฉฐ ๊ฐ๊ฐ์˜ Promise ๋ฅผ await ํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ์—” ์ด๊ฒƒ์ด ๊น”๋”ํ•˜๊ณ  ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์€ ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ promises ๋ฐฐ์—ด์— ์–ด๋–ค Promise ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๊ฑฐ๋ถ€๊ฐ€๋˜๋ฉด spiderLinks()์—์„œ ๋ฐ˜ํ™˜๋œ Promise๋„ ๊ฑฐ๋ถ€๋˜๊ฒŒ ๋˜๋Š”๋ฐ ๋ฐฐ์—ด๋‚ด์˜ ๋ชจ๋“  ์„ ํ–‰ Promise๋“ค์ด ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘์—…์˜ ์‹คํŒจ๋ฅผ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์•Œ๊ธฐ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๊ณ  ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” Promise.all() ์ด๋ผ๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ Promise.all() ์€ ์ž…๋ ฅ ๋ฐฐ์—ด์— ์ œ๊ณต๋œ Promise ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ฑฐ๋ถ€๋˜๋Š” ์ฆ‰์‹œ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Promise.all() ์€ ๋˜ ๋‹ค๋ฅธ Promise๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…์—์„œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด await ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const results = await Promise.all(promises)

๊ฒฐ๋ก ์ ์œผ๋กœ ๋ณ‘๋ ฌ ์‹คํ–‰ ๋ฐ async / await ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” spiderLinks() ํ•จ์ˆ˜์˜ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async function spiderLinks(currentUrl, content, nesting) {
  if (nesting === 0) { return }
  
  const links = getPageLinks(currentUrl, content)
  const promises = links.map(link => spider(link, nesting - 1))
  return Promise.all(promises)
}

์ฒ˜์Œ ๋กœ์ง๊ณผ ๋‹ค๋ฅด๊ฒŒ Promise.all() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ ์ด๋Š” promises ๋ฐฐ์—ด์— ์–ด๋–ค Promise ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๊ฑฐ๋ถ€๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉด ์ฆ‰์‹œ ๊ฑฐ๋ถ€ ๋˜๋„๋ก ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘๋ฉ๋‹ˆ๋‹ค.

'๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ > ๐Ÿ…ฝ Node.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Factory Design Pattern 2  (0) 2022.09.23
Factory Design Pattern 1  (0) 2022.09.21
Retry Promise Design Pattern  (0) 2022.09.20
return vs return await ํ•จ์ •  (0) 2022.09.19
Node.js ์ฒ ํ•™  (0) 2022.09.19

์ด๋ฏธ์ง€์ถœ์ฒ˜: chargebacks911


์˜ค๋Š˜์€ ์‹ค๋ฌด์—์„œ ์ž์นซํ•˜๋ฉด ์‹ค์ˆ˜ ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ์ดํ•ด์— ๊ด€ํ•œ ๊ธ€์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
return Promise ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ธ๋ฐ ์ด๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์‹ค์ˆ˜ํ•˜๋Š” ํ”ํ•œ ์•ˆํ‹ฐํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๋‚ด์šฉ์€ ์ฆ‰ async / await์™€ ํ•จ๊ป˜ ์—๋Ÿฌ๋ฅผ ๋‹ค๋ฃฐ ์ ์— ํ˜ธ์ถœ์ž์—์„œ Promise ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๊ณ  Promise ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์˜ ๋กœ์ปฌ try...carch ๋ธ”๋ก์—์„œ ์—๋Ÿฌ๊ฐ€ ์žกํžˆ๋Š” ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด๋ฉด

async function errorNotCaught() {
  try {
    return delayError(1000)
  } catch (err) {
    // ์˜์›ํžˆ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค
    console.error('Error caught by the asycn function: ' + err.message)
  }
}

errorNotCaught()
	.catch(err => console.log('Error caught by the caller: ' + err.message))
    
// ์‹คํ–‰๊ฒฐ๊ณผ: Error caught by the caller: Error after 1000ms

delayError() ์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” Promise๋Š” ๋กœ์ปฌ์—์„œ ๊ธฐ๋‹ค๋ฆฌ์ง€(await) ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฐ˜ํ™˜๋˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋กœ์ปฌ์˜ catch ๋ธ”๋ก์€ ์˜์›ํžˆ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ํ˜ธ์ถœ์ž๊ฐ€ ๋น„๋™๊ธฐ ์ž‘์—…์— ์˜ํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—๋Ÿฌ๊นŒ์ง€ ๋กœ์ปฌ์—์„œ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด, ๋ฐ˜ํ™˜๋  Promise ์•ž์— await ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

async function errorNotCaught() {
  try {
    return await delayError(1000)
  } catch (err) {
    console.error('Error caught by the asycn function: ' + err.message)
  }
}

errorNotCaught()
	.catch(err => console.log('Error caught by the caller: ' + err.message))
    
// ์‹คํ–‰๊ฒฐ๊ณผ: Error caught by the asycn function: Error after 1000ms

return ํ‚ค์›Œ๋“œ ๋’ค์— await ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ async ํ•จ์ˆ˜๊ฐ€ Promise๋ฅผ ๋กœ์ปฌ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

'๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ > ๐Ÿ…ฝ Node.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Factory Design Pattern 2  (0) 2022.09.23
Factory Design Pattern 1  (0) 2022.09.21
Retry Promise Design Pattern  (0) 2022.09.20
Promise.all ๋ณ‘๋ ฌ ์‹คํ–‰  (0) 2022.09.19
Node.js ์ฒ ํ•™  (0) 2022.09.19

์ด๋ฏธ์ง€์ถœ์ฒ˜: pixabay

์ผ๋ถ€ ์›์น™๊ณผ ๋””์ž์ธ ํŒจํ„ด๋“ค์—๋Š” Node.js ํ”Œ๋žซํผ๊ณผ ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์ž์˜ ๊ฒฝํ—˜์ด ์ œ๋Œ€๋กœ ๋…น์•„์žˆ๋‹ค. ๊ฐ€์žฅ ํŠน๋ณ„ํ•˜๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ์ฝœ๋ฐฑ๊ณผ ํ”„๋ผ๋ฏธ์Šค์™€ ๊ฐ™์€ ๋น„๋™๊ธฐ์  ๊ตฌ์„ฑ์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๋Š” ์ ์ด๋‹ค.  Node.js๋ฅผ  ํŠน๋ณ„ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ค‘์š”ํ•œ ์ธก๋ฉด๋“ค ์ค‘ ํ•˜๋‚˜๋Š” ๊ทธ๊ฒƒ์˜ ์ฒ ํ•™์ด๋‹ค. Node.js๋ฅผ ์•Œ์•„๊ฐ€๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Node.js ๊ฐ€ ๊ฐ€์ง„ ๋ฌธํ™”์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋ฐ›์•„๋“ค์ธ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค.

 

Node.js ์ฒ ํ•™

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

 

1. ๊ฒฝ๋Ÿ‰ ์ฝ”์–ด

Node.js ์ฝ”์–ด๋Š” ๋ช‡ ๊ฐ€์ง€ ์›์น™๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์‹ ์˜ ๊ธฐ์ดˆ๋ฅผ ๊ตฌ์„ฑํ•˜์˜€๋‹ค. ๊ทธ ์ค‘ ํ•œ ๊ฐ€์ง€๋Š” ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์ฝ”์–ด์˜ ๋ฐ”๊นฅ ๋ถ€๋ถ„์— ์œ ์ €๋žœ๋“œ(userland) ํ˜น์€ ์œ ์ €์ŠคํŽ˜์ด์Šค(userspace)๋ผ ๋ถˆ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ์ „์šฉ ๋ชจ๋“ˆ ์ƒํƒœ๊ณ„๋ฅผ ๋‘๋Š” ๊ฒƒ์ด๋‹ค. ์ด ์›์น™์ด Node.js ๋ฌธํ™”์— ์—„์ฒญ๋‚œ ์˜ํ–ฅ์„ ์ฃผ์—ˆ๊ณ  ๊ทธ ์˜ํ–ฅ์œผ๋กœ ์—„๊ฒฉํ•˜๊ฒŒ ๊ด€๋ฆฌ๋˜์–ด ์•ˆ์ •์ ์ด์ง€๋งŒ ๋Š๋ฆฌ๊ฒŒ ์ง„ํ™”ํ•˜๋Š” ํ•ด๊ฒฐ์ฑ…์„ ๊ฐ–๋Š” ๋Œ€์‹  ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ์˜ ํญ๋„“์€ ํ•ด๊ฒฐ์ฑ…์„ ์‹คํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์ž์œ ๋ฅผ ์ฃผ์—ˆ๋‹ค. ์ฝ”์–ด๋ฅผ ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ ์„ธํŠธ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๊ด€๋ฆฌ์˜ ๊ด€์ ์—์„œ ํŽธ๋ฆฌํ•  ๋ฟ ์•„๋‹ˆ๋ผ ์ „์ฒด ์ƒํƒœ๊ณ„ ์ง„ํ™”์— ์žˆ์–ด ๊ธ์ •์ ์ธ ๋ฌธํ™”์  ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

 

2. ๊ฒฝ๋Ÿ‰ ๋ชจ๋“ˆ

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

  • "์ž‘์€ ๊ฒƒ์ด ์•„๋ฆ„๋‹ต๋‹ค."
  • "๊ฐ ํ”„๋กœ๊ทธ๋žจ์€ ํ•œ ๊ฐ€์ง€ ์—ญํ• ๋งŒ ์ž˜ํ•˜๋„๋ก ๋งŒ๋“ค์–ด๋ผ."

Node.js ๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž(npm, yarn)์˜ ๋„์›€์„ ๋ฐ›์•„ ๊ฐ ํŒจํ‚ค์ง€๊ฐ€ ์ž์‹ ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋ฒ„์ „์˜ ์ข…์†์„ฑ ํŒจํ‚ค์ง€๋“ค์„ ๊ฐ–๋„๋ก ํ•จ์œผ๋กœ์จ ์ข…์†์„ฑ ์ง€์˜ฅ์—์„œ ๋ฒ—์–ด๋‚˜๊ฒŒ ํ•ด ์ค€๋‹ค. ์ด๋Ÿฌํ•œ ์ธก๋ฉด์€ ํŒจํ‚ค์ง€๊ฐ€ ์ถฉ๋Œ์˜ ์œ„ํ—˜ ์—†์ด ์ž˜ ์ง‘์ค‘ํ™”๋˜๊ณ  ๋งŽ์€ ์ˆ˜์˜ ์ž‘์€ ์ข…์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. Node.js ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ด€ํ–‰์ด ํ‘œ์ค€์ด๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ ์ธก๋ฉด์„ ํ–ฅ์ƒ์‹œ์ผœ ์ค€๋‹ค.

 

์ž‘์€ ๋ชจ๋“ˆ์€ ์žฌ์‚ฌ์šฉ์„ฑ์ด๋ผ๋Š” ์žฅ์  ์™ธ์—๋„ ๋‹ค์Œ์˜ ์žฅ์ ์ด ์žˆ๋‹ค.

  • ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • ํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฝ๋‹ค.
  • ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘์•„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์— ์™„๋ฒฝํ•˜๋‹ค.

๋” ์ž‘๊ณ  ์ง‘์ค‘ํ™”๋œ ๋ชจ๋“ˆ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋ชจ๋‘์—๊ฒŒ ๊ณต์œ ์™€ ์žฌ์‚ฌ์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ์ด๊ฒƒ์€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ˆ˜์ค€์— ์ ์šฉ๋œ Don't Repeat Yourself(DRY) ์›์น™์ด๋‹ค

 

3. ์ž‘์€ ์™ธ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค

Node.js์˜ ๋ชจ๋“ˆ๋“ค์ด ๊ฐ–๋Š” ์žฅ์ ์€ ์ž‘์€ ์‚ฌ์ด์ฆˆ์™€ ์ž‘์€ ๋ฒ”์œ„ ๊ทธ๋ฆฌ๊ณ  ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ ๋…ธ์ถœ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ณ  ์ž˜๋ชป๋œ ์‚ฌ์šฉ์— ๋œ ๋…ธ์ถœ๋˜๋„๋ก ํ•˜๋Š” API ์ƒ์‚ฐ ํšจ๊ณผ๋ฅผ ๊ฐ–๋Š”๋‹ค. Node.js ์—์„œ ๋ชจ๋“ˆ์„ ์ •์˜ํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์€ ๋ช…๋ฐฑํ•œ ๋‹จ์ผ ์ง„์ž…์ ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹จ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

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

 

4. ๊ฐ„๊ฒฐํ•จ๊ณผ ์‹ค์šฉ์ฃผ์˜

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

'๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ > ๐Ÿ…ฝ Node.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Factory Design Pattern 2  (0) 2022.09.23
Factory Design Pattern 1  (0) 2022.09.21
Retry Promise Design Pattern  (0) 2022.09.20
Promise.all ๋ณ‘๋ ฌ ์‹คํ–‰  (0) 2022.09.19
return vs return await ํ•จ์ •  (0) 2022.09.19

+ Recent posts