Skip to content

Latest commit

ย 

History

History
122 lines (97 loc) ยท 7.85 KB

File metadata and controls

122 lines (97 loc) ยท 7.85 KB

๊ณผ์ œ ์„ค๋ช…

  • thecatapi์—์„œ ํฌ๋กค๋ง ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ์›€์งค์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ
  • ES6 class ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฒ ์ด์Šค ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ์Œ
  • ํ•ด๋‹น ์ฝ”๋“œ์—๋Š” ์ž ์žฌ์ ์ธ ์˜ค๋ฅ˜๋“ค์ด ์žˆ์Œ
  • ํ•ด๋‹น ์ฝ”๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋‚˜์—ด
  • ํ•ด๊ฒฐํ•œ ์ž ์žฌ์  ์˜ค๋ฅ˜์™€ ํ•ด๊ฒฐํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฑ„์ 

์‹คํ–‰๋ฒ•

  • backend ํด๋” ์œ„์น˜์—์„œ "npm install" ๋ช…๋ น์–ด๋กœ node_modules ์„ค์น˜
  • data.json์ด ์—†๋Š” ๊ฒฝ์šฐ backend ํด๋”๋กœ ์ด๋™ํ•œ ๋’ค npm run crawling์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•ด์•ผํ•จ
  • ์ดํ›„ node app.js ์‹คํ–‰
  • ์ดํ›„ frontend/index.html ์„ ๋ธŒ๋ผ์šฐ์ €๋กœ ์—ด๋ฉด ์‹คํ–‰ ๋จ
    • ํ˜น์€ frontend ํด๋”์—์„œ npm start ์ž…๋ ฅ
    • ํŠน์ • ํ‚ค์›Œ๋“œ๋งŒ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ, ex) ์•„๋ฉ”๋ฆฌ์นธ ์ˆํ—ค์–ด

๊ฒ€ํ† ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ

  • ์ฝ”๋“œ์— ์˜ค๋ฅ˜๋ฅผ ์–ผ๋งˆ๋‚˜ ์‹ฌ์„ ๊ฒƒ์ธ์ง€
  • ๋น„๊ต์  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ตœ์‹  ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•ด์„œ ๋„ฃ์„์ง€ ๋ง์ง€
    • async, await์™€ module ๊ฐ™์€ ๊ฒฝ์šฐ
    • ์–ด์ฐจํ”ผ ๋ณด๋„ˆ์Šค ๋ฌธ์ œ๋‹ˆ๊นŒ ์ƒ๊ด€ ์—†์„ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•จ
  • API์—์„œ ์•ฝ 5%์˜ ํ™•๋ฅ ๋กœ ์—๋Ÿฌ๋ฅผ ๋‚ด๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒŒ ์ข‹์„ ๋“ฏ ํ•จ
    • ๊ทธ๋ƒฅ rand ๊ตด๋ ค์„œ 5%์— ํ•ด๋‹นํ•˜๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ
    • ์—๋Ÿฌ ๊ด€๋ จ ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด ๋ณด๊ธฐ ์œ„ํ•จ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์š”๊ตฌ์‚ฌํ•ญ์— ๋„ฃ์„์ง€๊ฐ€ ๊ณ ๋ฏผ
  • ๊ธฐ๋ณธ ์Šคํƒ€์ผ๋ง์„ ์–ด๋””๊นŒ์ง€ ์ œ๊ณตํ•  ๊ฒƒ์ธ๊ฐ€
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ธก์— backend app์„ ๋„์šด ํ›„, ์–ด๋А์ •๋„์˜ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ๋‚ดํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.
    • ์•„ํ‹ธ๋Ÿฌ๋ฆฌ ๊ฐ™์€ ๊ฒƒ์„ ์จ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๊ณ , ์ด ๋ถ€๋ถ„์€ ์ œํ”„๋ฆฌ๊ฐ€ ํ•ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ์–ด์„œ ์ž˜ ์•Œ ๊ฒƒ ๊ฐ™์Œ
  • CSS ๋ฌธ์ œ๋ฅผ ๋„ฃ์„ ๊ฒƒ์ธ๊ฐ€?
    • ์ง€๊ธˆ์€ ๋ฌด์กฐ๊ฑด 2์—ด๋กœ ๋‚˜์˜ค๊ณ  ์žˆ๋Š”๋ฐ, ๊ฐ€๋ น ๋ชจ๋ฐ”์ผ ์‚ฌ์ด์ฆˆ์ธ ๊ฒฝ์šฐ 1์—ด๋กœ ๋‚˜์˜ค๊ฒŒ ํ•˜๊ธฐ

