๊ฐ์
๋ฏธ์ | ๊ธฐ๊ฐ | Repository | PR & Review | github page |
---|---|---|---|---|
์ํ ๋ฆฌ๋ทฐ 1๋จ๊ณ | 23-03-14 - 23-03-16 |
Repo | PR Review | ๐ฌ ์ํ ๋ฆฌ๋ทฐ |
๐ ๋ฏธ์ ํ๊ณ
๋๋์ด ๋ง์ง๋ง ๋ฏธ์ ์ด ์์๋์๋ค. ์ง๊ธ๊น์ง ์๊ฐ์ด ์ด๋ป๊ฒ ํ๋ฌ๊ฐ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค. ํ๋ฃจํ๋ฃจ๊ฐ ๋๋ฌด ๋น ๋ฅด๊ณ ์ผ์ฃผ์ผ์ ๊ธ๋ฐฉ ์ง๋๊ฐ๋ค. ๋ฒ์จ ๋ง์ง๋ง ๋ฏธ์ ์ด๋ผ๋ ๊ฒ์ด ์์ฌ์ ๋ค. ๋ฌผ๋ก ๋ ๋ฒจ 2์ ๊ฐ๋ฉด ๋ ๋ค๋ฅธ ๋ฏธ์ ์ด ๊ธฐ๋ค๋ฆฌ๊ณ ์์ง๋ง ๋น ๋ฅด๊ฒ ํ๋ฌ๊ฐ๋ ์๊ฐ์ ์ ์ํ๊ฒ๋ง ๋๊ปด์ง๋ค.
์ํ ๋ฆฌ๋ทฐ 1๋จ๊ณ ๋ฏธ์ ์ ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- API ์ฐ๋์ ์ํ ํ ์คํธ ํ๊ฒฝ ๊ฒฝํ
- ์ค์ ๋์ํ๋ API๋ฅผ ํตํ ๋น๋๊ธฐ ํต์
- UX ๊ฒฝํ ๊ฐ์ ์ ์ํ
๋ ๋ณด๊ธฐ
(ํ์ด์ง) ๊ตฌํ - ์ญํ ๊ณผ ์ฑ ์์ ๋ฐ๋ผ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ ๋ง์ง๋ง ๊ธฐํ
์์ผ๋ก ์ค์ ํ์
์ ๋๊ฐ์ ๋ฐฑ์๋๊ณผ์ ํ์
์ ํตํด ์นํ์ด์ง๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ํ๋ก ํธ์๋์ ์
์ฅ์์ API์ ํต์ ์ ํ์๋ผ๊ณ ๋ณธ๋ค. ์ด๋ฅผ ์ํ ๋ฏธ์
์ด ๋ฐ๋ก ์ํ ๋ฆฌ๋ทฐ์๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ณ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ์ฌ์ฉ์์๊ฒ ์น์ ํ UI๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. UI๋ฅผ ๋ง๋๋ ๊ณผ์ ์์ ์ฒ์ ์ ํ๋ ๊ฐ๋
์ด ์์๋ค. ๋ฐ๋ก ์ค์ผ๋ ํค UI
์๋ค. ์ง๊ธ๊ป ์ฌ์ฉํด๋ณด์ง ์์๋ ๊ฐ๋
์ด๋ผ ๋ฌด์์ธ์ง ๊ถ๊ธํ๋ค. ํ์ง๋ง ์ด๋ ํ์์ ๋ง์ด ์ ํ๋ ๊ฒ์ด์๋ค. ์ ํ๋ธ์์ ์์์ด ๋ก๋๋๊ธฐ ์ ํ์ ๋ฐฐ๊ฒฝ์ด ๋ฐ๋ก ์ค์ผ๋ ํค UI
์ด๋ค. ์ด๊ฒ์ด ์๋๋ ์๋๋์ ๋ฐ๋ผ ์ฌ์ฉ์๋ค์ ์ง๋ฃจํ ์๋ ์๊ณ ์ง๋ฃจํ์ง ์์ ์ ์๋ค. ์ด๋ฌํ ๊ฒ๋ค์ ์ง์ ๊ตฌํํ๋ฉด์ ๊ฐ๋ฐ์๋ก์๊ฐ ์๋ ์ฌ์ฉ์๋ก์ ์น ํ์ด์ง๋ฅผ ์๊ฐํ ์ ์์๋ค.
API ํต์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ์ด๋ค. ๋ฏธ์
์ ์์ํ๊ธฐ ์ ๊น์ง๋ง ํด๋ ๋๊ธฐ, ๋น๋๊ธฐ์ ๋ํด ์ ์์ง ๋ชปํ๋ค. ๋๊ธฐ๋ฅผ ์ดํด๋ณด๋ฉด ๋์์ ์ผ์ด๋๋ค.
๋ผ๋ ๋ป์ ๊ฐ์ง ๋จ์ด๋ก ์๊ณ ์์๊ณ , ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์๊ฐ ๋์์ ์ผ์ด๋๋ค๊ณ ์๊ฐํ์๋ค. ์ฆ, ์๊ฐ์ด ํ์ํ ํจ์์กฐ์ฐจ ๋์์ ์คํ๋๋ ๊ฒ์ด ๋๊ธฐ๋ผ๊ณ ์ดํดํ๊ณ ์์๋ค. ํ์ง๋ง ์ด๋ ์์ ํ ํ๋ฆฐ ๊ฐ๋
์ด์๋ค. ์๊ฐ์ด ํ์ํ ํจ์, ์๋ฅผ ๋ค์ด setTimeout
, Promise
์ ๊ฐ์ ํจ์๋ ๋น๋๊ธฐ
์ฑ๊ฒฉ์ ๊ฐ์ง๋ ํจ์์ด๋ค. ์ด๋ค์ ์ฝ์คํ
์์ ์คํ๋์ง ์๊ณ task queue
์ ๋ด๊ฒจ์ ธ(queue์ ์ข
๋ฅ๋ 3๊ฐ์ง๊ฐ ์๋ค.) ์ฝ์คํ
์ ๋น์ด์ก์ ๋ ์คํ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํ๋ก๊ทธ๋๋ฐ์์ ๋งํ๋ ๋น๋๊ธฐ
์ด๋ค. ์ด๋ฅผ ๋๊ธฐ
๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ด ์ฝ๋ฐฑํจ์, async/await, Promise์ then์ด๋ค. ์์ ํจ์์ ์ฌ์ฉ์ ์๊ณ ์์๋๋ฐ ๊ฐ๋
์ ์ ํํ ์๊ณ ์์ง ์์ ์ฒ์์ ํผ๋์ด ์์๋ค. ํ์ง๋ง ์ฌ๋ฌ ํฌ๋ฃจ๋ค์ ์ด์ผ๊ธฐ๋ฅผ ๋ค์ผ๋ฉฐ ๋๋ ์์ํ ์ดํด๊ฐ ๋์๋ค.
์๋ฌดํผ!! API ํต์ ๊ณผ ๋๋ถ์ด ์ฌ์ฉ์์๊ฒ ์น์ ํ UI๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ด๋ฒ ๋ฏธ์ ์ ์ค์ํ ๋ชฉํ์๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก ๋ง์กฑํ ๊ฒฐ๊ณผ๋ฌผ์ด ๋์์ง๋ง, ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ ์ฌํญ์ ๋๋ฌํ์ง ๋ชปํ ๋ฏํ์ฌ ์์ฌ์์ด ๋จ์๋ค. ์ถ๊ฐ์ ์ผ๋ก ๋ฐฐํฌ๊ฐ ๋งค์ฐ.. ์ด๋ ค์ ๋คใ ใ
๐ฌ ํ์ดํ๋ก๊ทธ๋๋ฐ ์งํ ๊ณผ์
๋ ๋ฒจ1 ๋ง์ง๋ง ๋ฏธ์ ์ ํ์ด๋ ์ฐ์ฝ์๋ค. ํ์์ ์ฐ์ฝ์ ์นํด์ง๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ์ ๋ง ์ข์ ๊ธฐํ๋ผ๊ณ ์๊ฐํ๋ค. ๋ง์ ์ด์ผ๊ธฐ๋ฅผ ๋๋๋ฉด์ ํ์ดํ๋ก๊ทธ๋๋ฐ์ ์งํํ๊ณ ์ถ์๋ค. ํ์ง๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค. ์ฐ์ฝ๊ฐ ๋ฏธ์ ์์ ๋ค์๋ ์ธ ์์์ผ์ ์๋น๊ตฐ์ ๊ฐ๋ค๋ ๊ฒ์ด์๋ค. ๋๋ฌธ์ ์์์ผ ์ค์ ๊ณผ ์คํ๋ ํผ์์ ์๊ฐ์ ๋ณด๋ด์ผ ํ๋ค. ๋ค๋ฅธ ํฌ๋ฃจ๋ค์ ํ์ดํ๋ก๊ทธ๋๋ฐ์ ํตํด ๋ฏธ์ ์ ์์ฑํด ๊ฐ๋๋ฐ, ๋ ๊ทธ๋ฌ์ง ๋ชปํด์ ๋ง์์ ์ ์ ์ด์กฐํด์ก๋ค. ๋ง์์ด ์ด์ดํด์ ธ์ ๊ทธ๋ฐ์ง ์ฝ๋์ ๊ตฌ์กฐ์ ๋ํด์๋ ์๊ฐ์ ํ์ง ์๊ณ ๋์ ์๊ฐ์ ์ฝ๋๋ก ์ฎ๊ธฐ๊ธฐ ๋ฐ๋นด๋ค. ๋์ด์ผ ์๊ฐํด ๋ณด๋ฉด ํ์ดํ๋ก๊ทธ๋๋ฐ์ด ์๋๋ผ ํผ์์ ํ๋ ํ๋ก๊ทธ๋๋ฐ์ด์๋ค. ๋์ ์๊ฐ์ ํ์ด์๊ฒ ์ ๋ฌํ์ง ์์์๋ฟ๋๋ฌ ์ฝ๋์ ๊ตฌ์กฐ ๋ํ ๋๋ง ์๊ฐํ๊ณ ์๋ ๊ฒ์ด์๋ค. ํ์ดํ๋ก๊ทธ๋๋ฐ์ ๋ณธ์ง์์ ๋ฒ์ด๋ ๋๋์ด ๋ค์๋ค.
๋คํํ ์ฐ์ฝ๊ฐ ๋จผ์ ์ด์ผ๊ธฐ๋ฅผ ํด์ผํ ๊ฒ ๊ฐ๋ค๊ณ ๋ง์ ํ๊ณ , ๋๋ ์ ์ ์ ์ฐจ๋ฆฌ๊ฒ ๋์๋ค. ์๋ง ์ด์ผ๊ธฐ ์์ด ๊ฐ์ ์ฝ๋ฉ์ ํ๋ค๋ฉด ์๊ฐ์ ๋ ๋ง์ด ๊ฑธ๋ ธ์ ๊ฒ์ด๋ค. ๊ธํ ๋ง์์ ์ ์ ์ ์ด๋๊ณ ์ด์ผ๊ธฐ๋ฅผ ํตํด ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ์๊ฐํ๋ค. ๋คํํ ๊ธ์์ผ ๋ฏธ์ ์ ์ถ ์๊ฐ ์ ๊น์ง ์ด๋ ์ ๋ ์์ฑํ ์ ์์๋ค. ๋ณด๋ค ์๊ฐ์ด ์ถฉ๋ถํด ์ด์ผ๊ธฐ๋ฅผ ๋ ๋ง์ด ๋๋์์ผ๋ฉด ์ด๋ ์๊น ํ๋ ์๊ฐ์ด ๋ ๋ค. ๊ทธ๋๋ ์ฐ์ฝ์ ์ด์ ๋ณด๋ค ๋ ์นํด์ก์ผ๋ ์์ผ๋ก ๋ ๋ง์ด ์ด์ผ๊ธฐ๋ฅผ ๋๋ ์ ์์ ๊ฒ์ด๋ค. ์ง๊ธ์ ๊ทธ๊ฑธ๋ก ๋ง์กฑํ๋ค!
๐ ์ํ ์
- ์น ์ปดํฌ๋ํธ๊ฐ ์๋ ์๋ก์ด ์๋๋ฅผ ํด๋ณด์๋ค.
- ์๊ฐ์ด ๋ถ์กฑํ ๋งํผ ๋ ์ง์คํ์ฌ ๋ฏธ์ ์ ์งํํ์๋ค.
- ์ด์ ๋ณด๋ค ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ ์์ฐจ๊ฒ ์ฌ์ฉํ๋ค.
๐ ์์ฌ์ด ์
- ์ด์ดํ ๋ง์์ ๋ด ์๊ฐ์ ์ ์ ๋ฌํ์ง ์์๋ค.
- ์ฝ๋ ๊ตฌ์กฐ์ ์ค๊ณ์ ๋ํ ์ด์ผ๊ธฐ๊ฐ ๋ถ์กฑํ๋ค.
๐ ์์ผ๋ก์ ๊ฐ์ค
- ์๋ฌด๋ฆฌ ์๊ฐ์ด ์๋คํด๋ ๋ณธ์ง์ ์์ง ๋ง์.
- ๋ง์์ ์ฌ์ ๋ฅผ ๊ฐ์ง ์ ์๋๋ก ํ๋ จํ์.
๐ ๏ธ ๋ฆฌํฉํฐ๋ง
import ์์
import ์์์ ๋ํด ๊ณ ๋ฏผ์ ํ์๋ค. ์๋ฌด๋ฐ ๊ท์น ์์ด import๋ฅผ ํ๊ฒ ๋๋ค๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ์์๊น? ๋น์ฅ ๋ ์ค๋ฅด๋ ๊ฒ์ ํ์ ์์์ ํจ์จ์ฑ์ด๋ค. ์ง๊ธ์ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์์ง๋ง ํฐ ํ๋ก์ ํธ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค๋ฉด ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ด๋ค. ์ด๋, import ์์๊ฐ ๋ค์ฃฝ๋ฐ์ฃฝ์ด๋ผ๋ฉด ๋ถ๋ช ํผ๋์ด ์ฌ ๋๊ฐ ์์ ๊ฒ์ด๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฆฌํฉํฐ๋ง์ ์งํํ์๋ค.
eslint์ "import/order"
role๋ฅผ ์ ์ฉํ์ฌ ์์๋ฅผ ๊ฐ์ ํ์๋ค. ํด๋น ๋ฆฌํฉํฐ๋ง์ ์งํํ๋ฉด์ ์ข์๋ ์ ์ ์ค์ค๋ก eslint๋ฅผ ์ค์ ํ๋ค๋ ๊ฒ์ด๋ค. ์ง๊ธ๊น์ง ๋๊ตฐ๊ฐ๊ฐ ์ค์ ํด ๋ eslint๋ฅผ ์ฌ์ฉํ์๋ค. ๊ทธ๋์ ๊ทธ๋ฐ์ง ์ค์ ํ๋ ๊ฒ์กฐ์ฐจ ์ํ์น ์์๋ค. ๋ถ๋ช
์ ์ฑ์ ํ๋ค๊ณ ์๊ฐํ๋๋ฐ, role์ด ์ ์ฉ๋์ง ์์์ ๋ฌด์์ด ๋ฌธ์ ์ธ์ง ๊ณ์ ์ฐพ์๋ค. ํผ์ ํด๊ฒฐ์ฑ
์ ์ฐพ์ง ๋ชปํด ์ฃผ๋ณ ์๋ก์คํ์๊ฒ ๋ฌผ์ด๋ณด์๋ค. ์ค์ ์ ๊ดํด ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ, ๋ฌด์์ด ๋ฌธ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด์ ํฐ๋ฏธ๋์ OUTPUT
๋ฅผ ๋ณด๋ฉด ๋๋ค๊ณ ํด์ ๋ดค๋๋.. ์ธ์์ ๋ฌด์์ด ์ค์น๋์ง ์์๋ค๋ ๊ฒ์ด ๋ณด์๋ค. ์ญ์.. ํผ์ ํด๊ฒฐํ๋ ๊ฒ๋ ์ข์ง๋ง ์ฃผ๋ณ์ ๋์์ ์์ฒญํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ค..! ์๋๋ ๋ด๊ฐ ์ด๋ฒ์ ์ ์ฉํ "import/order"
role์ด๋ค.
{
// ...
"rules": {
"import/order": [
"error",
{
"groups": ["builtin", "external", "internal", "type"],
"newlines-between": "always",
"pathGroups": [],
"alphabetize": {
"order": "asc",
"caseInsensitive": true
}
}
],
"no-unused-vars": "off"
},
// ...
}
URL ๊ตฌ์กฐ์ ๋ฐ๋ฅธ ์์ํ
์ด๋ฒ ๋ฏธ์ ์ ์ฒซ ์ ์ถ์ ์ด์ ๋ฏธ์ ์ฒ๋ผ ์์ํ๊น์ง ๊ณ ๋ คํ์ง ๋ชปํ๋ค. ๋๋ฌธ์ ์์ํ๋ ๋ฆฌํฉํฐ๋ง ๋ชฉ๋ก์ ์์๋ค. ๊ทธ์ค ์ด์ ๊ณผ ๋ค๋ฅด๊ฒ ํน๋ณํ ์ ๊ฒฝ ์ด ๊ฒ์ด ์๋๋ฐ ๋ฐ๋ก URL ๊ตฌ์กฐ์ ๋ฐ๋ฅธ ์์ํ์๋ค. api๋ URL์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ์ด๋ฅผ ๊ตฌ์กฐ์ ๋ฐ๋ผ ๋๋ ํ์๊ฐ ์์ด๋ค.
๋๋ ๋ค์๊ณผ ๊ฐ์ด URL์ฃผ์๋ฅผ ๋๋๊ณ ์์ํ๋ฅผ ์งํํ์๋ค.
const BASE_API_PROTOCOL = 'https';
const BASE_API_DOMAIN = 'api.themoviedb.org';
const POPULAR_API_PATH = '3/movie/popular';
const SEARCH_API_PATH = '3/search/movie';
๊ฐ์ฒด๋ก ๋ฉ์๋ ๊ด๋ฆฌํ๊ธฐ
๊ฐ์ ์ฑ๊ฒฉ์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ ๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ์๋ก์ด ํ์ผ์ ๋ง๋ค์ด์ผ ํ ๊น? ๊ฐ์ ํ์ผ ์๋์ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ค์ด์ผ ํ ๊น? ์? ๊ทธ๋ฌ๋ฉด ํ์ผ๋ช ์ ๋ฐ๊ฟ์ผ๊ฒ ๋ค...
์๋ก์ด ๋๋ฉ์ธ ๊ฐ์ฒด๊ฐ ์ถ๊ฐ๋ ๋, ์ด๋ป๊ฒ ํด์ผ ์๊ณ ๋ฅผ ๋ ์ ์์๊น? ์ ๋ต์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๊ฐ์ ์ฑ๊ฒฉ์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ๋ฌถ์ด ๊ด๋ฆฌ๋ฅผ ํ๊ธฐ๋ก ํ์๋ค.
์ด๋ฒ ๋ฏธ์ ์๋ ๋ค์๊ณผ ๊ฐ์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์์๋ค.
export const processMovieData = ({
page,
results,
total_pages: totalPages,
}: FetchedMovieJson) => {
const movies: MovieItem[] = results.map((result) => ({
title: result.title,
posterPath: `${MOVIE_IMAGE_URL}${result.poster_path}`,
voteAverage: result.vote_average,
}));
return { page, movies, totalPages };
};
api๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ํจ์์ด๋ค. ํด๋น ํจ์๊ฐ ์๋ ํ์ผ์ ์ด ํจ์๊ฐ export๋ฅผ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋น์ทํ ์ฑ๊ฒฉ์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ค.
์ด๋ฅผ ๋๋นํ์ฌ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊พธ์๋ค.
export const dataProcessors = {
processMovieData: ({
page,
results,
total_pages: totalPages,
}: FetchedMovieJson) => {
const movies: MovieItem[] = results.map((result) => ({
title: result.title,
posterPath: `${MOVIE_IMAGE_URL}${result.poster_path}`,
voteAverage: result.vote_average,
}));
return { page, movies, totalPages };
},
};
์ค์ ๋ก ์์ ๊ฐ์ด ๊ด๋ฆฌ๋ฅผ ํ๋, 2๋จ๊ณ ๋ฏธ์ ์์ ์๋ก์ด ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ ๋ ํฐ ์ด๋ ค์์ด ์์๋ค. ์ด๋ ค์์ด๋ผ๊ธฐ ๋ณด๋จ ์๊ณ ๊ฐ ๋ ํ๋ค.
'๐ ์ฐ์ํํ ํฌ์ฝ์ค > Level1' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ ๋ฒจ1 - ์ธํฐ๋ทฐ (0) | 2023.04.14 |
---|---|
๋ ๋ฒจ1 ์ํ ๋ฆฌ๋ทฐ - step2 (0) | 2023.04.14 |
๋ ๋ฒจ1 ์ ์ฌ ๋ญ ๋จน์ง - step2 (0) | 2023.04.14 |
๋ ๋ฒจ1 ์ ์ฌ ๋ญ ๋จน์ง - step1 (0) | 2023.04.14 |
๋ ๋ฒจ1 ํ์ด์ ๋ก๋ - step2 (0) | 2023.04.13 |