undefined

ํ•ต์‹ฌ ์š”์•ฝ

  • ์ฃผ์„์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์งœ์—ฌ์žˆ์ง€ ์•Š๋‹ค๋Š” ๋œป์ด๋‹ค.
  • ⇒ ์ฃผ์„์„ ์ž˜ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฝ”๋“œ์˜ ํ‘œํ˜„๋ ฅ์„ ๊ฐœ์„ ํ•ด์„œ ์ฃผ์„์„ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.
  • ์ฃผ์„์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ ค๋Š” ์„ค๋ช…์„ ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋ผ.
  • ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ฃผ์„์œผ๋กœ ์ค‘๋ณต ์„ค๋ช…ํ•˜์ง€ ๋งˆ๋ผ.
  • ์†Œ์Šค ์ฝ”๋“œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ์ค„ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ฃผ์„์œผ๋กœ ํ‘œํ˜„ํ•˜์ง€ ๋งˆ๋ผ.
  • ์ฃผ์„ ๊ทผ์ฒ˜์— ์žˆ๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ๊ธฐ์ˆ ํ•˜๋ผ.
    • ์ „์—ญ์ ์ธ ์ •๋ณด๋‚˜ ๋‹ค๋ฅธ ์œ„์น˜์— ์žˆ๋Š” ์ฝ”๋“œ์— ์˜์กดํ•˜๋Š” ์ •๋ณด๋Š” ๊ธฐ์ˆ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

4์žฅ ์ฃผ์„

์ฃผ์„์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ฝ”๋“œ๋กœ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฃผ์„์€ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์„ ํ•˜์ง€ ๋ชปํ•˜๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ์ฃผ์„์„ ์œ ์ง€ํ•˜๊ณ  ๋ณด์ˆ˜ํ•˜๊ธฐ๋ž€ ํ˜„์‹ค์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ฃผ์„์€,

  1. ๊ฑฐ์ง“๋ง์„ ์ž์ฃผ ํ•œ๋‹ค.
  2. ์˜ค๋ž˜๋ ์ˆ˜๋ก ์ฝ”๋“œ์—์„œ ๋ฉ€์–ด์ง€๊ณ  ๋ถ„๋ฆฌ๋œ๋‹ค.

์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ํ‘œํ˜„๋ ฅ์„ ๊ฐ•ํ™”ํ•˜์—ฌ ์• ์ดˆ์— ์ฃผ์„์ด ํ•„์š” ์—†๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์—๋„ˆ์ง€๋ฅผ ์Ÿ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

 

์ฝ”๋“œ๋กœ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•˜๋ผ

// ๐Ÿ”ด Bad
// ์ง์›์—๊ฒŒ ๋ณต์ง€ ํ˜œํƒ์„ ๋ฐ›์„ ์ž๊ฒฉ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
if((employee.flags & HOURLY_FLAG) && (employee.age > 65))
// ๐ŸŸข Good
if(employee.isEligibleForFullBenefits())

์ฝ”๋“œ๋กœ ์ถฉ๋ถ„ํžˆ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ์ฃผ์„์œผ๋กœ ๋‹ฌ๋ ค๋Š” ์„ค๋ช…์„ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด ํ‘œํ˜„ํ•˜์˜€๋‹ค.

 

์ข‹์€ ์ฃผ์„

 

๋ฒ•์ ์ธ ์ฃผ์„

ํ‘œ์ค€์— ๋งž์ถฐ ์ž‘์„ฑ๋œ ์ €์ž‘๊ถŒ, ์†Œ์œ ๊ถŒ, ๋ผ์ด์„ ์Šค, ์ฐธ์กฐํ•œ ์™ธ๋ถ€ ๋ฌธ์„œ ์ •๋ณด ๋“ฑ

 

๊ธฐ๋ณธ์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ฃผ์„

์˜ˆ์‹œ 1)

// ํ…Œ์ŠคํŠธ ์ค‘์ธ Responder ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
function getResponderInstance(): Responder {...}

์œ„์™€ ๊ฐ™์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๊ฐ’์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„์€ ํŽธ๋ฆฌํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ฃผ์„์˜ ์ •๋ณด๋ฅผ ํ•จ์ˆ˜๋ช…์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค.