๊ณผ์ œ ๋‚ด์šฉ

์ฃผ์ œ(์‹œ๋‚˜๋ฆฌ์˜ค)

๊ณ ์–‘์ด๋ฅผ ์ข‹์•„ํ•˜๋Š” ๋‹น์‹ ์€ ๊ณ ์–‘์ด ์‚ฌ์ง„ ์ „์šฉ ๊ฒ€์ƒ‰ ์›น์‚ฌ์ดํŠธ๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ํ˜ผ์ž ์†Œ์†Œํ•˜๊ฒŒ ์šด์˜ํ•ด์™”๋Š”๋ฐ, ์ƒ๊ฐ๋ณด๋‹ค ๊ณ ์–‘์ด ์‚ฌ์ง„์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์•„์ง€๋ฉด์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ๋“ค์ด ํ•˜๋‚˜์”ฉ ๋“œ๋Ÿฌ๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ์–ด์š”. ๋ช‡ ๊ฐœ์˜ ๋ฌธ์ œ๋Š” ๊ธˆ์„ธ ๊ณ ์น  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ๋ด์•ผ๋งŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค๋„ ์žˆ์–ด์„œ ์กฐ๊ธˆ ๊ณจ์น˜์•„ํ”ˆ ์ƒํ™ฉ! ์‹ฌ์ง€์–ด ์ตœ๋Œ€ 4์‹œ๊ฐ„ ๋‚ด์— ์ˆ˜์ •ํ•œ ๋’ค ๋ฐฐํฌ๋ฅผ ํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด๋ผ๋ฉด ๊ธฐ์กด ์„œ๋น„์Šค์˜ ์—ฌ๋Ÿฌ ๋ฒ„๊ทธ๋ฅผ ์ œํ•œ์‹œ๊ฐ„ ๋‚ด์— ๊ณ ์น˜๊ณ , ์œ ์ €๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๊นŒ์ง€ ๊ตฌํ˜„ํ•ด๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”? ๋„์ „ํ•ด๋ณด์„ธ์š”!

๊ณผ์ œ ์„ค๋ช…

  • thecatapi ์—์„œ ํฌ๋กค๋งํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ด๋ฏธ์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฒ ์ด์Šค ์ฝ”๋“œ๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
  • ๋ฒ ์ด์Šค ์ฝ”๋“œ๋Š” ๋ชจ๋‘ ES6 ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด ์ฝ”๋“œ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฒ„๊ทธ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์š”๊ตฌ์‚ฌํ•ญ์„ ์ž˜ ์ฝ๊ณ , ๋ฒ„๊ทธ๋ฅผ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด์ฃผ์„ธ์š”.

์ˆ˜ํ–‰ ๊ธฐ์ˆ 

  • JavaScript(ES6)
  • ์„ค์น˜๋˜์–ด์žˆ๋Š” ๋ชจ๋“ˆ(node_modules) ์™ธ์— ๋‹ค๋ฅธ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด jQuery, Webpack, Lodash, Axios, Angular, React, Vue, Immutable-js, Ramda ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ

์ฐธ๊ณ  ์š”๊ตฌ์‚ฌํ•ญ์˜ ์ˆœ์„œ๋Š” ๋‚œ์ด๋„์™€ ์ƒ๊ด€์ด ์—†์Œ

