Intro
์ค๋์ ๊ณ ์์ด ์ฌ์ง ๊ฒ์ ์ค์ต์ ๋ํ ๊ฐ๋จํ ๋ฆฌํฉํ ๋ง์ ํ์ตํ๋ค.
๋ชจ์ ํ ์คํธ๋ฅผ ํ๋ผ๊ณ ํ๋๋ฐ ๊ฐ์๋ฅผ ๋ค ๋ค์ด์ผ ํ ์ ์์ ๊ฒ ๊ฐ์์ ๊ณ์ ๋ฏธ๋ฃจ๊ณ ์๋ ์ค์ด๋ค ใ ,,,
์ค๋ ํ์ตํ ๋ด์ฉ
: api, ๋ชจ๋ํ, ๊ธฐํ ๋ฆฌํฉํ ๋ง
๐ฉ๐ป async-await ๋์
API fetch ์ฝ๋๋ฅผ async , await ๋ฌธ์ ์ด์ฉํ์ฌ ์์ ํด์ฃผ์ธ์. ํด๋น ์ฝ๋๋ค์ ์๋ฌ๊ฐ ๋ฌ์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ ์ ์ ํ ์ฒ๋ฆฌ๊ฐ ๋์ด์์ด์ผ ํฉ๋๋ค.
๐ฉ๐ป api ์์ฒญ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
API ์ status code ์ ๋ฐ๋ผ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ถ๋ฆฌํ์ฌ ์์ฑํด์ผ ํฉ๋๋ค.
async-await
๊ธฐ์กด ์ฝ๋์์ api ํธ์ถ ์์ ์๋ฐ์คํฌ๋ฆฝํธ์ fetch-then์ ํตํด api๋ฅผ ํธ์ถํ์๋๋ฐ fetch-then๋ณด๋ค ๊ฐ๋ ์ฑ์ด ์ข์ async-await ๋ฌธ๋ฒ์ ์ด์ฉํด ์ฝ๋๋ฅผ ๊ฐ์ ํ์๋ค.
- fetch-then
const result = () => {
return fetch(url).then((res) => res.json());
}
- async-await
const request = async url => {
return await fetch(url);
}
์ถ๊ฐ๋ก, try-catch๋ฌธ์ ์ฌ์ฉํด ์๋ฌ ํธ๋ค๋ง์ ํ์๋ค.
const request = async (url) => {
try {
const result = await fetch(url);
if (result.status === 200) {
return result.json();
} else throw REQUEST_ERROR[result.status];
} catch (err) {
alert(err.msg);
return { data: null };
}
};
๐ฉ๐ป ES6, import, export
ES6 module ํํ๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. webpack , parcel ๊ณผ ๊ฐ์ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ง ๋ง์์ฃผ์ธ์. ํด๋น ์ฝ๋ ์คํ์ ์ํด์๋ http-server ๋ชจ๋์(๋ก์ปฌ ์๋ฒ๋ฅผ ๋์ฐ๋ ๋ค๋ฅธ ๋ชจ๋๋ ์ฌ์ฉ ๊ฐ๋ฅ) ํตํด index.html ์ ๋์์ผ ํฉ๋๋ค.
import/export
<body>
<div id="App"></div>
<script src="src/utils/validator.js"></script>
<script src="src/api.js"></script>
<script src="src/ImageInfo.js"></script>
<script src="src/SearchInput.js"></script>
<script src="src/DarkModeToggle.js"></script>
<script src="src/Loading.js"></script>
<script src="src/KeywordHistory.js"></script>
<script src="src/SearchResult.js"></script>
<script src="src/App.js"></script>
<script src="src/main.js"></script>
</body>
import/export๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ฝ๋๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด์ script ํ๊ทธ๋ก index.html์ ํธ์ถํ์ด์ผ ํ๋ค.
<div id="App"></div>
<script type="module" src="src/main.js"></script>
ES6์์ ์๋กญ๊ฒ ๋์ ๋ import/export๋ฅผ ์ฌ์ฉํด main.js๋ App.js์ ํด๋์ค ์ปดํฌ๋ํธ๋ค์ exportํ์ฌ ์ต์ข ์ ์ผ๋ก index.html์๋ main.js๋ง ํธ์ถํ ์ ์๋๋ก ๊ตฌํํ๋ค.
์ค์ํ ๊ฑด type="module" ์์ฑ์ ๊ผญ ๋ฃ์ด์ค์ผ ํ๋ค.
- main.js
import App from './App.js';
new App(document.querySelector('#App'));
- App.js
import Loading from './Loading.js';
import DarkModeToggle from './DarkModeToggle.js';
import ImageInfo from './ImageInfo.js';
import SearchInput from './SearchInput.js';
import SearchResult from './SearchResult.js';
import api from './api.js';
class App {
...
}
export default App
๊ธฐํ ๋ฆฌํฉํ ๋ง
์ต๊ทผ ๊ฒ์ํ ํค์๋๋ฅผ SearchInput ์๋์ ํ์๋๋๋ก ๋ง๋ค๊ณ , ํด๋น ์์ญ์ ํ์๋ ํน์ ํค์๋๋ฅผ ๋๋ฅด๋ฉด ๊ทธ ํค์๋๋ก ๊ฒ์์ด ์ผ์ด๋๋๋ก ๋ง๋ญ๋๋ค.
๋จ, ๊ฐ์ฅ ์ต๊ทผ์ ๊ฒ์ํ 5๊ฐ์ ํค์๋๋ง ๋ ธ์ถ๋๋๋ก ํฉ๋๋ค.
Set
๊ณ ์ ํ ๊ฐ์ ์ ์ฅํ ์ ์๋ ์๋ฃ๊ตฌ์กฐ์ธ Set์ ์ฌ์ฉํ์ฌ ์ต๊ทผ์ ๊ฒ์ํ 5๊ฐ์ ํค์๋์์ ์ค๋ณต๋ ๊ฒ์์ด๋ฅผ ์ ๊ฑฐํ๋ ๋ฆฌํฉํ ๋ง์ ์งํํ๋ค.
Array.from(new Set(list))
new Set์ผ๋ก Set ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ๋ฐฐ์ด๋ก ๋ณํํ๋ ๋ฉ์๋์ธ Array.from์ ์ฌ์ฉํด ๋ฐฐ์ด์ ๋ฐํํ๋ค.
๋ง๋ฌด๋ฆฌ
์ค์ต์ ์งํํด๋ณด๋ ์์ผ๋ก ํ๋ก์ ํธ ํ ๋ ์ด๋ป๊ฒ ๊ฐ๋ฐํด์ผ ํ ์ง ๋ฐฉํฅ์ด ์ด๋์ ๋ ์กํ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์์์ ๊ฐ์ฌ๋์ด ์๋ ค์ฃผ์ ์ฝ๋ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๋๋ก ์ฝ๋๋ฅผ ์งค ๋ console.log๋ฅผ ์ฐ์ด๋ณด๋ฉฐ ๋ฐ์ดํฐ๊ฐ ์ ๋ค์ด์ค๋์ง ํ์ธํด๋ณด๋ฉด์ ์ฝ๋๋ฅผ ์ง๋ ์ด๋์๋ถํฐ ์๋ชป๋๋์ง ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ์ ์๊ฐ์ ๋จ์ถํ ์ ์์๋ค.