function getResponderBeingTested(): Responder {...}

์˜ˆ์‹œ 2)

// yyyy-MM-dd hh:mm:ss
const timePattern = /([0-2][0-9]{3})-([0-1][0-9])-([0-3][0-9]) ([0-5][0-9]):([0-5][0-9]):([0-5][0-9])(([\-\+]([0-1][0-9])\:00))?/;

์ฃผ์„์œผ๋กœ ์ •๊ทœํ‘œํ˜„์‹์ด ์–ด๋–ค ํฌ๋งท์„ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ์ž˜ ์„ค๋ช…ํ•ด ์ค€๋‹ค.

 

์˜๋„๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„

์ฃผ์„์€ ๊ฒฐ์ •์— ๊น”๋ฆฐ ์ €์ž์˜ ์˜๋„๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ์˜๋„๋Š” ์ฃผ๋กœ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์ด๋Ÿฐ ์ •๋ณด์— ํ•œํ•ด์„œ ์ฃผ์„์€ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค.

 

์˜๋ฏธ๋ฅผ ๋ช…๋ฃŒํ•˜๊ฒŒ ๋ฐํžˆ๋Š” ์ฃผ์„

๋ชจํ˜ธํ•œ ์ธ์ˆ˜๋‚˜ ๋ฐ˜ํ™˜๊ฐ’์˜ ์˜๋ฏธ๋ฅผ ์ฝ๊ธฐ ์ข‹๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

์ธ์ˆ˜๋‚˜ ๋ฐ˜ํ™˜๊ฐ’ ์ž์ฒด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ํž˜๋“  ์ฝ”๋“œ(ex. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ)๋ผ๋ฉด ์ฃผ์„์ด ์œ ์šฉํ•˜๋‹ค.

members.sort((a, b) => a.age - b.age) // ๋‚˜์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

โš ๏ธ ์ฃผ์˜ํ•  ์ : ์ฃผ์„์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†๋‹ค.

์ž˜๋ชป๋œ ์ฃผ์„์„ ๋‹ฌ์•„๋†“์„ ์œ„ํ—˜์ด ๋†’๋‹ค. ๋”ฐ๋ผ์„œ ์ฃผ์„๋ณด๋‹ค ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์—†๋Š”์ง€ ๊ณ ๋ฏผํ•˜๊ณ  ์ •ํ™•ํžˆ ๋‹ฌ๋„๋ก ๊ฐ๋ณ„ํžˆ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

๊ฒฐ๊ณผ๋ฅผ ๊ฒฝ๊ณ ํ•˜๋Š” ์ฃผ์„

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฝ๊ณ ํ•  ๋ชฉ์ ์œผ๋กœ ์ฃผ์„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// DOM์„ ์ฐธ์กฐํ•˜๋ฏ€๋กœ Server Side์—์„œ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
function changeBackgroundColor(color: string) {
    document.body.style.color = color
}

 

TODO ์ฃผ์„

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์— TODO ์ฃผ์„์„ ๋‚จ๊ธฐ๋ฉด ์œ ์šฉํ•˜๋‹ค.

  • ์•ž์œผ๋กœ ํ•  ์ผ
  • ๋‹น์žฅ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ
  • ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•œ ์ฝ”๋“œ
  • ๊ธฐํš์ด ์ถ”๊ฐ€๋จ์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์ฝ”๋“œ

๋Œ€๋‹ค์ˆ˜ IDE์—์„œ๋Š” TODO ์ฃผ์„์„ ํŠน๋ณ„ํ•œ ์ƒ‰์ƒ์œผ๋กœ ํ‘œ์‹œํ•ด ์ฃผ๊ฑฐ๋‚˜ ๋ชจ์•„์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์‰ฝ๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ๊ธฐ์ ์œผ๋กœ TODO ์ฃผ์„์„ ์ ๊ฒ€ํ•˜๊ณ  ์™„๋ฃŒ๋œ ๊ฒƒ์€ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” VSCode Extention: Todo Tree

 

์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ•˜๋Š” ์ฃผ์„