HTML, CSS ๊ด€๋ จ

  • ํ˜„์žฌ HTML ์ฝ”๋“œ๊ฐ€ ์ „์ฒด์ ์œผ๋กœ <div> ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋งˆํฌ์—…์„ ์‹œ๋งจํ‹ฑํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ์ €๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋””๋ฐ”์ด์Šค์˜ ๊ฐ€๋กœ ๊ธธ์ด์— ๋”ฐ๋ผ ๊ฒ€์ƒ‰๊ฒฐ๊ณผ์˜ row ๋‹น column ๊ฐฏ์ˆ˜๋ฅผ ์ ์ ˆํžˆ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • 992px ์ดํ•˜: 3๊ฐœ
    • 768px ์ดํ•˜: 2๊ฐœ
    • 576px ์ดํ•˜: 1๊ฐœ
  • ๋‹คํฌ ๋ชจ๋“œ(Dark mode)๋ฅผ ์ง€์›ํ•˜๋„๋ก CSS๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • CSS ํŒŒ์ผ ๋‚ด์˜ ๋‹คํฌ ๋ชจ๋“œ ๊ด€๋ จ ์ฃผ์„์„ ์ œ๊ฑฐํ•œ ๋’ค ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ชจ๋“  ๊ธ€์ž ์ƒ‰์ƒ์€ #FFFFFF , ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์€ #000000 ๋กœ ํ•œ์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” OS์˜ ๋‹คํฌ๋ชจ๋“œ์˜ ํ™œ์„ฑํ™” ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋˜, ์œ ์ €๊ฐ€ ํ…Œ๋งˆ๋ฅผ ํ† ๊ธ€๋ง ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ขŒ์ธก ์ƒ๋‹จ์— ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ† ๊ธ€ํ•˜๋Š” ์ฒดํฌ๋ฐ•์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ƒ์„ธ ๋ณด๊ธฐ ๋ชจ๋‹ฌ ๊ด€๋ จ

  • ๋””๋ฐ”์ด์Šค ๊ฐ€๋กœ ๊ธธ์ด๊ฐ€ 768px ์ดํ•˜์ธ ๊ฒฝ์šฐ, ๋ชจ๋‹ฌ์˜ ๊ฐ€๋กœ ๊ธธ์ด๋ฅผ ๋””๋ฐ”์ด์Šค ๊ฐ€๋กœ ๊ธธ์ด๋งŒํผ ๋Š˜๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜ ์ด๋ฏธ์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•œ ํ›„ ๊ฒฐ๊ณผ๋กœ ์ฃผ์–ด์ง„ ์ด๋ฏธ์ง€๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ชจ๋‹ฌ์ด ๋œจ๋Š”๋ฐ, ๋ชจ๋‹ฌ ์˜์—ญ ๋ฐ–์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ / ํ‚ค๋ณด๋“œ์˜ ESC ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ / ๋ชจ๋‹ฌ ์šฐ์ธก์˜ ๋‹ซ๊ธฐ(x) ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋‹ซํžˆ๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋‹ฌ์—์„œ ๊ณ ์–‘์ด์˜ ์„ฑ๊ฒฉ, ํƒœ์ƒ ์ •๋ณด๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ •๋ณด๋Š” /cats/:id ๋ฅผ ํ†ตํ•ด ๋ถˆ๋Ÿฌ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ํŽ˜์ด์ง€ ๊ด€๋ จ

  • ํŽ˜์ด์ง€ ์ง„์ž… ์‹œ ํฌ์ปค์Šค๊ฐ€ input ์— ๊ฐ€๋„๋ก ์ฒ˜๋ฆฌํ•˜๊ณ , ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•œ ์ƒํƒœ์—์„œ input ์„ ํด๋ฆญํ•  ์‹œ์—๋Š” ๊ธฐ์กด์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋˜ ํ‚ค์›Œ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ผ ๋•Œ, ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž„์„ ์œ ์ €์—๊ฒŒ ์•Œ๋ฆฌ๋Š” UI๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ์œ ์ €๊ฐ€ ๋ถˆํŽธํ•จ์„ ๋А๋ผ์ง€ ์•Š๋„๋ก UI์ ์ธ ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ๊ทผ ๊ฒ€์ƒ‰ํ•œ ํ‚ค์›Œ๋“œ๋ฅผ SearchInput ์•„๋ž˜์— ํ‘œ์‹œ๋˜๋„๋ก ๋งŒ๋“ค๊ณ , ํ•ด๋‹น ์˜์—ญ์— ํ‘œ์‹œ๋œ ํŠน์ • ํ‚ค์›Œ๋“œ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๊ทธ ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰์ด ์ผ์–ด๋‚˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹จ, ๊ฐ€์žฅ ์ตœ๊ทผ์— ๊ฒ€์ƒ‰ํ•œ 5๊ฐœ์˜ ํ‚ค์›Œ๋“œ๋งŒ ๋…ธ์ถœ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•ด๋„ ๋งˆ์ง€๋ง‰ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํ™”๋ฉด์ด ์œ ์ง€๋˜๋„๋ก ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜ SearchInput ์˜†์— ๋ฒ„ํŠผ์„ ํ•˜๋‚˜ ๋ฐฐ์น˜ํ•˜๊ณ , ์ด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ์‹œ /api/cats/random ์„ ํ˜ธ์ถœํ•˜์—ฌ ํ™”๋ฉด์— ๋ฟŒ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์˜ ์ด๋ฆ„์€ ๋งˆ์Œ๋Œ€๋กœ ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • lazy load ๊ฐœ๋…์„ ์ด์šฉํ•˜์—ฌ, ์ด๋ฏธ์ง€๊ฐ€ ํ™”๋ฉด์— ๋ณด์—ฌ์•ผ ํ•  ์‹œ์ ์— load ๋˜๋„๋ก ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋กค ํŽ˜์ด์ง• ๊ตฌํ˜„

  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํ™”๋ฉด์—์„œ ์œ ์ €๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์Šคํฌ๋กค ๋ฐ”๋ฅผ ๋๊นŒ์ง€ ์ด๋™์‹œ์ผฐ์„ ๊ฒฝ์šฐ, ๊ทธ ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋”ฉํ•˜๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ๊ตฌ์กฐ ๊ด€๋ จ

  • ES6 module ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    • webpack , parcel ๊ณผ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์ฃผ์„ธ์š”.
    • ํ•ด๋‹น ์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•ด์„œ๋Š” http-server ๋ชจ๋“ˆ์„(๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ๋„์šฐ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) ํ†ตํ•ด index.html ์„ ๋„์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • API fetch ์ฝ”๋“œ๋ฅผ async , await ๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”. ํ•ด๋‹น ์ฝ”๋“œ๋“ค์€ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์„ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด์„œ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜ API ์˜ status code ์— ๋”ฐ๋ผ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
  const request = async (url: string) => {
    try {
      const result = await fetch(url);
      return result.json();
    } catch (e) {
      console.warn(e);
    }
  }

  const api = {
    fetchGif: keyword => {
      return request(`${API_ENDPOINT}/api/gif/search?q=${keyword}`);
    },
    fetchGifAll: () => {
      return request(`${API_ENDPOINT}/api/gif/all`);
    }
  };
  • SearchResult ์— ๊ฐ ์•„์ดํ…œ์„ ํด๋ฆญํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ Event Delegation ๊ธฐ๋ฒ•์„ ์ด์šฉํ•ด ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.
  • ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ํ•จ์ˆ˜๋“ค์ด๋‚˜ Util ํ•จ์ˆ˜๋“ค์„ ์ž‘๊ฒŒ ์ž˜ ๋‚˜๋ˆ„์–ด์ฃผ์„ธ์š”.

ํ…Œ์ŠคํŠธ ๊ด€๋ จ(๊ฐ€์‚ฐ์  ์š”์†Œ)

  • Test suite์™€ ๊ฐ test ์˜ ๋ชฉ์ ์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ธฐ์ˆ ํ•ด์ฃผ์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด,
isNumber test (x)
isNumber ํ•จ์ˆ˜๋Š” number type ์˜ argument ๋ฅผ ๋ฐ›์œผ๋ฉด True ๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. (o)
  • ๊ฐ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์ด๋‚˜, Util ํ•จ์ˆ˜๋“ค์„ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด๋ฌธ์ด ์žˆ๋Š” ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ, edge case์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋‚ด์—์„œ ๊ฐ ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ life cycle ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ด€๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.