๋ชจ๋
ธ๋ ํฌ ๋์
์ง๊ธ ํ์ฌ ํ๋ฐํธ ํ์ ํ๋ก์ ํธ๋ ์๋๋ ๋๋ฉ์ธ ๋ฉ๋ด๋ณ๋ก ๋๋์ด์ ๋ฉํฐ๋ ํฌ Multi repo ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐ์ ํ์๋ค. ์ฆ ๊ฐ๋ฐ์๋ง๋ค ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ํ๋ํ๋ ๋ฐ๋ก ๊ด๋ฆฌํด์ ๊ฐ๋ฐํ์๊ณ , ํ์๋ผ๋ฆฌ ๋๊ฐ์ ui๋ฅผ ๊ฐ๋ฐํ๋ค๊ณ ํ์ฌ๋ ์ ์ฅ์๊ฐ์ ์ปจํ
์คํธ ๊ณต์ ๊ฐ ์ด๋ ค์์ ๊ฐ๊ฐ์ธ ๊ฐ์๊ฐ ๊ด๋ฆฌํ๋ ๋ ํฌ์งํ ๋ฆฌ ๋ด๋ถ์์ ๋๊ฐ์ ui๋ฅผ ์ค๋ณตํด์ ๊ฐ๋ฐํ๊ธฐ๋ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด์ ์ฌ๋ฌ๊ณณ์์ ์ค๋ณต์ผ๋ก ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๊ณต์ ํด์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ํ๋์ ์ฝ๋๋ฒ ์ด์ค์์ ๋ชจ๋ ํ๋ก์ ํธ์ ์ฝ๋์ ์์์ ๊ด๋ฆฌํ์ฌ ์๋ก์ ๊ด๊ณ์ ์์กด์ฑ์ ์ฝ๊ฒ ํ์
ํ ์ ์๋๋ก ๋ชจ๋
ธ๋ ํฌ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ค. ๋ชจ๋
ธ๋ ํฌ ํ๊ฒฝ์์ ์ฒ์ ๊ฐ๋ฐํ๋ฉด์ ํ๋ก์ ํธ ์คํ์ด ์๋ ๋๊ฐ ์์๋๋ฐ ์ด๋ ๋ง์ฃผํ ์๋ฌ๋ฅผ ์ ๋ฆฌํ๋ค. Monorepo ๋น๋ ๋๊ตฌ Turborepo ..
React
๋ฌธ์ ํธ๋ฆฌ๊ตฌ์กฐ ๋ฐ์ดํฐ interface Data { id: string; children: Data[]; } export const data: Data = { id: "์์1", children: [ { id: "ํ์1", children: [ { id: "ํ์1-1", children: [{ id: "ํ์1-1-1", children: [] }] }, { id: "ํ์1-2", children: [] }, ], }, { id: "ํ์2", children: [] }, ], }; ํ์ฌ ํด๋ฆญํ๋ ์์ดํ
์ id๋ ์ํ๊ฐ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์๋ค. ํด๋น ์์ดํ
์ ๋๋ฅด๋ฉด id ์ํ๊ฐ์ด ๋ฐ๋ก ๋ณ๊ฒฝ๋๋ค. const [currentId, setCurrentId] = useState(data.id); ๊ทธ ๋ณ๊ฒฝ๋ id๋ฅผ ๊ฐ์ง๊ณ ..
์ด์์ฌํญ postTokenQuery(token) .then((res) => { console.log(res, '์ฟผ๋ฆฌ res'); if (res.data) { setTokenInStorage(token); } }) .catch(() => toast.error('ํ ํฐ ์๋ฌ ๋ฐ์')); //์๋ฒ ์๋ต ์คํจ์ ์คํ ์๋จ rtk query ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด์ ์๋ฒ์ ํต์ ํ๋๋ฐ ์๋ฒ์์ ๋ณด๋ด์ฃผ๋ ์๋ต์ ๋ฐ๋ผ ์ฑ๊ณตํ๋ฉด? .then ์ผ๋ก ํน์ ๋ก์ง์ ์คํํ๊ณ ์คํจํ๋ฉด? .catch ๋ก ํ ์คํธ๋ฅผ ๋์ฐ๋ ๋ก์ง์ด๋ค. ๊ทธ๋ฐ๋ฐ ์๋ฒ์ ์๋ต์ ์คํจํด๋, catch ๋ฌธ์ผ๋ก ๋์ด๊ฐ์ง ์๊ณ , then์์ ๊ฑธ๋ ค res ์๋ต์ ์ฝ์์ ๋์ฐ๋ ์ด์ํ ์ ์ด ๋ฐ๊ฒฌ๋์๋ค. ์ฑ๊ณต์ {data: {…}} ๊ฐ ์ฝ์์ ์ฐํ๊ณ , ์คํจ์ {error: ..
ํด๋ผ์ด์ธํธ ๋จ์์ http ๋น๋๊ธฐ ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก axios๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์๋ฒ์ ์์ฒญํ๋๋ฐ ์๊พธ ์๋ฒ์์ ์๋ฌ๊ฐ ๋ฌ๋ค. API ์์ฒญ ํ์์ ์๋์ ๊ฐ๋ค. ์์ฒญ ๋ฉ์๋๋ POST ์์ฒญ ๋ฐ๋๋ ์๋ฌด๋ฐ ๋ฐ์ดํฐ๋ ๋ฃ์ง ์์์ผํจ ์์ฒญ ํค๋์ ์์ฒญ ํ๋ผ๋ฉํฐ ๊ฐ์ผ๋ก๋ง ์๋ฒ์ ์์ฒญ ๋คํธ์ํฌ ํญ์์ ํ์ธํด๋ณด๋, ํค๋์ ํ๋ผ๋ฏธํฐ๋ก ์ ์์ฒญ์ด๊ฐ์ง ์๊ณ , payload ๋ฐ๋์ ํค๋์ ํ๋ผ๋ฏธํฐ๋ก ์ ์ด์ค ๊ฐ์ฒด๊ฐ ์์ฒญ ๋ฐ๋๋ก ๋ณด๋ด์ ธ์ ์ค๋ฅ๊ฐ ๋๋ ๊ฒ์ผ๋ก ํ์ธ์ด ๋์๋ค. ๊ธฐ์กด ์ฝ๋ axios.post( 'url', { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, params: { transactionId, email, pageUri: 'http://192..
์๋ก ์ ๋ง ๋ช๋ ๋ฉฐ์น ์ ๋๋ฒ๊น
ํ์ง๋ง ํด๊ฒฐ ์๋๋ ์ด์๊ฐ ์์๋ค... Mui ํ๋ ์์ํฌ ์์ฒด์ ๋ฌธ์ ์ธ๊ฑธ๊น? ํ๊ณ Textfield ์ปดํฌ๋ํธ๋ฅผ ์์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ๊ฐ์์๊ธฐ ์ ๋ง์ง๋ง์ผ๋ก ํ๋ฒ๋ง ๋ ๋๋ฒ๊น
ํด๋ณด์ ํ๋๋ฐ ์ค๋ ์ง์ง ์ด์ด์๊ฒ ์ด์๊ฐ ํด๊ฒฐ๋์๋ค... ๋ด๊ฐ ์ด๊ฒ๋๋ฌธ์ ๋ช์ผ์ ๊ณ ์ํ๋ค๊ณ .... ๐ญ ์ฌ๋ด ํ๋ก์ ํธ๋ ๋ฆฌ์กํธ ui ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก MUI๋ฅผ ์ฌ์ฉํ๋ค. MUI ๊ณต์๋ฌธ์์์ ํํ๋์ด์๋๋๋ก, ์ธํ๋ฐ์ค๋ฅผ Textfield ์ปดํฌ๋ํธ๋ก ํํํ๊ณ , input ๋ฐ์ค ์ค๋ฅธ์ชฝ ๋์์๋ x ๋ฒํผ์ InputProps์ endAdornment ์์ฑ์ผ๋ก ๊ฐ์ธ์ฃผ์ด ๊ตฌ์กฐ๋ฅผ ์ก์๋ค. 0 && isNameFocused && ( )} ) }} /> Expected Behaviour ์ธํ๋ฐ์ค๋ฅผ ๋๋ฅด๋ฉด focus ์ฒ๋ฆฌ๋..
์ํฉ ๋ง์ดํ์ด์ง๋ฅผ ๊ฐ๋ฐํ๋๋ฐ ์ด์ ํ์ด์ง๊ฐ ์ด๋ ํ์ด์ง์์ ์ง์
ํ๋๋์ ๋ฐ๋ผ ๋ณด์ฌ์ค์ผํ ์ปดํฌ๋ํธ ํ๋๊ฐ ์ฐจ์ด๊ฐ ๋ฌ๋ค. ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ด์ ์ฐ์ ์ฝ๋๊ฐ ๊ฒน์น์ง๋ง ๋ง์ดํ์ด์ง์ ํด๋นํ๋ ํ์ด์ง๋ฅผ ๋ ๊ฐ๋ฅผ ๋ง๋ค์๋ค. ๋ก์ง์ ๋๊ฐ์ง๋ง ์ด์ ํ์ด์ง๊ฐ ์ด๋ค ํ์ด์ง์ธ์ง ์ ๋ณด๋ง ์๋ค๋ฉด ๋ง์ดํ์ด์ง ์ปดํฌ๋ํธ๋ฅผ ๋๊ฐ ๋ง๋ค ํ์๊ฐ ์ ํ ์์ด๋ณด์๋ค. ๋ด์ ๋ณด ํ์ด์ง์ ๋ก์ง์ ์๋์ ๊ฐ๋ค. ์ด์ ํ์ด์ง๊ฐ ์์ ์๋ฃ ํ์ด์ง๋ผ๋ฉด? ๋ด์ ๋ณด ํ์ด์ง + ํ ์คํธ ์ปดํฌ๋ํธ ์ด์ ํ์ด์ง๊ฐ ๊ทธ ์ธ์ ํ์ด์ง๋ผ๋ฉด? ๊ทธ๋ฅ ๋ด์ ๋ณด ํ์ด์ง ๋ฌธ์ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ ํ์ด์ง ์ปดํฌ๋ํธ์ Props๋ก ์กฐ๊ฑด์ ๋ด๋ ค์ฃผ์ด ์ํ๋ ์กฐ๊ฑด๋๋ก ๋ค๋ฅธ ๋ ๋ฐฉํฅ์ผ๋ก ๋ฅผ ๋์์ค ์ ์์๊น? ๋ผ๊ณ ์๊ฐ์ ํ์๋๋ฐ, ์ ์ด์ react-router-dom์ useNaviga..
์์ฆ ์ฌ๋ด ํ๋ก์ ํธ์์ ๋ชจ๋ฐ์ผ ํ์ด์ง ์์
์ ํด์ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ก ํ์ฌ ๊ฐ๋ฐ์ค์ธ ํ์ด์ง๋ฅผ ๋์์ ํ์ธํ๊ณ ์ถ์๋ค. ์๋ ๋ฐฉ๋ฒ๋๋ก ๊ฐ๋ฐ pc์ ๋ชจ๋ฐ์ผ์ ๋๊ฐ์ wifi ํ๊ฒฝ์ผ๋ก ๋๊ณ , ๋ชจ๋ฐ์ผ์์ ip์ฃผ์:port๋ฒํธ๋ก ์ ์ํ๋๋ฐ, ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ก ๋ก์ปฌ ์๋ฒ ์ ์์ด ์๋๋๊ฒ ..? ๊ณ์ ์๋์ ๊ฐ์ ์๋ฌ๊ฐ ๋๊ณ ๋ชจ๋ฐ์ผ ์ ์์ด ์๋๋ ๋ฌธ์ ๊ฐ ์์๋ค. The URL can't be shown. ์ด๋ผ๋ ๋ฌธ๊ตฌ๋ง ๊ณ์ ๋์ด.. ์-์ ์ ๋ฆฌ์กํธ ํ๋ก์ ํธ์์๋ ๋ฌธ์ ์์ด ์ ๋จ๋๊ฒ... ์ ์๋ฐ๊น? ์๊ฐ์ ํ๋ค๊ฐ ์ง๊ธ ํ๋ก์ ํธ์ ๋ฒ๋ค๋ฌ๋ Vite์ด๋ฏ๋ก Vite์ ๋ฌธ์ ์ธ๊ฑธ๊น? ํ๊ณ ์ฐพ์์ ํด๊ฒฐ ํ ์ ์์๋ค. npm run dev ๋ช
๋ น์ด๋ก ๊ฐ๋ฐ ์๋ฒ๋ฅผ ๋์ธ๋ vite ์ ๊ธฐ๋ณธ ํธ์คํธ๋ localhost, ๊ธฐ๋ณธ ํฌํธ๋ 5173์ผ..
flex container ์์ ์๋ ์์์์๋ค ์ค์์ ํ ์์ดํ
๋ง ๋ฐ๋ก ์ ๋ ฌํ๊ณ ์ถ์ ๋ css์ margin ์์ฑ์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ์ง ์๊ณ ์์ฝ๊ฒ ์์ดํ
์ ์ ๋ ฌํ ์ ์๋ค. ์์ ์ ๋๋ ์ด flex container์์ ๋๋์ด์ง ๋ ๋ถ๋ถ์ ์๊ฐํด์ 2๊ฐ์ container๋ฅผ ๋ ๋ง๋ค๊ณ , ๊ทธ 2๊ฐ์ ์ปจํ
์ด๋๋ฅผ space-between ์์ฑ์ ์ฃผ์ด ์ฌ์ด ๊ณต๊ฐ์ ๋์ด์ฃผ๋ ์์ผ๋ก ๊ฐ๋ฐํ์๋ค. ๐ฅฒ ๊ทธ๋ฐ๋ฐ ์๋ฌด๋๋ ์ด ๋ฐฉ๋ฒ์ด ๋๋ฌด๋๋ ๋นํจ์จ์ ์ธ๊ฑฐ ๊ฐ์ ์ฐพ์๋ณด๋ ์ด๋ฐ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์์๋ค. flex container์์ ์์์ค์์ ์ ๋ ฌ๋๊ณ ์ถ์ ๋ถ๋ถ์ ๋ฐ๋ ์์ฑ์ margin ๊ฐ์ auto๋ก ์ค๋ค. ์ด ์์ ์์ ๋ฐ์ ๋ฑ๋ถ์ฌ์ ์ ๋ ฌ์ํค๊ณ ์ถ์ผ๋ฏ๋ก margin-top ์์ฑ auto ๋ฅผ ์ฃผ๋ฉด ๋ง๋ฒ๊ฐ์ด ์ปจํ
์ด๋์ ์๋๋ถ..
๋ฐ์ด๋๋ฆฌ ํ์
์ ํ์ผ ์๋ต ๋ชจํนํ๊ธฐ ์ง๊ธ ์ฌ๋ด ํ๋ก์ ํธ๋ ๋ฐฑ์๋ api์ ํ๋ฐํธ ๊ฐ๋ฐ์ ๋์์ ๋ณํ์ ์ผ๋ก ์งํํ๊ณ ์๋ค. ๋ฐ๋ผ์ ์๋ฒ๋จ API๊ฐ ์์ฑ๋๊ณ ๋ฐฐํฌ๋๊ธฐ ์ด์ ์๋ msw๋ผ๋ ์๋ฒ API ๋ชจํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ์ค์ ๋ฐฑ์๋ api ์์ด๋ ํ๋ฐํธ๋จ์์ mock ์๋ฒ๋ฅผ ๊ตฌํํด์ ๊ฐ์ง๋ก ๋คํธ์ํฌ ํต์ ์ ํ ์ ์๋ค. json ํ์์ผ๋ก ํต์ ์ ์ฃผ๊ณ ๋ฐ๋ ๊ฑด ๊ณต์๋ฌธ์์๋ ์ ๋์์์ด์ Mocking์ ํ์๋๋ฐ, ์ด๋ฒ์ ๋ฐ์ด๋๋ฆฌ ํ์
์ ์ด๋ฏธ์ง ํ์ผ์ get ํด์ค๋ ๋ถ๋ถ์์ ๋ชฉ์๋ฒ๋ฅผ ๊ตฌํํ๋๋ฐ ํฐ ๋๊ด์ด ์์๋ค. ์๋ต ์์ ํ๋ฐํธ์์ ์ด๋ฏธ์ง ํ์ผ์ get ํด์ฌ๋ ์๋ฒ์์ ์ฃผ๋ ์๋ต์ ์๋์ ๊ฐ๋ค. ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ฆ, ์๋ฒ์์๋ ์ด ๋ฉํฐ๋ฏธ๋์ด ๋ฐ์ดํฐ๋ฅผ 0๊ณผ 1 ๊ฐ๋ง ์กด์ฌํ๋ ์ด์ง ๋ฐ์ดํฐ๋ก ์๋ตํด์ฃผ๋ ..
MVVM ์ํคํ
์ณ ๋์์ธ ํจํด MVVM์ Model - View - View Model์ ์ฝ์๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋ presentation UI๋ฅผ ๋ถ๋ฆฌํ๋ ํจํด์ด๋ค. View ์ฑ์ ๋ณด์ฌ์ง๋ UI View Model ์ฑ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๊ณ ์์ ๋ทฐ์ ๋ชจ๋ธ ์ฌ์ด์์ ๋ทฐ์ ์์ฒญ์ ๋ฐ๋ผ ๋ก์ง์ ์คํ ๋ชจ๋ธ ๋ฐ์ดํฐ์ ๋ณํ์ ๋ฐ๋ผ ๋ทฐ๋ฅผ ๊ฐฑ์ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ, ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณต Model ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ ๋ทฐ๋ชจ๋ธ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์๋ต ๋ทฐ ui ์ปดํฌ๋ํธ์ด๋ค. ์์ ์ปดํฌ๋ํธ์์ props๋ก ์ ๋ฌ๋ฐ์ ์ํ์ ๋ฐ๋ผ์ ํ๋ฉด์ด ๋์ํ๋ค. ์ฌ์ฉ์๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ฉด ์ด๋ฒคํธ์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ทฐ์์ ๋ฐ๋ก ์ฒ๋ฆฌํ์ง์๊ณ , ์์ ์ปจํ
์ด๋์ธ View Model ์ปจํ
์ด๋์์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค. interface..