230420(๋ชฉ)
๐ ์ฑ์ฅ์ผ์ง 4.0
์ฑ
ํ๋ณตํ ์ด๊ธฐ์ฃผ์์(์จ์ธ ๋ค์ด์ด)
์ ๋ด์ฉ์ ์๊ทน๋ฐ์ ์์ํ๋ ์๋ฐํ ์ฑ์ฅ๊ธฐ๋ก
์ด์์๋ ๊ฝ๊ณผ ์ฃฝ์ ๊ฝ์ ์ด๋ป๊ฒ ๊ตฌ๋ณํ๋๊ฐ?
์ฑ์ฅํ๊ณ ์๋ ๊ฒ์ด ์ด์ ์๋ ๊ฒ์ด๋ค.
์๋ช ์ ์ ์ผํ ์ฆ๊ฑฐ๋ ์ฑ์ฅ์ด๋ค!
๐ณ (1.0)ํค์๋
์ต๋ํ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌ, ์ถํ์ ๋ณด๋ฉด์ ์ค์ค๋ก ์ค๋ช
๐ (2.0)๊ฒฝํ ์์ฃผ๋ก
๋จ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ๋ณด๋ค ๋ฌด์์ ๋ฐฐ์ ๊ณ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์งง๊ณ ๊ฐ๋จํ๊ฒ ์์ฑ
โ๏ธ (3.0)์ ํด์ง ํ ํ๋ฆฟ์ ๋ง์ถฐ์
ํค์๋, ๊ฒฝํ ๋ชจ๋ ์ข๋ค. ๋ค๋ง ๋งค์ผ ์์ฑํ๊ธฐ๋ก ๋ง์ ๋จน์๋งํผ ํต์ฌ๋ง ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํ ์ ์๊ฒ ํ ํ๋ฆฟ์ ์์ฑ
(3.1)230102๋ถํฐ ์์๋๋ ํ์ต์ ๊ดํ ๋ด์ฉ ์ถ๊ฐ
(3.2)230313๋ถํฐ ์ข๋ ๊ฒฝํ, ๊ฐ์ ์์ฃผ์ ๋ด์ฉ๋ ๋ด๊ธฐ!
๐พ (4.0)ํ์ต ํค์๋์์ ์ต๋ํ ๊ฐ๋จํ ์ ๋ณด ์ ๊ณต, ๊ณ ๋ฏผ์์ ๋ด ๊ฒฝํ์ ์์ธํ ์ ์!
๐ง ๊ณ ๋ฏผ ์ฌํญ
1. [์ปดํฌ๋ํธ ๋ฆฌํฉํ ๋ง] ํ์ ์ปดํฌ๋ํธ๋ค์ ์์ ์ปดํฌ๋ํธ์ element๋ก attach ํ setState ํ์ ๋, ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์๋๊ฒ ์ด๋ป๊ฒ ํ์ง..?
์ผ๋จ ๋ฆฌํฉํ ๋ง์ ํตํด์ ํ์ ์ปดํฌ๋ํธ๋ค์ constructor์์ setState๋ฅผ ํตํด ํ๋ฉด์ ๋ฐ๊พธ๋ ๊ฒ๊น์ง๋ ์ฑ๊ณตํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ๋ถ๋ชจ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ๋ฅผ ๋ถ์ด๊ณ ๋์ ํ์ ์ปดํฌ๋ํธ์ element๊ฐ ๋ฐ๋์์ ๋..! ์ด ๋ ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์์ด ๋์ด์ผํ๋๋ฐโฆ constructor์์ setState ๋๋ ๊ฒ์ธ์ setTimeout์ด๋ setInterval์ ํตํด ๋์ค์ ๋ณ๊ฒฝ๋์์ ๋๋ ๋น์ฐํ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋์ง ์๋๋ค. ์๋ํ๋ฉด ์ด๋ฏธ attachTo ํ์ ๋ ๋ถ์ element์ ๋์ค์ ๋น๋๊ธฐ์ ์ผ๋ก ์์ฑํ element๊ฐ ๋ค๋ฅธ element์ด๊ธฐ ๋๋ฌธ์ด๋ค. attach ํ๋ ๋ถ๋ถ์ innerHTML๊ณผ outerHTML์ ์ด์ฉํด์ ์ด๋ป๊ฒ ํ๋ฉด ๋ ๊ฑฐ ๊ฐ์๋ฐโฆ ํ์ด ์ง์ง ์ด ๋ถ๋ถ๋๋ฌธ์ ๋๋ฌด ํ๋ค๋คใ ๊ทธ๋๋ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฆฌํฉํ ๋งํด๋ณด์!!!
2. [ํ ์คํธ ์ฝ๋] ์๋ฒ์ ํต์ ํ๋ ๋ก์ง์ ๋ํ ํ ์คํธ ์ฝ๋ ์์ฑ ์, server์ ๋ํ ์์กด์ฑ์ ์์จ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น?
์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ ๋๋, fetch๋ฅผ ํตํด ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ ๊ทธ ๊ฐ์ ํ ์คํธํ๊ฒ ๋๋ค. ํ๋ฐ ๋ง์ฝ์ ์๋ฒ๊ฐ ๊บผ์ง๋ค๋ฉด..? ์๋ฒ๊ฐ ๋น์ฅ ์๋ค๋ฉด..? ์ด๋ด ๋ ํ ์คํธ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์์ฑํ๊ณ ์คํํด๋ณผ ์ ์์๊น? ์ผ๋จ ์์๋ณธ ๋ฐ๋ก๋ mock server๋ผ๋ ๊ฐ์ง ์๋ฒ๋ฅผ ๋ง๋ค์ด์ ํ ์คํธํด๋ณด๋ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ๋ค. ์ด ๋ถ๋ถ์ ๋ํด์๋ ์์๋ด์ผ๊ฒ ๋ค..! (์์ ์ ์จ๋ณด๋ ค๋ค๊ฐ ๋ฒ๋ค๋ฌ ์์ด๋ ์๋์๋ MSW์ ๊น์ ์ฐ๊ด์ด ์๋๋ฏ!!)
๐ ์ค๋์ ํ์ต ํค์๋
- ๋ฆฌํฉํ ๋ง๊ณผ ํ ์คํธ ์ฝ๋
๐ฅณ ํ์ต ๋ด์ฉ
๋ฆฌํฉํ ๋ง์ ์ํ ํ ์คํธ ์ฝ๋ ์์ฑ(feat. Jest)
๊ธฐ์กด์ MVC, Observer pattern์์ Flux pattern์ผ๋ก ๋ฆฌํฉํ ๋งํ๊ธฐ์ ์์ ํ ์คํธ ์ฝ๋๋ถํฐ ์์ฑํ๊ณ ์ฐ์ตํด๋ณด์๋ค.(๊ณ ๋๊ธธ ๊ฐ๊ธฐ ์ ๊ทธ๋๋ง ์ฌ์ ๋๋นใ ใ ใ )
์์3) fetch์ ๋ํ ํ ์คํธ ๊ทธ๋ฆฌ๊ณ error์ ๋ํ ํ ์คํธ
import { customGet } from '@utils/customFetch.js';
import { BASIC_URL } from '@src/constants/constants.js';
// ์๋ฒ๊ฐ ์ผ์ ธ์์ด์ผ์ง๋ง fetch๊ฐ ๋๋๋ฐ, ์ด ๋ถ๋ถ์ ๋ํ ์์กด์ฑ์ ๋ฎ์ถ๋ ๋ฐฉ๋ฒ์ ์์๊น..?
// ์๋ฒ๊ฐ ๊บผ์ง๋ฉด test๋ ์คํจ๊ฐ ๋์ด๋ฒ๋ฆฌ๋๊น!
// ์ถํ์ mock server ์์๋ณด๊ธฐ
describe('Custom GET', () => {
it('About Left Issue data', async () => {
const issues = (
await customGet(`${BASIC_URL}/issues`).then((res) => res.json())
)[0];
const leftIssues = issues.leftRollingData;
const firstIssue = leftIssues[0];
expect(firstIssue).toEqual(
"๋ฉ์นยท์ด์ธ 3์ธ์กฐ ์์ฅ์ฌ์ฌโฆ'์ ์ฃฝ์๋' ๋ฌป์ ๋ฌต๋ฌต๋ถ๋ต",
);
});
it('About Error', async () => {
const mockPromise = async () => await customGet(`${BASIC_URL}/none`);
await expect(mockPromise).rejects.toThrow(
new Error('Error: 404 Not Found'),
);
});
});
fetch์ ๊ดํ ํ ์คํธ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌํด์ฃผ๋ ๊ฒ์ด๋ผ ํฌ๊ฒ ๋ค๋ฅผ ๊ฒ ์๋๋ฐ, error๋ฅผ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ด ์ฌ๋ฏธ์์๋ค. ์ผ๋ถ๋ฌ ์๋ฌ๋ฅผ ๋ด๊ณ ๊ทธ์ ๋ํ promise๋ฅผ reject ์ฒ๋ฆฌํ์ฌ ์๋ฌ๋ฅผ ์ก์๋ด๊ณ ๊ทธ ๋์ ๊ฐ๊ณผ ์์๊ฐ์ ๋น๊ตํ๋ค. ์์ผ๋ก๋ ๋ค์ํ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ด์ผ๊ฒ ๋ค!
-
- 1. [์ปดํฌ๋ํธ ๋ฆฌํฉํ ๋ง] ํ์ ์ปดํฌ๋ํธ๋ค์ ์์ ์ปดํฌ๋ํธ์ element๋ก attach ํ setState ํ์ ๋, ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์๋๊ฒ ์ด๋ป๊ฒ ํ์ง..?
- 2. [ํ ์คํธ ์ฝ๋] ์๋ฒ์ ํต์ ํ๋ ๋ก์ง์ ๋ํ ํ ์คํธ ์ฝ๋ ์์ฑ ์, server์ ๋ํ ์์กด์ฑ์ ์์จ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น?