- thecatapi์์ ํฌ๋กค๋ง ๋ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ์์งค์ ๊ฒ์ํ๋ ๊ฐ๋จํ ์ฝ๋
- ES6 class ๊ธฐ๋ฐ์ผ๋ก ๋ฒ ์ด์ค ์ฝ๋๊ฐ ์์ฑ๋์ด ์์
- ํด๋น ์ฝ๋์๋ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ค์ด ์์
- ํด๋น ์ฝ๋ ๊ธฐ๋ฐ์ผ๋ก ์๊ตฌ์ฌํญ์ ๋์ด
- ํด๊ฒฐํ ์ ์ฌ์ ์ค๋ฅ์ ํด๊ฒฐํ ์๊ตฌ์ฌํญ์ ๊ธฐ๋ฐ์ผ๋ก ์ฑ์
- backend ํด๋ ์์น์์ "npm install" ๋ช ๋ น์ด๋ก node_modules ์ค์น
- data.json์ด ์๋ ๊ฒฝ์ฐ backend ํด๋๋ก ์ด๋ํ ๋ค
npm run crawling์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์์ฑํด์ผํจ - ์ดํ
node app.js์คํ - ์ดํ frontend/index.html ์ ๋ธ๋ผ์ฐ์ ๋ก ์ด๋ฉด ์คํ ๋จ
- ํน์ frontend ํด๋์์
npm start์ ๋ ฅ - ํน์ ํค์๋๋ง ๊ฒ์ ๊ฐ๋ฅ, ex) ์๋ฉ๋ฆฌ์นธ ์ํค์ด
- ํน์ frontend ํด๋์์
- ์ฝ๋์ ์ค๋ฅ๋ฅผ ์ผ๋ง๋ ์ฌ์ ๊ฒ์ธ์ง
- ๋น๊ต์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ต์ ๊ธฐ๋ฅ๋ค์ ๋ํด์ ๋ฃ์์ง ๋ง์ง
- 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 ์ฝ๋๊ฐ ์ ์ฒด์ ์ผ๋ก
<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 ํจ์๋ฅผ ์ด์ฉํด ๊ด๋ฆฌํ๋๋ก ํฉ๋๋ค.