์ž์นซ ๋Œ€์ˆ˜๋กญ์ง€ ์•Š๋‹ค๊ณ  ์—ฌ๊ฒจ์งˆ ๋ญ”๊ฐ€์˜ ์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์„์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๊ณต๊ฐœ API์—์„œ JsDoc

๊ณต๊ฐœ API๋ฅผ ๊ตฌํ˜„ ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ›Œ๋ฅญํ•œ JsDoc์„ ์ž‘์„ฑํ•œ๋‹ค.

JsDoc์ด ์ž˜ ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋™์  ํƒ€์ž… ์–ธ์–ด์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํƒ€์ž…์— ๋Œ€ํ•œ ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ์ผ์— //@ts-check ์ฃผ์„์ด ์žˆ๋‹ค๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์ฒ˜๋Ÿผ ํƒ€์ž… ์ฒดํ‚น์„ ํ•ด์ค€๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ api๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

// @ts-check
/**
 *  @param a {number}
 *  @param b {number}
 *  @returns {number}
 */
const add = (a, b) => a + b;
add("2", 3) //Error: 'string' ํ˜•์‹์˜ ์ธ์ˆ˜๋Š” 'number' ํ˜•์‹์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ํ• ๋‹น๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ์—ฌ๋Š ์ฃผ์„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

๋‚˜์œ ์ฃผ์„

๋Œ€๋‹ค์ˆ˜ ์ฃผ์„์ด ์ด ๋ฒ”์ฃผ์— ์†ํ•œ๋‹ค.

  • ํ—ˆ์ˆ ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณ€๋ช…ํ•˜๋Š” ์ฃผ์„
  • ๋ฏธ์ˆ™ํ•œ ๊ฒฐ์ •์„ ํ•ฉ๋ฆฌํ™”ํ•˜๋Š” ์ฃผ์„
  • ์ฃผ์ ˆ๊ฑฐ๋ฆฌ๋Š” ๋…๋ฐฑ์— ๋ถˆ๊ณผํ•œ ์ฃผ์„

 

์ฃผ์ ˆ๊ฑฐ๋ฆฌ๋Š” ์ฃผ์„

  • ํŠน๋ณ„ํ•œ ์ด์œ  ์—†์ด ์˜๋ฌด๊ฐ ๋˜๋Š” ์ •ํ•ด์ง„ ํ”„๋กœ์„ธ์Šค ๋•Œ๋ฌธ์— ๋‹ค๋Š” ์ฃผ์„
  • ์ฃผ์„์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์–ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊นŒ์ง€ ๋’ค์ ธ์•ผ ํ•˜๋Š” ์ฃผ์„

๋…์ž์™€ ์ œ๋Œ€๋กœ ์†Œํ†ตํ•˜์ง€ ๋ชปํ•˜๋Š” ์ฃผ์„์€ ๋ฐ”์ดํŠธ๋งŒ ๋‚ญ๋น„ํ•  ๋ฟ์ด๋‹ค.

์ฃผ์„์„ ๋‹ฌ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„์„ ๋“ค์—ฌ ์ตœ๊ณ ์˜ ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•œ๋‹ค.

 

๊ฐ™์€ ์ด์•ผ๊ธฐ๋ฅผ ์ค‘๋ณตํ•˜๋Š” ์ฃผ์„

์ฝ”๋“œ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ์ค‘๋ณตํ•˜์—ฌ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„์„ ํ”ผํ•œ๋‹ค.

์ž์นซํ•˜๋ฉด ์ฝ”๋“œ๋ณด๋‹ค ์ฃผ์„์„ ์ฝ๋Š” ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

  • ์ฃผ์„์ด ์ฝ”๋“œ๋ณด๋‹ค ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ์ •๋‹นํ™”ํ•˜๋Š” ์ฃผ์„๋„ ์•„๋‹ˆ๊ณ , ์˜๋„๋‚˜ ๊ทผ๊ฑฐ๋ฅผ ์„ค๋ช…ํ•˜์ง€๋„ ์•Š๋Š”๋‹ค.
  • ์ฝ”๋“œ๋ณด๋‹ค ์ฝ๊ธฐ ์‰ฝ์ง€ ์•Š๋‹ค.
  • ์ฝ”๋“œ๋ณด๋‹ค ๋ถ€์ •ํ™•ํ•ด ๋…์ž๊ฐ€ ํ•จ์ˆ˜๋ฅผ ๋Œ€์ถฉ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒŒ ๋งŒ๋“ ๋‹ค.

 

