React๋ก ํผ์ ๋ง๋ค๊ณ , ์
๋ ฅ์ฐฝ์์ Enter ํค๋ฅผ ๋๋ฅด๋ฉด ๋ค์ ํ๋๋ก ํฌ์ปค์ค๋ฅผ ์ด๋์ํค๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.๊ทธ๋ฐ๋ฐ ํ๊ธ ์
๋ ฅ ์ ๋ง์ง๋ง ๊ธ์๊ฐ ๋ค์ ์ธํ ํ๋๋ก ์ด๋ํ๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ค.์์ด, ์ซ์, ํน์๋ฌธ์๋ ๋ฌธ์ ๊ฐ ์๊ณ , ํ๊ธ์์๋ง ๋ํ๋ฌ๋ค. ์์ธ: IME ์กฐํฉ ์ํ์ onKeyDown ์ด๋ฒคํธ ํ์ด๋ฐ์ ์ถฉ๋์ด ๋ฌธ์ ๋ IME(Input Method Editor, ์
๋ ฅ๊ธฐ) ์กฐํฉ ๋ฐฉ์๊ณผ ์ด๋ฒคํธ ๋ฐ์ ์์๊ฐ ์ถฉ๋ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค. IME์ ์
๋ ฅ ๋ฐฉ์ํ๊ธ์ ์กฐํฉํ ์
๋ ฅ ์ธ์ด๋ค. ์๋ฅผ ๋ค์ด ‘์ฌ’๋ผ๋ ๊ธ์๋ฅผ ์
๋ ฅํ ๋ ์ค์ ๋ก๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.• ์ฌ์ฉ์๊ฐ ‘ใ
’ ์
๋ ฅ• ‘ใ
’ ์
๋ ฅ → ์กฐํฉ → ‘์ฌ’ ์์ฑ์ด๋ ์กฐํฉ์ด ๋๋์ง ์์ ์ํ๋ ๋ธ๋ผ์ฐ์ ์์๋ isComposing = true ๋ก ํ๋จ๋๋ค..
ํ์ฌ ํ๋ก์ ํธ์์ ๊ฑฐ๋๋ช
์ธํ๋ฅผ A4 ๊ฐ๋ก ๋ฐฉํฅ(landscape)์ผ๋ก ์ธ์ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ์ต๋๋ค.- ํ๋ฉด์๋ ์ผ์ชฝ ์์ญ๋ง ํ์- ์ธ์ ์์๋ A4 ํ ์ฅ์ ๊ฝ ์ฑ์ ์ข/์ฐ ๋ชจ๋ ์ถ๋ ฅ (ํ๋๋ ๊ณ ๊ฐ์ฉ / ํ๋๋ ๋ด๋ถ์ฉ)- ์ธ์ ์ ์ ์ฉ ์คํ์ผ ์ ์ฉ (ํฐํธ ํฌ๊ธฐ, ์ฌ๋ฐฑ ๋ฑ ์กฐ์ )์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด React to Print์ useReactToPrint ํ
์ ์ฌ์ฉํ์ฌ, ํน์ DOM์ ๋ํด ์ธ์ ์์
์ ์งํํ์ต๋๋ค. ์ด ๊ธ์์๋ React to Print ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ํน์ ์ปดํฌ๋ํธ๋ฅผ ์ธ์ํ๊ณ , ์ธ์ ์์๋ง ์ ์ฉ๋๋ ์คํ์ผ์ ์ค์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ๊ณต์ ํด ๋ด
๋๋ค! ์ window.print()๊ฐ ์๋ React to Print?์ผ๋ฐ์ ์ผ๋ก ์น์์ ์ธ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ window.p..
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ๋ ์๋ก ๋ค๋ฅธ ์ญํ ์ ์ํํ๋ฉฐ, ๊ฐ๋ฐ์์๊ฒ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ์ฌ์ฉ ๋ฐฉ์์์๋ ์ฐจ์ด๊ฐ ์๋ค. 1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ์ ๊ธฐ๋ณธ ๊ฐ๋
๋ผ์ด๋ธ๋ฌ๋ฆฌ(Library)๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํน์ ๊ธฐ๋ฅ์ ์ํํ๋ ๋๊ตฌ๋ค์ ์งํฉ. ๊ฐ๋ฐ์๋ ํ์ํ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ์ฌ ํน์ ์์
์ ์ํํ ์ ์๋ค.๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋ฆ์ ์ง์ ์ ์ดํ์ง ์๋๋ค. ๋์ , ๊ฐ๋ฐ์๊ฐ ํ์ํ ๊ธฐ๋ฅ์ ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.ํ๋ ์์ํฌ(Framework)ํ๋ ์์ํฌ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๊ณ , ๊ทธ ์์์ ๊ฐ๋ฐ์ด ์ด๋ฃจ์ด์ง๋๋ก ํ๋ค. ํ๋ ์์ํฌ๋ ์ฝ๋์ ํ๋ฆ์ ์ ์ดํ๋ฉฐ, ๊ฐ๋ฐ์๋ ํ๋ ์์ํฌ๊ฐ ์ ์ํ๋ ๋ฐฉ์์ ๋ง์ถ์ด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.ํ๋ ์์ํฌ๋ “์ ์ด์ ์ญ์ (Inversion of Control..
Context๋? : Props Drilling์ ๋์ Context๋ ์ปดํฌ๋ํธ์์ Props๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ด๋ค. ํน์ ๋ฐ์ดํฐ๋ฅผ ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์ ๊ฑธ์ณ ์ฝ๊ฒ ๊ณต์ ํ ์ ์๊ฒ ํด์ค๋ค. Context๋ Props Drilling ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ค ์ ์๋ค. Props Drilling : ์ค์ฒฉ๋ ์ฌ๋ฌ ๊ณ์ธต์ ์ปดํฌ๋ํธ์๊ฒ props ์ ๋ฌ. ๋ฌธ์ ์ : ํน์ prop์ ์ฌ์ฉํ์ง ์๋ ์ปดํฌ๋ํธ๋ค์๊ฒ๋ ํด๋น prop์ ๋ด๋ ค์ฃผ์ด์ผ ํ๋ ๋นํจ์จ. ๊ฐ๋
์ฑ ํ๋ฝ. ์ปดํฌ๋ํธ ๊ฒฐํฉ๋ ์์น์ผ๋ก ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ๋ฐ์ ๊ฐ๋ฅ, ์ฝ๋์ ๋ณต์ก๋ ์ฆ๊ฐ context๋ ๋ฆฌ์กํธ ๋ฒ์ 16๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์กํธ ๋ด์ฅ API๋ก, ์ด๋ค ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ผ๋ ๋ฆฌ์กํธ๋ฅผ import ํ๋ฉด context๋ฅผ ๋ฐ๋ก ์์ฑํ๊ณ ..
React์์ ์ปดํฌ๋ํธ์ ์๋ช
์ฃผ๊ธฐ๋ ํฌ๊ฒ ์ธ ๋จ๊ณ๋ก ๊ตฌ๋ถ๋๋ค. : ๋ง์ดํ
(Mounting), ์
๋ฐ์ดํธ(Updating), ๊ทธ๋ฆฌ๊ณ ์ธ๋ง์ดํ
(Unmounting) ๊ฐ ๋จ๊ณ๋ ์ปดํฌ๋ํธ์ ์์ฑ, ์
๋ฐ์ดํธ ๋ฐ ํ๊ดด ๊ณผ์ ์ ํด๋นํ๋ค. 1. ๋ง์ดํ
(Mounting) ์ด ๋จ๊ณ๋ ์ปดํฌ๋ํธ๊ฐ ์ฒ์์ผ๋ก ์์ฑ๋์ด DOM์ ์ฝ์
๋๋ ๊ณผ์ ์ด๋ค. ๋ง์ดํธ ๊ณผ์ ์์๋ ์ฒ์์ผ๋ก render ๋ฉ์๋๊ฐ ํธ์ถ๋์ด ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ ๋๋ง ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ๋ง์ดํ
๋จ๊ณ์์ ํธ์ถ๋๋ค. (์์ฃผ ์ฌ์ฉ๋๋ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ ๋ณผ๋์ฒด) constructor(): ์ปดํฌ๋ํธ์ ์์ฑ์. ์ปดํฌ๋ํธ์ ์ด๊ธฐ ์ํ๋ฅผ ์ค์ ํ๋ค. static getDerivedStateFromProps(): ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋๊ธฐ ์ ์ ํธ์ถ๋๋ค. props์ ์ํด ..
useMemo ์ฌ์ฉ ๋ชฉ์ useMemo๋ React์์ ์ ๊ณตํ๋ ํ
(Hook) ์ค ํ๋๋ก, ์ฃผ๋ก ๋ ๊ฐ์ง ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ค. ๊ณ์ฐ ๋น์ฉ์ด ๋์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด - ๋ง์ฝ ์ปดํฌ๋ํธ๊ฐ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ์ฐ์ฐ์ ์ํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฌ์ฉํด์ผ ํ๋ค๋ฉด useMemo๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ํ์ํ ๋ ์ฌ์ฌ์ฉํ ์ ์๋ค. ์ฐธ์กฐ ๋์ผ์ฑ(Reference Equality)์ ์ ์งํ๊ธฐ ์ํด - React์์ ๊ฐ์ฒด๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ ๋ณต์กํ ๋ฐ์ดํฐ ํ์
์ props๋ก ๋๊ธธ ๋, ์ด ๋ฐ์ดํฐ๊ฐ ๋งค๋ฒ ์๋ก ์์ฑ๋๋ฉด ์์ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ์ฌ๋ ๋๋ง๋ ์ ์๋ค. useMemo๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์ ์ฅํ๋ฉด, ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํด๋ ๋์ผํ ์ฐธ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๋ค...
์ค๋ ๋ ์ง, ํ์ฌ ์๊ฐ ๊ฐ์ ธ์ค๊ธฐ const getDefaultDate = () => { const today = new Date(); const year = today.getFullYear(); const month = (today.getMonth() + 1).toString().padStart(2, '0'); const day = today.getDate().toString().padStart(2, '0'); const hours = today.getHours().toString().padStart(2, '0'); const minutes = today.getMinutes().toString().padStart(2, '0'); const seconds = today.getSeconds().toStrin..
interface IDownloadExcelParams { responseType?: ResponseType; } const fileAPI = { downloadExcel: (params: IDownloadExcelParams) => { return JSON.get(`file/excel`, params); }, } API ์ ์ ๋ถ๋ถ const [isDownloading, setIsDownloading] = useState(false); const downloadTemplate = async () => { try { setIsDownloading(true); const response = await fileAPI.downloadExcel({ responseType: 'blob', }); if (respon..