TypeScript์ ๋ชจ๋ ํด์ ์บ์ฑ ๋ฉ์ปค๋์ฆ ๋ค์ด๊ฐ๋ฉฐTypeScript๋ฅผ ์ฌ์ฉํ๋ค๊ฐ ์์์น ๋ชปํ ๋ชจ๋ ํด์ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ๋ง์ฃผ์น๊ฒ ๋์์ต๋๋ค. .d.ts ํ์ผ์ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ค๊ฐ ๋ค์ ์๋๋๋ก ๋๋๋ ธ์ ๋, ์ด์ ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ ๊ฐ์๊ธฐ ์ ์์ ์ผ๋ก ๋์ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ฐพ์๋ณด๋ ์ด๋ TypeScript์ ๋ชจ๋ ํด์ ์บ์ฑ ๋ฉ์ปค๋์ฆ ๋๋ฌธ์ด๋ผ๊ณ ํฉ๋๋ค. ์ด๋ฒ ํฌ์คํธ์์๋ ์ด ๋ฉ์ปค๋์ฆ์ ๋ํด ์์ธํ ์์๋ณด๊ณ , ์ค์ ๊ฒฝํํ๋ ๋ฌธ์ ์ ํด๊ฒฐ ๊ณผ์ ์ ๊ณต์ ํ๊ฒ ์ต๋๋ค.๋ชจ๋ ํด์์ด๋?๋ชจ๋ ํด์(Module Resolution)์ ์ปดํ์ผ๋ฌ๊ฐ import๊ฐ ๋ฌด์์ ์ฐธ์กฐํ๋์ง ์์๋ด๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ์๋ฅผ ๋ค์ด:import { a } from "moduleA";์ด๋ฐ import ๋ฌธ์์ ์ปดํ์ผ๋ฌ๋ a์ ๋ชจ๋ ์ฌ์ฉ์ ๊ฒ์ฌํ๊ธฐ ์ํด moduleA๊ฐ ์ ํํ .. Promise.all()๊ณผ ๋น๋๊ธฐ ์ฒ๋ฆฌ - ์ฝ์ ๋ก๊ทธ๋ง ์ถ๊ฐํ๋๋ฐ ๋ฒ๊ทธ๊ฐ ๊ณ ์ณ์ก๋ค? ๐ค ๋ฌธ์ ์ํฉReact ํ๋ก์ ํธ์์ Firebase Firestore๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ณผ์ ์์ ์ฌ๋ฏธ์๋ ํ์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์๋ฅผ ์๋ฃํ ์ฌ์ฉ์๋ค์ ๋๋ค์์ ํ์ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ค, ๋ช๋ช ์์์ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์์ ๋๋ค์์ด ํ์๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ๋ฌธ์ ํด๊ฒฐ์ ์ํด ์ฝ์ ๋ก๊ทธ๋ฅผ ์ถ๊ฐํ๋๋ฐ, ๋๋๊ฒ๋ ๋ก๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ง์ผ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค! ๐ ์์ธ ๋ถ์์๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค:const fetchUserNicknames = async (userIds: string\[\]) => { if (!userIds.length) return; try { const nicknames: { \[key: string\]: string } = {}; .. ๋ฆฌ์กํธ ์๋ฐ์คํฌ๋ฆฝํธ -> ํ์ ์คํฌ๋ฆฝํธ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ! 1. ์ปดํฌ๋ํธ ์ ์ธ ๋ฐฉ์// ๊ธฐ์กด JSconst Dashboard = () => { // ...}// ๋ณํ๋ TSXconst Dashboard: React.FC = () => { // ...}React.FC (Function Component) ํ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ธํ์ฌ TypeScript์๊ฒ ์ด ์ปดํฌ๋ํธ๊ฐ React ์ปดํฌ๋ํธ์์ ์๋ ค์ค๋ค์ด๋ ๊ฒ ํ๋ฉด ์ปดํฌ๋ํธ์ props ํ์ ์ ์๋์ผ๋ก ์ถ๋ก ํ ์ ์์ผ๋ฉฐ, React ๊ด๋ จ ํ์ ์ฒดํฌ๋ ๊ฐ๋ฅํ๋ค์ต์ React์์๋ React.FC ๋์ React.ComponentType์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๋ค 2. Props ํ์ ์ ์// ๊ธฐ์กด JSconst CategoryEditor = ({ onClose }) => { // ...}// ๋ณํ๋ TSXinterfac.. ๐ Styled Components๋ก ๋ผ์ดํธ/๋คํฌ ๋ชจ๋ ์ ํํ๊ธฐ ์ค์ ํ๋ก์ ํธ์์๋ ์ฌ์ฉ์์๊ฒ ๋คํฌ ๋ชจ๋์ ๋ผ์ดํธ ๋ชจ๋๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํ UX ์์ ์ค ํ๋์ด๋ค.styled-components์ ThemeProvider๋ฅผ ํ์ฉํ๋ฉด ์ ์ญ ํ ๋ง ์ ํ์ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ค.โ 1. ํ ๋ง ๊ฐ์ฒด ์ ์ํ๊ธฐ// themes.jsexport const lightTheme = { textColor: "#111", backgroundColor: "whitesmoke",};export const darkTheme = { textColor: "whitesmoke", backgroundColor: "#111",};โ 2. App์์ ํ ๋ง ์ํ ๊ด๋ฆฌ์ฌ๋ฌ๊ฐ์ property๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋๊ฐ (๋คํฌ/๋ผ์ดํธ) ์ค์ ํจ์ผ๋ก์จ ๊ฐํธํ๊ฒ theme์ ๋ฐ๊ฟ ์ ์๋ค. // Ap.. Styled Components - ์ ๋๋ฉ์ด์ , ์ปดํฌ๋ํธ ์ ํ์, ์ค์ฒฉ ์คํ์ผ๋ง ์ด๋ฒ์ ๋๋ฌ์ด๋ณผ ๊ธฐ์ต์ .. keyframes ๋ const ๋ก ๋ฐ๋ก ๋นผ์ ๊ด๋ฆฌํ๋ ๊ฑฐ + styled component ์กฐ๊ฑด๋ฌธ์ฒ๋ผ ์ฐ๊ธฐ !! โ ํ์ ์ ๋๋ฉ์ด์ ๋ง๋ค๊ธฐ๋จผ์ keyframes๋ฅผ ์ฌ์ฉํด ํ์ ํ๋ ์ ๋๋ฉ์ด์ ์ ์ ์ํ๋ค.import styled, { keyframes } from "styled-components"; const rotationAnimation = keyframes` 0% { transform: rotate(0deg); border-radius: 0px; } 50% { border-radius: 100px; } 100% { transform: rotate(360deg); border-radiu.. Styled Component์์ ์ปดํฌ๋ํธ ํ์ฅํ๊ธฐ ์๋ ์ ๋ฆฌ์กํธ ์ฒ์ ์ตํ๋ ๋ค ๊ณต๋ถํ๋ ๊ฒ ๊ฐ์๋ฐ, ํ๋ก์ ํธ๋ค์ ํ๋ค๋ณด๋ ๋น์ทํ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ ๋ฌด์ํ๊ณ ๊ณ์ ํ๋ค๊ฐ .. '์ ์๋ ์ ์ด๊ฑฐ ๊ณต๋ถํ์๋๋ฐ .. ' ์ถ์ด์ ์ ๋ฆฌํ๊ฒ๋๋ค. ์ผ๋จ ๊ทธ ์ ์ styled component ๋ฅผ ์ฐ๋ ์ด์ ๋ ๊ธฐ์กด์ div๋ฅผ ๋ง๋ค๊ณ className ์ด๋ style์ ๋ถ์ฌํ๋ ์์ด์์ง๋ง,๋์ styled๋ฅผ ์ํฌํธ ํด์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ html ์์ ์ฌ์ฉํ๊ณ ์ถ์ ํ๊ทธ๋ฅผ ์ง์ ํ๊ณ , ๋ฐฑํฑ ์์ css์ฝ๋๋ฅผ ์ ์ด์ค๋ค. -> ์ปดํฌ๋ํธ ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด ์คํ์ผ๋ง ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ, ์ปดํฌ๋ํธ ํจ์ ์์ ์คํ์ผ์ ์ ์ ํ์๊ฐ ์๊ณ , ๊ฐ๋ ์ฑ์ด ์ข์์ง๋ค. ๋๋ ํผ์งํ or ๋ง์ด ์ฌ์ฉํ ๋งํ ์ปดํฌ๋ํธ๋ค์ ์คํ์ผ ์ปดํฌ๋ํธ๋ก ์ง์ ํ๊ณ , ๊ทธ ์์ ์์ํ ํ ์คํธ๋ ๋ฒ.. ๋ฆฌ์กํธ ํด๋๊ตฌ์กฐ์ ์ ์์ด ์์๊น ์ฐ๋ฆฌ๊ฐ ์ฝ๋ฉํ src ํด๋ ์ฌ์ค ๋ ธ๋ง๋์ฝ๋๋ฅผ ๋ฐ๋ผํ๊ธฐ ๋๋ฌธ์.. ๊ทธ๋ฆฌ๊ณ ์ด๋ฒ ํ๋ก์ ํธ๋ ๊ทธ ์์์ ์ถฉ๋ถํ ์ปค๋ฒ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํด๋๊ตฌ์กฐ์ ๋ํ ๊ณ ๋ฏผ์ ํ ํ์๊ฐ ์์์ง๋ง ๊ทธ๋๋ ํด๋ ์คํธ๋ญ์ณ์ ๊ด์ฌ์ด ๋ง์ ๋๋ ์ฐพ์๋ณด์๋ค! ํ๋ฌํฐ์ ๋ค๋ฅด๊ฒ, ๋๋ถ๋ถ ๊ฑฐ์ ํต์ผ๋ ํด๋ ์คํธ๋ญ์ณ๋ฅผ ๊ฐ์ถ์ด ์์ ์ ํ๋ ๋ชจ์ต์ ๋ณผ ์ ์์๋ค. ๊ทธ๋์ ์์ผ๋ก ๋ด๊ฐ ๋ณด๊ณ ๊ณ์ํด์ ์ฐธ๊ณ ํ ๋งํ ๋ด์ฉ์ ๊ฐ์ ธ์๋ดค๋ค ..! CRA์ ์ด๊ธฐ ํด๋๊ตฌ์กฐ my-app โโโ node_modules โโโ public โโโ src โโโ .gitignore โโโ package.json โโโ README.md node_modules ํ์ฌ ํ๋ก์ ํธ์ ํฌํจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์ค์น๋์ด ์๋ ํด๋๋ก ๋ณดํต ๊น๊ณผ ๊ฐ์ ์ ์ฅ์์ ์ฌ๋ฆด ๋๋ ์ด ํด๋๋ฅผ ํจ๊ป ์ฌ๋ฆฌ.. ๊ฐ๋ฐ์๋๊ตฌ ์ผ๋ฌด์ฅ๊ฒ ์ฐ๊ธฐ โจ ๊ฐ๋ฐ์๋๊ตฌ ์คํํ๊ธฐ F12 Ctrl + Shift + i Elements : html/CSS ์ํ ํ์ธ Console : ์ฝ์ (๋ณ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์ค๋ฅ ๋ฉ์์ง ํ์) Sources : ์คํฌ๋ฆฝํธ ๋๋ฒ๊น (break point ์ง์ ๋ฐ ๋ณ์ ๋ชจ๋ํฐ๋ง ๋ฑ) Network : ๋ธ๋ผ์ฐ์ ์์ ๋ฐ์ํ๋ ํต์ ์ํ Performance(์์ Timelineํจ๋) : ์ฑ๋ฅ ์ธก์ Memory(์์ Profiles ํจ๋) : ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํํ๋ฅผ ์์ฑํ๊ณ ๋์ ํ์. Application(์์ Resources ํจ๋) : ์ฟ ํค ๋ฐ ์คํ ๋ฆฌ์ง ๋ฑ์ ๋ด์ฉ ์์ง Audits : ํ์ด์ง๋ฅผ ๋ถ์ํ๊ณ ์ต์ ํ๋ฅผ ์ํ ํ ๋์ด Security : Mixed content ์ด์, ์ธ์ฆ์ ๋ฌธ์ ๋ฑ์ ๋๋ฒ๊น ๐ ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ ๋จ์ถํค ๋ชจ.. ๋ฐ์ํ ์น์์์ ์ปจํ ์ด๋ ํฌ๊ธฐ ๋ฐ์ํ ์น์ด๋ ๋ธ๋ผ์ฐ์ ๋์ด์ ๋ฐ๋ผ ์ต์ ํ๋ ์ฌ์ดํธ๋ฅผ ๋งํฉ๋๋ค. ์ถ๋ ฅ๋ฌผ๊ณผ๋ ๋ฌ๋ฆฌ ์น ํผ๋ธ๋ฆฌ์ฑ ์์ ์ด ๋ค์ด๊ฐ๋ฉฐ, ์ฝ๋๋ก ๊ตฌํ๋๊ธฐ ๋๋ฌธ์ ๊ณ ์ ๊ฐ์ธ ๋์์ธ์ ์ก์์ค ๋ PC / Tablet / Mobile ์ด๋ฐ ์์ผ๋ก ์ต์ ํ๋ ์์์ผ๋ก ์ก์์ค์ผ ๋ฉ๋๋ค. PC const ProjectComponent=styled.div` .contentsbox{ width: 1140px; height: 100%; margin: 0px auto; display: flex; flex-direction: column; } ... ` ์ฐ์ ์ ํฌ๊ฐ ์ฌ์ฉํ ๋ฐฉ๋ฒ!! (์ค์ ์ฝ๋ ๊ฐ์ ธ์์ต๋๋ค) ์ ํฌ๋ ์ปจํ ์ด๋๋ฅผ 1140px๋ก ์ก์๊ณ , ์์ชฝ์ margin์ auto๋ก ์ฃผ์ด ์ผํฐ์ ๋์์ต๋๋ค! ๊ทธ๋ฆฌ๊ณ ์ ์ฒด width๋ฅผ 1280px ์ด์์ด๋ผ๊ณ .. ์ด์ 1 2 ๋ค์