์˜คํ•ดํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ์ฃผ์„

์˜๋„๋Š” ์ข‹์ง€๋งŒ ์—„๋ฐ€ํ•˜๊ฒŒ ์ฃผ์„์„ ๋‹ฌ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

// closed๊ฐ€ true์ผ ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
// ํƒ€์ž„์•„์›ƒ์— ๋„๋‹ฌํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค.
const setTimer = (timeoutMillies: number) => new Promise((resolve) => setTimeout(resolve, timeoutMillies))
async function waitForClose(timeoutMillies: number) {
  if(!closed) {
    await setTimer(timeoutMillies)
    if (!closed) throw new Error('MockResponseSender could not be closed.')
  }
}

์œ„ ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ์‹œ์ ์— ๋Œ€ํ•œ ์˜คํ•ด์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ฃผ์„์˜ ์‚ด์ง ์ž˜๋ชป๋œ ์ •๋ณด๋กœ ์ธํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ๊ฐ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿง‘‍๐Ÿ’ป: ‘closed๊ฐ€ true๋กœ ๋ณ€ํ•˜๋Š” ์ˆœ๊ฐ„์— ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ฒ ๊ตฌ๋‚˜’

์‹ค์ œ๋กœ๋Š” closed๊ฐ€ true์—ฌ์•ผ ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜๋œ๋‹ค. ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ฉด ๋ฌด์กฐ๊ฑด ํƒ€์ž„์•„์›ƒ์„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ closed๊ฐ€ ๊ทธ๋ž˜๋„ true๊ฐ€ ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค.

์ฃผ์„์— ๋Œ€ํ•œ ์˜คํ•ด ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ฝ”๋“œ๊ฐ€ ๋Š๋ฆฐ ์ด์œ ๋ฅผ ์ฐพ๋Š๋ผ ๊ณจ๋จธ๋ฆฌ๋ฅผ ์•“์„ ์ˆ˜ ์žˆ๋‹ค.

 

์˜๋ฌด์ ์œผ๋กœ ๋‹ค๋Š” ์ฃผ์„ / ์žˆ์œผ๋‚˜ ๋งˆ๋‚˜ ํ•œ ์ฃผ์„ / ๋ฌด์„œ์šด ์žก์Œ

๋ชจ๋“  ํ•จ์ˆ˜์— jsDoc๋ฅผ ๋‹ฌ๊ฑฐ๋‚˜ ๋ชจ๋“  ๋ณ€์ˆ˜์— ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์€ ์–ด๋ฆฌ์„๋‹ค.

// ๐Ÿ”ด Bad
/**
 * 
 * @param title CD ์ œ๋ชฉ
 * @param author CD ์ €์ž
 * @param tracks CD ํŠธ๋ž™ ์ˆซ์ž
 * @param durationInMinutes CD ๊ธธ์ด (๋‹จ์œ„: ๋ถ„) 
 */
function addCD(
  title: string,
  author: string,
  tracks: number,
  durationInMinutes: number
) {
  const cd: CD = {
    title,
    author,
    tracks,
    durationInMinutes,
  };
  cdList.push(cd);
}

์œ„์—์„œ ์‚ฌ์šฉ๋œ ์ฃผ์„์€ ์•„๋ฌด ๊ฐ€์น˜๊ฐ€ ์—†์œผ๋ฉฐ, ์˜คํžˆ๋ ค ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ํ˜ผ๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋„ˆ๋ฌด ๋‹น์—ฐํ•œ ์‚ฌ์‹ค์„ ์–ธ๊ธ‰ํ•˜๋ฉฐ ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•˜๋Š” ์ฃผ์„์ด๊ธฐ๋„ ํ•˜๋‹ค.

์ด๋Ÿฌํ•œ ์ฃผ์„์€,

  • ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์—ฌ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฃผ์„์„ ๋ฌด์‹œํ•˜๋Š” ์Šต๊ด€์— ๋น ์ง€๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • ๊ฒฐ๊ตญ์—” ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด์„œ ์ฃผ์„์€ ๊ฑฐ์ง“๋ง๋กœ ๋ณ€ํ•œ๋‹ค.

์˜๋ฏธ ์—†๋Š” JSDoc์€ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ž˜๋ชป๋œ ์š•์‹ฌ์œผ๋กœ ํƒ„์ƒํ•œ ์žก์Œ์ผ ๋ฟ์ด๋‹ค.

 

์†Œ์Šค ์ฝ”๋“œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์˜ ์—ญํ• ์„ ํ•˜๋Š” ์ฃผ์„

  1. ์ด๋ ฅ์„ ๊ธฐ๋กํ•˜๋Š” ์ฃผ์„
  2. ๊ณต๋กœ๋ฅผ ๋Œ๋ฆฌ๊ฑฐ๋‚˜ ์ €์ž๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ฃผ์„
  3. /* ํ•˜์˜์ด๊ฐ€ ์ถ”๊ฐ€ํ•จ */
  4. ์ฃผ์„์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ์ฝ”๋“œ๊ฒฐ๊ตญ ์“ธ๋ชจ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์ ์ฐจ ์Œ“์—ฌ๊ฐ€๊ฒŒ ๋œ๋‹ค.
  5. ๐Ÿง‘‍๐Ÿ’ป: ์ด์œ ๊ฐ€ ์žˆ์–ด์„œ ๋‚จ๊ฒจ๋†“์€ ๊ฑด๊ฐ€? ์ค‘์š”ํ•œ ๋‚ด์šฉ์ด๋ผ ์ง€์šฐ๋ฉด ์•ˆ ๋˜๋Š” ๊ฑด๊ฐ€? ์ฝ”๋“œ๋ฅผ ๊ธ‰๋ฐ•ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๋ ค์ฃผ๋ ค๋Š” ๊ฑด๊ฐ€?
  6. ์ฃผ์„์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ง€์šฐ๊ธฐ๋ฅผ ์ฃผ์ €ํ•œ๋‹ค.

์˜ค๋žซ๋™์•ˆ ์ฝ”๋“œ์— ๋ฐฉ์น˜๋œ ์ด๋Ÿฐ ์ฃผ์„์€ ์ ์ฐจ ๋ถ€์ •ํ™•ํ•˜๊ณ  ์“ธ๋ชจ์—†๋Š” ์ •๋ณด๋กœ ๋ณ€ํ•œ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ์šฐ๋ฆฌ๋ฅผ ๋Œ€์‹ ํ•ด ์ฝ”๋“œ๋ฅผ ๊ธฐ์–ตํ•ด ์ค€๋‹ค. ์žƒ์–ด๋ฒ„๋ฆด ์—ผ๋ ค๋Š” ๋ฒ„๋ฆฌ๊ณ  ์ฃผ์„์„ ์‚ญ์ œํ•˜๋ผ.

 

ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ฃผ์„์„ ๋‹ฌ์ง€ ๋งˆ๋ผ

// ๐Ÿ”ด Bad
// ์ „์—ญ ๋ชฉ๋ก smodule์— ์†ํ•˜๋Š” ๋ชจ๋“ˆ์ด ์šฐ๋ฆฌ๊ฐ€ ์†ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ์— ์กด์žฌํ•˜๋Š”๊ฐ€?
if (smodule.getDependSubsystems().contains(subSysMod.getSubSystem()))
// ๐ŸŸข Good
const moduleDependees = smodule.getDependSubsystems()
const ourSubSystem = subSysMod.getSubSystem()
if (moduleDependees.contains(ourSubSystem))

์ฃผ์„์ด ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ํŽธ์ด ๋” ์ข‹๋‹ค.

์ ์ ˆํ•œ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์„์„ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด์ž

 

์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ฃผ์„

// Actions ////////////////////////

์œ„์™€ ๊ฐ™์€ ๋ฐฐ๋„ˆ ์•„๋ž˜ ํŠน์ • ๊ธฐ๋Šฅ์„ ๋ชจ์•„๋†“์œผ๋ฉด ์œ ์šฉํ•œ ๊ฒฝ์šฐ๋„ ๋“œ๋ฌผ๊ฒŒ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€๋…์„ฑ๋งŒ ๋‚ฎ์ถ”๋ฏ€๋กœ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. (ํŠนํžˆ ๋’ท๋ถ€๋ถ„ ์Šฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€๋Š” ์žก์Œ)

๋„ˆ๋ฌด ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฐฐ๋„ˆ๋Š” ๋ˆˆ์— ๋„๋ฉฐ ์ฃผ์˜๋ฅผ ํ™˜๊ธฐํ•œ๋‹ค.

  • ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๋ผ
  • ์•„์ฃผ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉํ•˜๋ผ
  • ๋ฐฐ๋„ˆ๋ฅผ ๋‚จ์šฉํ•˜๋ฉด ๋…์ž๊ฐ€ ์žก์Œ์œผ๋กœ ์—ฌ๊ฒจ ๋ฌด์‹œํ•œ๋‹ค

 

๋‹ซ๋Š” ๊ด„ํ˜ธ์— ๋‹ค๋Š” ์ฃผ์„

์ค‘์ฒฉ์ด ์‹ฌํ•˜๊ณ  ์žฅํ™ฉํ•œ ํ•จ์ˆ˜๋ผ๋ฉด ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ,

์ด๋Ÿฐ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ๋” ์ž‘๊ฒŒ ๋งŒ๋“ค๊ณ  ์บก์Šํ™”ํ•˜๋„๋ก ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค.

// ๐Ÿ”ด Bad
const main = () => {
    try {
        while(){
            ...
      } // while
    } // try
    catch(e) {
    ...
    } // catch
} // main

 

์ „์—ญ ์ •๋ณด

์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•œ๋‹ค๋ฉด ๊ทผ์ฒ˜์— ์žˆ๋Š” ์ฝ”๋“œ๋งŒ ๊ธฐ์ˆ ํ•˜๋ผ

์ฝ”๋“œ ์ผ๋ถ€์— ์ฃผ์„์„ ๋‹ฌ๋ฉด์„œ ์‹œ์Šคํ…œ์˜ ์ „์—ญ ์ •๋ณด๋‚˜ ๋‹ค๋ฅธ ์ฝ”๋“œ์— ์˜์กด์ ์ธ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ ํ•˜์ง€ ๋งˆ๋ผ

// ๐Ÿ”ด Bad
/** ์ ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ํฌํŠธ: ๊ธฐ๋ณธ๊ฐ’์€ 8082 **/
function setFitnessPort(fitnessPort: number) {
    ...
}

setFitnessPort ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ํ†ต์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํฌํŠธ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณ€ํ•ด๋„ ํ•ด๋‹น ์ฃผ์„์ด ๋ณ€ํ•˜๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์€ ์ „ํ˜€ ์—†๋‹ค.

๊ฒฐ๊ตญ ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ํฌ๋‹ค.

 

๋น„๊ณต๊ฐœ ์ฝ”๋“œ์—์„œ JSDoc

๊ณต๊ฐœ API๋Š” JSDoc์ด ์œ ์šฉํ•˜์ง€๋งŒ, ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค.

์œ ์šฉํ•˜์ง€๋„ ์•Š๊ณ  JSDoc์˜ ์ž‘์„ฑ ํ˜•์‹์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ๋งŒ ์‚ฐ๋งŒํ•ด์ง„๋‹ค.

 

์˜ˆ์ œ

์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ด๋‹ค. ๋ฆฌํŒฉํ† ๋ง ์ „๊ณผ ํ›„๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ํด๋ฆฐ์ฝ”๋“œ๊ฐ€ ์ฃผ์„์„ ์–ด๋–ป๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์ž.

/* 4-7 generatePrimes.ts */
export default function generatePrimes(maxValue: number) {
  if (maxValue >= 2) {
    // ์œ ์ผํ•˜๊ฒŒ ์œ ํšจํ•œ ๊ฒฝ์šฐ
    // ์„ ์–ธ
    const s = maxValue + 1; // ๋ฐฐ์—ด ํฌ๊ธฐ
    const f: boolean[] = new Array(s).fill(true); // ๋ฐฐ์—ด์„ true๋กœ ์ดˆ๊ธฐํ™”

    // ์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์•Œ๋ ค์ง„ ์ˆซ์ž๋ฅผ ์ œ๊ฑฐ
    f[0] = false;
    f[1] = false

    //์ฒด
    for (let i = 2; i < Math.sqrt(s) + 1; i++) {
      if (f[i]) {
        // i๊ฐ€ ๋‚จ์•„ ์žˆ๋Š” ์ˆซ์ž๋ผ๋ฉด ์ด ์ˆซ์ž์˜ ๋ฐฐ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.
        for (let j = 2 * i; j < s; j += i) {
          f[j] = false; // ๋ฐฐ์ˆ˜๋Š” ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค
        }
      }
    }

        // ์†Œ์ˆ˜๋ฅผ ๊ฒฐ๊ณผ ๋ฐฐ์—ด๋กœ ์ด๋™ํ•œ๋‹ค
    const primes: number[] = [];
    for (let i = 0; i < s; i++) {
      if (f[i]) primes.push(i);
    }

    return primes;
  } else {
    // maxValue < 2
    return []; // ์ž…๋ ฅ์ด ์ž˜๋ชป๋˜๋ฉด ๋น„์–ด ์žˆ๋Š” ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  }
}
/* 4-8 generatePrimes.ts (๋ฆฌํŒฉํ† ๋ง ๋ฒ„์ „) */
let crossedOut: boolean[]
export default function generatePrimes(maxValue: number) {
  if (maxValue < 2) {
    return [];
  } else {
    crossedOut = uncrossIntegerUpTo(maxValue);
    crossOutMultiples();
    const result = putUncrossedIntegersIntoResult();
    return result;
  }
}

function uncrossIntegerUpTo(maxValue: number) {
  const crossedOut = new Array(maxValue + 1).fill(false, 2);
  return crossedOut;
}

function crossOutMultiples() {
  const limit = determineIterationLimit();
  for (let i = 2; i <= limit; i++) {
    if (notCrossed(i)) crossOutMultiplesOf(i);
  }
}

function determineIterationLimit() {
  // ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐฐ์ˆ˜๋Š” ๋ฐฐ์—ด ํฌ๊ธฐ์˜ ์ œ๊ณฑ๊ทผ๋ณด๋‹ค ์ž‘์€ ์†Œ์ˆ˜์˜ ์ธ์ˆ˜๋‹ค
  // ๋”ฐ๋ผ์„œ ์ด ์ œ๊ณฑ๊ทผ๋ณด๋‹ค ๋” ํฐ ์ˆซ์ž์˜ ๋ฐฐ์ˆ˜๋Š” ์ œ๊ฑฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  const iterationLimit = Math.sqrt(crossedOut.length);
  return iterationLimit;
}

function crossOutMultiplesOf(i: number) {
  for (let multiple = 2 * i; multiple < crossedOut.length; multiple += i) {
    crossedOut[multiple] = true;
  }
}

function notCrossed(i: number) {
  return crossedOut[i] === false;
}

function putUncrossedIntegersIntoResult() {
  const result: number[] = []
  for (let i = 2; i < crossedOut.length; i++) {
    if (notCrossed(i)) result.push(i);
  }
  return result
}

๋งˆ๋ฌด๋ฆฌ

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

ํ•˜์ง€๋งŒ ์ฃผ์„์— ๋„ˆ๋ฌด ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค. ์ฃผ์„์€ ์–ด๋–ค ํˆด๋กœ๋„ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ์˜คํžˆ๋ ค ์˜คํ•ด์™€ ํ˜ผ๋™์„ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ์€ ์ฃผ์„์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ. ์ฃผ์„์ด ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ๊น”๋”ํ•œ ์ฝ”๋“œ ๊ตฌ์กฐ์™€ ๋ช…ํ™•ํ•œ ๋„ค์ด๋ฐ์œผ๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์„๋ณด๋‹จ ํด๋ฆฐ์ฝ”๋“œ!