2023. 12. 1. 13:06ใDevelopment๐ฉ๐ป๐ฆณ/Tutorial
๊ฒ์์ผ๋ก ์ ์ ๋์ ๋ถ๋ค์
ctrl + f , Command+fํค๋ก ์ํ์๋ ์๋ฃ ์ฐพ์์ฃผ์ธ์!
๋ฆฌ์กํธ ํํ ๋ฆฌ์ผ ์์ํ๊ฒ ์ต๋๋ค๐
1.npx create-react-app a -?
ํด๋น ๋ช ๋ น์ด๋ Node.js ํ๊ฒฝ์์
React ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ก ์์ฑํ๊ธฐ ์ํ ๋ช
๋ น์ด์
๋๋ค.
์ด ๋ช
๋ น์ด์ ๊ฐ ๋ถ๋ถ์ ๊ตฌ์ฒด์ ์ผ๋ก ํด์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
npx: Node.js ํ๊ฒฝ์์ ์คํ๋๋ ํจํค์ง ์คํ ๋๊ตฌ์
๋๋ค.
npx๋ฅผ ์ฌ์ฉํ๋ฉด, Node Package Manager(NPM)์
ํตํด ํจํค์ง๋ฅผ ์ค์นํ์ง ์๊ณ ๋ ํจํค์ง๋ฅผ ์คํํ ์ ์์ต๋๋ค.
create-react-app -?
create-react-app์
React ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ์
๋๋ค.
์ด ๋๊ตฌ๋ React ํ๋ก์ ํธ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ค์ ํ๊ณ
ํ์ํ ์์กด์ฑ๋ค์ ์๋์ผ๋ก ์ค์นํฉ๋๋ค.
a: ์ด ๋ถ๋ถ์ ์๋ก ์์ฑ๋ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋ฆ์
๋๋ค.
์ด ๊ฒฝ์ฐ, ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋ฆ์ด 'a'๊ฐ ๋ฉ๋๋ค.
๋ฐ๋ผ์, npx create-react-app a ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด,
'a'๋ผ๋ ์ด๋ฆ์ ์๋ก์ด React ์ ํ๋ฆฌ์ผ์ด์
ํ๋ก์ ํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
์ด ํ๋ก์ ํธ์๋ React ์ฑ์ ๊ฐ๋ฐํ๋๋ฐ ํ์ํ ๊ธฐ๋ณธ ํ์ผ๊ณผ
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ํฌํจ๋ ๊ฒ์
๋๋ค.
npm (Node Package Manager)๋ JavaScript
๊ฐ๋ฐ์๋ค์ ์ํ ํด๊ณผ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ํ๋ซํผ์
๋๋ค.
GitHub์ด ์ด์ํ๋ฉฐ, npm Registry์ npm CLI๋ฅผ
๋ฌด๋ฃ๋ก ์ ๊ณตํ๊ณ ์์ต๋๋คโโ.
npm์ ํตํด JavaScript ๊ฐ๋ฐ์ ์์ํ ์ ์์ผ๋ฉฐ,
npm Pro ๋ฒ์ ์์๋ ํ๋ผ์ด๋น ํจํค์ง์ ๊ฐ์ ํ๋ฆฌ๋ฏธ์ ๊ธฐ๋ฅ์
์ด์ฉํ ์ ์์ต๋๋คโโ. ์ ์ธ๊ณ 1700๋ง ๋ช
์ด์์ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ,
200๋ง ๊ฐ ์ด์์ ํจํค์ง๋ฅผ ํฌํจํ ์ธ๊ณ ์ต๋์ ์ํํธ์จ์ด ๋ ์ง์คํธ๋ฆฌ๋ก,
JavaScript ์ฝ๋ ๊ณต์ ์ ์ค์ฌ์ด ๋๊ณ ์์ต๋๋คโโ.
node --version : ํ์ฌ ์ค์น๋ node.js๋ฒ์ ํ์ธ์ด ๊ฐ๋ฅํ ํฐ๋ฏธ๋ ๋ช
๋ น์ด
node --version : ํ์ฌ ์ค์น๋ node.js๋ฒ์ ํ์ธ์ด ๊ฐ๋ฅํ ํฐ๋ฏธ๋ ๋ช
๋ น์ด
create-react-app
This package includes the global command for Create React App.
Please refer to its documentation:
Getting Started – How to create a new app.
User Guide – How to develop apps bootstrapped with Create React App.
npx create-react-app์ด๋?
npx: Node.js ํจํค์ง ์คํ ๋๊ตฌ๋ก,
ํจํค์ง๋ฅผ ๊ธ๋ก๋ฒ๋ก ์ค์นํ์ง ์๊ณ ๋ ์คํํ ์ ์๊ฒ ํด์ค๋๋ค.
create-react-app: React ์ ํ๋ฆฌ์ผ์ด์
์ ์
์
ํ๊ธฐ ์ํ ์คํ ๋์ผ๋ก ๋๊ตฌ์
๋๋ค.
npx create-react-app my-app ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด,
create-react-app์ ์ผ์์ ์ผ๋ก ๋ค์ด๋ก๋ํ๊ณ ์คํํ์ฌ
'my-app'์ด๋ผ๋ ์ด๋ฆ์ ์๋ก์ด ๋ฐ์ํ React ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ create-react-app์ ๋งค๋ฒ ์ฌ์ฉํ ๋๋ง๋ค
์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๊ฒ ํด์ค๋๋ค.
(์ฌ์ฉ์ ๋ง์ ๋ฆฌ์กํธ ๊ด๋ จ ์ข
์์ฑ๋ค์ ํ๋ฒ์ ์ค์น์์ผ์ค๋ค)
cd ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์กํธํจํค์ง๊ฐ ๊น๋ ค์๋ ํด๋๋ก ์ ํํ๊ฒ ์ด๋ํด์
npm start
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด ์ฃผ์ ์ผํฉ๋๋ค
๋ค๋ฅธ ํ์ผ์์ ์คํํธ ๋ช ๋ น์ด ์ ๋ ฅ์ ์ค๋ฅ๊ฐ ๋น๋๋ค
ํด๋์ ๋ง์ถฐ ์ ๋ ฅํ์ ์ํ์์๋ ๋ฆฌ์กํธ
๊ฐ๋ฐํ๋ฉด์ด ๋จ์ง ์์๊ฒฝ์ฐ์๋
ํด๋น ๋ก์ปฌ URL์ ์น์ฌ์ดํธ๊ฒ์์ฐฝ์ ๋์์ฃผ์ธ์!
๊ทธ๋ผ ๊ฐ๋ฐํ๋ฉด์ด ๋ค์ด์ค๊ฒ๋ฉ๋๋ค ใ
ctrl+c๋จ์ถํค๋ฅผ ๋๋ฅด์๋ฉด ๋ก์ปฌ์๋ฒ์ ์ฐ๊ฒฐ์ ๋์์๋ ์์ต๋๋ค
package.json
"name": "a": ํ๋ก์ ํธ์ ์ด๋ฆ์ "a"๋ก ์ ์ํฉ๋๋ค.
"version": "0.1.0": ํ๋ก์ ํธ์ ํ์ฌ ๋ฒ์ ์ ๋ํ๋
๋๋ค.
"private": true: ์ด ์ต์
์ ํ๋ก์ ํธ๋ฅผ ๋น๊ณต๊ฐ๋ก ์ค์ ํฉ๋๋ค. ์ด๋ฅผ true๋ก ์ค์ ํ๋ฉด, ์ด ํ๋ก์ ํธ๋ npm ๋ ์ง์คํธ๋ฆฌ์ ๊ณต๊ฐ์ ์ผ๋ก ๊ฒ์๋์ง ์์ต๋๋ค.
"dependencies": ํ๋ก์ ํธ๊ฐ ์์กดํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ชฉ๋ก์
๋๋ค.
๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฒ์ ๋ฒํธ์ ํจ๊ป ๋์ด๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด:
react: React ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
react-dom: React DOM ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
react-scripts: React ์ ํ๋ฆฌ์ผ์ด์
์ ๋น๋ํ๊ณ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
@testing-library/...: ํ
์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๋ก, React ์ปดํฌ๋ํธ๋ฅผ ํ
์คํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
web-vitals: ์น ์ฑ์ ์ฑ๋ฅ ์ธก์ ์ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
์ด ํ์ผ์ ํ๋ก์ ํธ์ ์ค์ ์ ์ ์ํ๊ณ , ํ์ํ ๋ชจ๋ ์์กด์ฑ๋ค์ด ์ ํํ ๋ฒ์ ์ผ๋ก ์ค์น๋๋๋ก ๋ณด์ฅํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. npm์ด๋ Yarn๊ณผ ๊ฐ์ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ํตํด ์ด๋ฌํ ์์กด์ฑ๋ค์ ๊ด๋ฆฌํ๊ฒ ๋ฉ๋๋ค
"start-react": "react-scripts start": npm run start-react ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด
React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐ ๋ชจ๋์์ ์์ํฉ๋๋ค.
์ด ๋ช ๋ น์ ๋ณดํต ๋ก์ปฌ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ๊ตฌ๋ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ธ๋ผ์ฐ์ ์์ ์๋์ผ๋ก ์ฝ๋๋ค.
"build": "react-scripts build": npm run build ๋ช
๋ น์ด๋ ํ๋ก๋์
(๋ฐฐํฌ)์ฉ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๋น๋ํฉ๋๋ค.
์ด ๋ช ๋ น์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ๊ณ , ๋ชจ๋ ํ์ผ์ build ํด๋์ ์ปดํ์ผํฉ๋๋ค.
"test": "react-scripts test": npm run test ๋ช
๋ น์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ํ
์คํธ ์ผ์ด์ค๋ฅผ ์คํํฉ๋๋ค.
์ด๋ ์ฃผ๋ก Jest ๊ฐ์ ํ ์คํธ ๋ฌ๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค.
"eject": "react-scripts eject": npm run eject ๋ช
๋ น์ด๋ create-react-app
๋๊ตฌ๊ฐ ์ ๊ณตํ๋ ์จ๊ฒจ์ง ์ค์ ํ์ผ๊ณผ ์คํฌ๋ฆฝํธ๋ฅผ
์ฌ์ฉ์๊ฐ ์ง์ ์์ ํ ์ ์๋๋ก ํฉ๋๋ค.
์ด ๋ช ๋ น์ ์คํํ๋ฉด ํ๋ก์ ํธ์ ๊ตฌ์ฑ ์ค์ ์ด ๋ ์ด์ ์จ๊ฒจ์ง์ง ์๊ณ ์ง์ ํธ์งํ ์ ์์ต๋๋ค.
์ด ์คํฌ๋ฆฝํธ๋ค์ ํตํด ๊ฐ๋ฐ์๋ ํ๋ก์ ํธ์ ๋น๋, ์คํ, ํ ์คํธ ๋ฑ์ ๊ณผ์ ์ ๊ฐํธํ๊ฒ ์ํํ ์ ์์ต๋๋ค.
์ด ์ฝ๋๋ eslintConfig ์ค์ ์ ์ผ๋ถ๋ก,
JavaScript ๋๋ TypeScript ํ๋ก์ ํธ์์ ESLint์ ์ค์ ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
ESLint๋ ์ฝ๋ ํ์ง๊ณผ ์ฝ๋ฉ ์คํ์ผ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ธฐ ์ํ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ์ ๋๋ค.
์ด ์ค์ ์ React ์ ํ๋ฆฌ์ผ์ด์
์ ํนํ๋์ด ์์ต๋๋ค. ๊ฐ ์์์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
"eslintConfig": ์ด๊ฒ์ ESLint ๊ตฌ์ฑ์ ๋ด๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๋ํ๋
๋๋ค.
"extends": ์ด ๋ฐฐ์ด์ ํ๋ก์ ํธ๊ฐ ํ์ฅํ๊ฑฐ๋ ์ฌ์ฉํ ๊ธฐ๋ณธ ESLint ์ค์ ์ ์ ์ํฉ๋๋ค.
์ฌ๊ธฐ์ ํฌํจ๋ ์ค์ ์ ๊ธฐ์กด ๊ท์น์ ์ค๋ฒ๋ผ์ด๋ํ๊ฑฐ๋ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
"react-app": ์ด ์ค์ ์ Create React App์ ์ํด ์ ๊ณต๋๋ ๊ธฐ๋ณธ ESLint ์ค์ ์ ๋ํ๋
๋๋ค.
์ด ์ค์ ์ React ํ๋ก์ ํธ์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ท์น๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํฌํจํฉ๋๋ค.
"react-app/jest": ์ด ์ถ๊ฐ ์ค์ ์ Jest์ ๊ด๋ จ๋ ESLint ๊ท์น์ ํฌํจํฉ๋๋ค.
Jest๋ JavaScript ํ๋ก์ ํธ์์ ์ฌ์ฉ๋๋ ์ธ๊ธฐ ์๋ ํ ์คํ ํ๋ ์์ํฌ์ ๋๋ค.
์ด ์ค์ ์ Jest๋ฅผ ์ฌ์ฉํ์ฌ ํ
์คํธ๋ฅผ ์์ฑํ ๋ ์ฝ๋ฉ ๊ท์น๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ฉํฉ๋๋ค.
์ด ๊ตฌ์ฑ์ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ESLint ๊ท์น์ ์ค์ ํ์ฌ, ์ฝ๋ฉ ์คํ์ผ๊ณผ ํ์ง์ ์ ์งํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
์ฝ๋์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ , ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์ด ์ฝ๋๋ "browserslist" ์ค์ ์ ์ผ๋ถ์ ๋๋ค.
์ด ์ค์ ์ ์น ํ๋ก์ ํธ์์ ์ง์ํด์ผ ํ ๋ธ๋ผ์ฐ์ ์ ๋ฒ์ ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
browserslist ์ค์ ์ ๋ค์ํ ํ๋ก ํธ์๋ ๋๊ตฌ์ ์ํด ์ฌ์ฉ๋๋ฉฐ,
์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ์์ ์ ์ฝ๋๊ฐ ์ด๋ค ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์๋ํด์ผ ํ๋์ง ๋ช ์ํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์์ ๊ตฌ์ฒด์ ์ธ ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
"browserslist": ์ด ๊ฐ์ฒด๋ ํ๋ก์ ํธ์์ ์ง์ํด์ผ ํ ๋ธ๋ผ์ฐ์ ์ ๊ทธ ๋ฒ์ ์ ์ ์ํฉ๋๋ค.
"production": ์ด ๋ฐฐ์ด์ ํ๋ก๋์
๋น๋์ ์ ์ฉ๋ ๋ธ๋ผ์ฐ์ ์ ๋ชฉ๋ก์ ์ ์ํฉ๋๋ค.
์ฆ, ์ค์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์ต์ข
์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฉ๋๋ ์ค์ ์
๋๋ค.
">0.2%": ์ด ์กฐ๊ฑด์ ์ ์ธ๊ณ์ ์ผ๋ก ์ฌ์ฉ์์ 0.2%
์ด์์ ์ํด ์ฌ์ฉ๋๋ ๋ธ๋ผ์ฐ์ ๋ฒ์ ์ ํฌํจํ๋ผ๋ ์๋ฏธ์ ๋๋ค.
์ด๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ธ๋ผ์ฐ์ ๋ฒ์ ์ ๋์์ผ๋ก ํฉ๋๋ค.
"not dead": ์ด ์กฐ๊ฑด์ "์ฃฝ์" ๋ธ๋ผ์ฐ์ ๋ฅผ ์ ์ธํ๋ผ๋ ์๋ฏธ์
๋๋ค. ์ฌ๊ธฐ์ "์ฃฝ์" ๋ธ๋ผ์ฐ์ ๋ ๊ณต์์ ์ผ๋ก ์ง์์ด ์ข
๋ฃ๋์๊ฑฐ๋, ์ต๊ทผ 24๊ฐ์ ๋์ ์
๋ฐ์ดํธ๊ฐ ์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
"not op_mini all": ์ด ์กฐ๊ฑด์ Opera Mini ๋ธ๋ผ์ฐ์ ์ ๋ชจ๋ ๋ฒ์ ์ ์ ์ธํ๋ผ๋ ์๋ฏธ์
๋๋ค.
Opera Mini๋ ํน์ ์ต์ ํ ๋ฐ ์ ํ์ด ์๋ ๋ธ๋ผ์ฐ์ ์ด๊ธฐ ๋๋ฌธ์
์ผ๋ถ ์น ํ๋ก์ ํธ์์๋ ์ด๋ฅผ ์ง์ ๋์์์ ์ ์ธํ๊ธฐ๋ ํฉ๋๋ค.
์ด ์ค์ ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ํธํ์ฑ์ ๊ฒฐ์ ํ๋ ์ค์ํ ๋ถ๋ถ์
๋๋ค.
๊ฐ๋ฐ์๋ ์ด๋ฅผ ํตํด ์ด๋ค ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์์ ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ํด์ผ ํ๋์ง ์ ์ํ ์ ์์ผ๋ฉฐ,
์ด๋ ํธ๋์คํ์ผ๋ง, ํด๋ฆฌํ ์ ์ฉ, CSS ์ ๋์ฌ ์ถ๊ฐ ๋ฑ์ ํ๋ก์ธ์ค์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ด ์ฝ๋๋ "browserslist" ์ค์ ์ "development" ๋ถ๋ถ์ ๋ํ๋ ๋๋ค.
์ด ์ค์ ์ ๊ฐ๋ฐ ์ค์ธ ์น ํ๋ก์ ํธ์์ ์ง์ํด์ผ ํ ๋ธ๋ผ์ฐ์ ์ ๋ฒ์ ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๊ตฌ์ฒด์ ์ผ๋ก, ์ด ์ค์ ์ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ ์ฉ๋๋ฉฐ,
์ฌ๊ธฐ์ ์ ์๋ ๋ธ๋ผ์ฐ์ ๋ค์ ๊ฐ๋ฐ ๊ณผ์ ์์์ ํ ์คํธ ๋ฐ ๋๋ฒ๊น ์ ์ํ ๋์์ด ๋ฉ๋๋ค.
์ค์ ์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
"development": ์ด ๋ฐฐ์ด์ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฌ์ฉ๋ ๋ธ๋ผ์ฐ์ ์ ๋ฒ์ ์ ์ ์ํฉ๋๋ค.
"last 1 chrome version": ์ด ์กฐ๊ฑด์ ๊ฐ์ฅ ์ต๊ทผ์ ์ถ์๋ Chrome ๋ธ๋ผ์ฐ์ ์ ๋ง์ง๋ง ๋ฒ์ ์ ์ง์ํ๋ผ๋ ์๋ฏธ์
๋๋ค.
๊ฐ๋ฐ์๋ ์ด๋ฅผ ํตํด ์ต์ ๊ธฐ๋ฅ๊ณผ API๋ฅผ ํ์ฉํ ์ ์์ผ๋ฉฐ,
์ต์ ๋ฒ์ ์ Chrome์์์ ์ฑ๋ฅ๊ณผ ํธํ์ฑ์ ํ์ธํ ์ ์์ต๋๋ค.
"last 1 firefox version": ์ด ์กฐ๊ฑด์ ๊ฐ์ฅ ์ต๊ทผ์ ์ถ์๋ Firefox ๋ธ๋ผ์ฐ์ ์ ๋ง์ง๋ง ๋ฒ์ ์ ์ง์ํ๋ผ๋ ์๋ฏธ์
๋๋ค.
์ด๋ฅผ ํตํด ์ต์ Firefox ๋ฒ์ ์์์ ํธํ์ฑ ๋ฐ ๊ธฐ๋ฅ์ ํ์ธํ ์ ์์ต๋๋ค.
"last 1 safari version": ์ด ์กฐ๊ฑด์ ๊ฐ์ฅ ์ต๊ทผ์ ์ถ์๋ Safari ๋ธ๋ผ์ฐ์ ์ ๋ง์ง๋ง ๋ฒ์ ์ ์ง์ํ๋ผ๋ ์๋ฏธ์
๋๋ค.
Safari๋ ํนํ macOS์ iOS์์ ์ค์ํ ๋ธ๋ผ์ฐ์ ์ด๋ฏ๋ก,
๊ฐ๋ฐ์๋ ์ด๋ฅผ ํตํด Apple ๊ธฐ๊ธฐ์์์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ์ ํ
์คํธํ ์ ์์ต๋๋ค.
์ด ์ค์ ์ ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฐ ๊ณผ์ ์์ ์ฃผ๋ก ์ฌ์ฉํ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ ํ๋ฉฐ,
์ด๋ฅผ ํตํด ๊ฐ๋ฐ ๋ฐ ๋๋ฒ๊น ์๊ฐ์ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์๋๋ก ๋์ต๋๋ค.
ํ๋ก๋์ ํ๊ฒฝ๊ณผ ๋ฌ๋ฆฌ, ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋ณด๋ค ์ต์ ๋ฒ์ ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์์ผ๋ก ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ฉฐ,
์ด๋ฅผ ํตํด ์ต์ ์น ํ์ค๊ณผ ๊ธฐ์ ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
end package.json
package-lock.json
์ด ํ์ผ์ ํ๋ก์ ํธ์ ์์กด์ฑ(์ข ์์ฑ) ํธ๋ฆฌ์ ๋ํ ์ ํํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฉฐ,
ํ๋ก์ ํธ๊ฐ ์ด๋์์๋ ๋์ผํ ์์กด์ฑ์ ์ค์นํ ์ ์๋๋ก ํฉ๋๋ค.
๊ตฌ์ฒด์ ์ผ๋ก, ์ด ํ์ผ์ ๊ฐ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค:
"name": ํ๋ก์ ํธ์ ์ด๋ฆ์ ๋ํ๋
๋๋ค. ์ฌ๊ธฐ์๋ "a"๋ก ์ง์ ๋์ด ์์ต๋๋ค.
"version": ํ๋ก์ ํธ์ ํ์ฌ ๋ฒ์ ์ ๋ํ๋
๋๋ค. ์ด ๊ฒฝ์ฐ "0.1.0"์
๋๋ค.
"lockfileVersion": ์ด ๊ฐ์ package-lock.json ํ์ผ์ ํ์ ๋ฒ์ ์ ๋ํ๋
๋๋ค.
3์ npm ๋ฒ์ 7 ์ด์์์ ์ฌ์ฉ๋๋ lockfile ํ์์ ์๋ฏธํฉ๋๋ค.
"requires": ์ด ๊ฐ์ด true๋ก ์ค์ ๋๋ฉด, ์์กด์ฑ์ด ์ค์น๋ ๋ ํด๋น ๋ฒ์ ์ด ํ์ํ๋ค๋ ๊ฒ์ ๋ํ๋
๋๋ค.
"packages": ์ด ๊ฐ์ฒด๋ ํ๋ก์ ํธ์ ๋ฃจํธ ๋ ๋ฒจ์ ์๋ ํจํค์ง๋ค์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค. ์ฌ๊ธฐ์ "": { ... }๋ ํ๋ก์ ํธ์ ๋ฃจํธ ํจํค์ง๋ฅผ ๋ํ๋
๋๋ค.
๋ด๋ถ์๋ "dependencies" ํญ๋ชฉ์ด ์๋๋ฐ,
์ด๋ ํ๋ก์ ํธ๊ฐ ์์กดํ๋ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ ๊ทธ๋ค์ ๋ฒ์ ์ ๋์ดํฉ๋๋ค.
์๋ฅผ ๋ค์ด, "react": "^18.2.0"๋ React ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ 18.2.0 ๋ฒ์ ์ด์์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
^ ๊ธฐํธ๋ ํด๋น ๋ฒ์ ์ด์, ๋ค์ ๋ฉ์ด์ ๋ฒ์ ๋ฏธ๋ง์ ๋ฒ์ ์ ์ฌ์ฉํ ์ ์์์ ๋ํ๋ ๋๋ค.
์ด๋ฌํ ์ ๋ณด๋ ํ๋ก์ ํธ๊ฐ ์ผ๊ด๋ ํ๊ฒฝ์์ ์คํ๋ ์ ์๋๋ก ๋ณด์ฅํ๋ฉฐ,
๋ชจ๋ ๊ฐ๋ฐ์๋ ๋ฐฐํฌ ํ๊ฒฝ์์ ๋์ผํ ๋ฒ์ ์ ํจํค์ง๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
package-lock.json ํ์ผ์ ์๋์ผ๋ก ์์ฑ๋๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์๋์ผ๋ก ์์ ํ์ง ์์ต๋๋ค.
์ด ์ฝ๋๋ package-lock.json ํ์ผ์ ์ผ๋ถ๋ก,
JavaScript ๋๋ TypeScript ํ๋ก์ ํธ์์ ์ฌ์ฉ๋๋
ํน์ npm ํจํค์ง์ ๋ํ ์์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด ํ์ผ์ ํ๋ก์ ํธ์ ์์กด์ฑ ํธ๋ฆฌ๋ฅผ ์ ํํ๊ฒ ๊ธฐ์ ํ์ฌ,
์ด๋ ํ๊ฒฝ์์๋ ๋์ผํ ์์กด์ฑ์ด ์ค์น๋ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
(์ด์ฏค ๋๋ฉด ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ด ๋ฌ๋ผ์ ๋ด ์ฝ๋๋ ์ ๋ ฅ๊ฐ์ด ๋ค๋ฅด๋ค๋ ์ด์ผ๊ธฐ๋ ๋ชปํ ๋ฏ..)
์ฌ๊ธฐ์ ๋ํ๋ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
"node_modules/@aashutoshrathi/word-wrap": ์ด ๊ฒฝ๋ก๋ node_modules ํด๋ ๋ด์ ์๋
@aashutoshrathi/word-wrap๋ผ๋ npm ํจํค์ง๋ฅผ ๋ํ๋ ๋๋ค.
์ด๋ ํ๋ก์ ํธ๊ฐ ์ด ํจํค์ง๋ฅผ ์์กด์ฑ์ผ๋ก ํฌํจํ๊ณ ์์์ ์๋ฏธํฉ๋๋ค.
"version": ํจํค์ง์ ๋ฒ์ ์ ๋ํ๋
๋๋ค. ์ฌ๊ธฐ์๋ "1.2.6"์
๋๋ค.
"resolved": ์ด ํ๋๋ ํจํค์ง์ tarball(์์ถ๋ ํ์ผ)์ด ์์นํ
URL์ ๋ํ๋ ๋๋ค.
์ด URL(https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz)์ ํตํด
ํด๋น ๋ฒ์ ์ ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
"integrity": ์ด ๊ฐ์ ํจํค์ง์ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๊ธฐ ์ํ ํด์์
๋๋ค.
์ด ํด์ ๊ฐ์ ํจํค์ง ๋ค์ด๋ก๋ ์ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ์ ์ฌ์ฉ๋์ด,
์ฌ๋ฐ๋ฅธ ๋ฒ์ ์ ํจํค์ง๊ฐ ์ค์น๋์๋์ง ํ์ธํฉ๋๋ค.
"engines": ์ด ํ๋๋ ํจํค์ง๊ฐ ์๊ตฌํ๋ ์์ง(์: Node.js)์ ๋ฒ์ ์ ๋ช
์ํฉ๋๋ค.
์ฌ๊ธฐ์๋ Node.js ๋ฒ์ ">=0.10.0" ์ด์์ด ํ์ํ๋ค๊ณ ์ง์ ๋์ด ์์ต๋๋ค.
์ด๋ ํด๋น ํจํค์ง๊ฐ Node.js ๋ฒ์ 0.10.0 ์ด์์์ ์๋ํจ์ ์๋ฏธํฉ๋๋ค.
package-lock.json ํ์ผ์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋
๋ชจ๋ npm ํจํค์ง์ ๋ฒ์ , ์์ค, ๋ฌด๊ฒฐ์ฑ ๋ฑ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฉฐ,
ํ๋ก์ ํธ์ ์ผ๊ด์ฑ๊ณผ ์์ ์ฑ์ ์ ์งํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
์ด ํ์ผ์ ์๋์ผ๋ก ์์ฑ๋๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ์์ ํ์ง ์์ต๋๋ค.
.gitignore ํ์ผ์ Git ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์์
ํน์ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ถ์ ํ์ง ์๋๋ก ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด ํ์ผ์ ํ๋ก์ ํธ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ์์นํ๋ฉฐ,
Git์ด ํด๋น ํ์ผ๋ค์ ๋ฒ์ ๊ด๋ฆฌ ์์คํ
์ ํฌํจ์ํค์ง ์๋๋ก ํฉ๋๋ค. ๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
# dependencies/node_modules: node_modules
๋๋ ํ ๋ฆฌ๋ ํ๋ก์ ํธ์ ๋ชจ๋ npm ์์กด์ฑ์ด ์ค์น๋๋ ๊ณณ์ ๋๋ค.
์ด ๋๋ ํ ๋ฆฌ๋ ๋ณดํต ๋งค์ฐ ํฌ๊ธฐ ๋๋ฌธ์,
๋ฒ์ ๊ด๋ฆฌ์ ํฌํจ์ํค์ง ์์ต๋๋ค.
/.pnp, .pnp.js: ์ด ํ์ผ๋ค์ Yarn 2 (Berry)์ Plug'n'Play ๊ธฐ๋ฅ๊ณผ ๊ด๋ จ์ด ์์ผ๋ฉฐ,
๋ ธ๋ ๋ชจ๋์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
# testing
/coverage: ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๋๋ ํ ๋ฆฌ์ ๋๋ค.
์ด ๋ฐ์ดํฐ๋ ๊ฐ๋ฐ ์ค์๋ง ํ์ํ๋ฏ๋ก, ๋ฒ์ ๊ด๋ฆฌ์์ ์ ์ธ๋ฉ๋๋ค.
# production
/build: ๋น๋๋ ํ๋ก๋์
ํ์ผ์ด ์ ์ฅ๋๋ ๋๋ ํ ๋ฆฌ์
๋๋ค.
์ด ํ์ผ๋ค์ ๋ฐฐํฌ ์ ์ ์์ฑ๋๋ฉฐ, ์์ค ์ฝ๋์ ์ปดํ์ผ๋ ๋ฒ์ ์ ํฌํจํฉ๋๋ค.
# misc
.DS_Store: macOS ์์คํ
์์ ์์ฑ๋๋ ์จ๊ฒจ์ง ํ์ผ๋ก,
๋๋ ํ ๋ฆฌ์ ์ฌ์ฉ์ ์ ์ ์์ฑ์ ์ ์ฅํฉ๋๋ค.
.env.*: ํ๊ฒฝ ๋ณ์ ํ์ผ๋ค์
๋๋ค.
์ด๋ค์ ๋ณด์์์ ์ด์ ๋ก ๋ฒ์ ๊ด๋ฆฌ์ ํฌํจ๋์ง ์์ต๋๋ค.
npm-debug.log*, yarn-debug.log*, yarn-error.log*:
NPM๊ณผ Yarn์ ๋ก๊ทธ ํ์ผ๋ค์ ๋๋ค.
์ด๋ค์ ๋๋ฒ๊น ์ ์ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ฉฐ, ํ๋ก์ ํธ ์์ค ์ฝ๋์๋
์ง์ ์ ์ธ ๊ด๋ จ์ด ์์ด ๋ฒ์ ๊ด๋ฆฌ์์ ์ ์ธ๋ฉ๋๋ค.
์ด ํ์ผ์ ํ๋ก์ ํธ์ ๋ถํ์ํ๊ฑฐ๋ ๋ฏผ๊ฐํ ํ์ผ๋ค์ ๋ฒ์ ๊ด๋ฆฌ ์์คํ
์
ํฌํจ์ํค์ง ์๋๋ก ํ์ฌ, ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊น๋ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฝ๋๋ก ๋์ต๋๋ค.
reportWebVitals.js
์ด ์ฝ๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์
์ฑ๋ฅ ์งํ๋ฅผ ์ธก์ ํ๊ณ ๋ณด๊ณ ํ๋ ํจ์ reportWebVitals๋ฅผ ์ ์ํฉ๋๋ค.
์ด ํจ์๋ web-vitals ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ
์น ์ฌ์ดํธ์ ํต์ฌ ์ฑ๋ฅ ์งํ(Core Web Vitals)๋ฅผ ์ธก์ ํฉ๋๋ค.
์ฝ๋ ๋ด์ ๊ฐ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค:
reportWebVitals: ์ด๊ฒ์ ์ฑ๋ฅ ์งํ๋ฅผ ์ธก์ ํ๋ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์์
๋๋ค.
์ด ํจ์๋ ์น ์ฌ์ดํธ์ ์ฑ๋ฅ ์งํ๋ฅผ ์ธก์ ํ๊ณ ,
ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค.
onPerfEntry: ์ด๊ฒ์ ์ฝ๋ฐฑ ํจ์๋ก, ์ฑ๋ฅ ์ธก์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
if (onPerfEntry && onPerfEntry instanceof Function): ์ด ์กฐ๊ฑด๋ฌธ์ onPerfEntry๊ฐ ํจ์์ธ์ง ํ์ธํฉ๋๋ค.
๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด, ์ฑ๋ฅ ์ธก์ ๊ด๋ จ ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค.
import('web-vitals')...: ์ด ๋ถ๋ถ์ web-vitals ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ๋ถ๋ฌ์ต๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์น ์ฌ์ดํธ์ ์ฑ๋ฅ ์งํ๋ฅผ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {...}):
์ด ์ฝ๋ฐฑ ํจ์๋ web-vitals ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ์ฌ๋ฌ ์ฑ๋ฅ ์ธก์ ํจ์๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
getCLS(onPerfEntry): Cumulative Layout Shift (CLS)๋ฅผ ์ธก์ ํฉ๋๋ค. CLS๋ ํ์ด์ง ๋ ์ด์์์ ์์ ์ฑ์ ๋ํ๋
๋๋ค.
getFID(onPerfEntry): First Input Delay (FID)๋ฅผ ์ธก์ ํฉ๋๋ค. FID๋ ์ฌ์ฉ์์ ์ฒซ ๋ฒ์งธ ์
๋ ฅ์ ๋ํ ๋ฐ์ ์๊ฐ์ ๋ํ๋
๋๋ค.
getFCP(onPerfEntry): First Contentful Paint (FCP)๋ฅผ ์ธก์ ํฉ๋๋ค. FCP๋ ํ์ด์ง์ ์ฒซ ๋ฒ์งธ ์ฝํ
์ธ ๊ฐ ๋ก๋๋๋ ์๊ฐ์ ๋ํ๋
๋๋ค.
getLCP(onPerfEntry): Largest Contentful Paint (LCP)๋ฅผ ์ธก์ ํฉ๋๋ค. LCP๋ ํ์ด์ง์ ์ฃผ์ ์ฝํ
์ธ ๊ฐ ๋ก๋๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ํ๋
๋๋ค.
getTTFB(onPerfEntry): Time to First Byte (TTFB)๋ฅผ ์ธก์ ํฉ๋๋ค. TTFB๋ ๋ฐฉ๋ฌธ์๊ฐ ํ์ด์ง๋ฅผ ์์ฒญํ๊ณ ๊ทธ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ๋ฅผ ๋ฐ๊ธฐ๊น์ง์ ์๊ฐ์ ๋ํ๋
๋๋ค.
์ด ํจ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ์ต์ ํํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. Core Web Vitals๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์ ์ธก์ ํ๋ ์ค์ํ ์งํ๋ก, ์น ์ฌ์ดํธ์ ์ฑ๋ฅ์ ํ๊ฐํ๊ณ ๊ฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
logo.svg
์ด ์ฝ๋๋ SVG (Scalable Vector Graphics) ํ์์ ์ด๋ฏธ์ง๋ฅผ ๋ํ๋ ๋๋ค.
SVG๋ XML ๊ธฐ๋ฐ์ ๋ฒกํฐ ์ด๋ฏธ์ง ํฌ๋งท์ผ๋ก, ์น์์ ์ฌ์ฉํ๊ธฐ ์ ํฉํฉ๋๋ค.
๋ฒกํฐ ์ด๋ฏธ์ง๋ ํ๋๋ ์ถ์๋ฅผ ํด๋ ํ์ง์ด ๋จ์ด์ง์ง ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
์ด ์ฝ๋ ๋ด์ ์ฃผ์ ์์๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3">:
์ด ํ๊ทธ๋ SVG ์ด๋ฏธ์ง์ ์์์ ๋ํ๋ด๋ฉฐ, xmlns ์์ฑ์ SVG์ XML ๋ค์์คํ์ด์ค๋ฅผ ์ง์ ํฉ๋๋ค.
viewBox ์์ฑ์ ์ด๋ฏธ์ง์ ๋ณด์ด๋ ์์ญ์ ์ ์ํฉ๋๋ค.
<g fill="#61DAFB">: <g> ํ๊ทธ๋ ๊ทธ๋ฃน์ ๋ํ๋ด๋ฉฐ, ์ด ์์ ํฌํจ๋ ๋ชจ๋ ์์๋ ๊ฐ์ ์คํ์ผ ์์ฑ์ ๊ณต์ ํฉ๋๋ค.
์ฌ๊ธฐ์๋ fill ์์ฑ์ ํตํด ์์์ ์ค์ ํ๊ณ ์์ต๋๋ค.
์ด ๋ถ๋ถ์ ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋ธ๋์ผ๋ก ์์ด ๋ฐ๋๋๋ค
<path d="...">: <path> ํ๊ทธ๋ SVG ๋ด์์ ๋ณต์กํ ํํ๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
d ์์ฑ์ ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋๋ฐ, ์ด๋ ๋งค์ฐ ๋ณต์กํ ์ ์์ผ๋ฉฐ, ์ฌ๋ฌ ์ง์ ๊ณผ ๊ณก์ ์ ์ง์ ํ์ฌ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฝ๋๋ค.
<circle cx="420.9" cy="296.5" r="45.7">: <circle> ํ๊ทธ๋ ์์ ๊ทธ๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
cx์ cy ์์ฑ์ ์์ ์ค์ฌ ์ขํ๋ฅผ, r์ ์์ ๋ฐ์ง๋ฆ์ ์ง์ ํฉ๋๋ค.
<path> ํ๊ทธ๋ SVG (Scalable Vector Graphics) ๋ด์์ ์ฌ์ฉ๋๋ฉฐ, ๋ฒกํฐ ๊ธฐ๋ฐ์ ๊ทธ๋ํฝ์ ๊ทธ๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. <path> ํ๊ทธ์ d ์์ฑ์ ํด๋น ๊ฒฝ๋ก์ ํํ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ช
๋ น์ด๋ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ด๋ฌํ ๋ช
๋ น์ด๋ค์ ๊ฒฝ๋ก์ ์์์ , ๋์ , ๊ณก์ , ์ง์ ๋ฑ์ ๊ทธ๋ํฝ ์์๋ฅผ ๋ํ๋
๋๋ค.
์ฝ๋์์ <path d="M520.5 78.1z"/> ๋ถ๋ถ์ ๋ถ์ํด๋ณด๋ฉด:
M520.5 78.1: ์ฌ๊ธฐ์ M์ 'moveto' ๋ช
๋ น์ด๋ก, ๊ฒฝ๋ก์ ์๋ก์ด ์์์ ์ (520.5, 78.1)์ผ๋ก ์ง์ ํฉ๋๋ค. ์ด๊ฒ์ ๊ฒฝ๋ก๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์์ํ ์ขํ๋ฅผ ์ค์ ํฉ๋๋ค.
z: ์ด ๋ช
๋ น์ด๋ ๊ฒฝ๋ก๋ฅผ ๋ซ์ต๋๋ค. ์ฆ, ํ์ฌ ์ง์ ์์ ๊ฒฝ๋ก์ ์์์ ์ผ๋ก ๋์๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ซ์์ ์์ฑ๋ ๋ํ์ ๋ง๋ญ๋๋ค.
ํ์ง๋ง ์ด ์ฝ๋์์๋ M ๋ช
๋ น์ด ๋ค์์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ ๋ช
๋ น์ด๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด <path> ํ๊ทธ๋ ๋จ์ผ ์ง์ ์์ ์์ํ์ฌ ๊ฐ์ ์ง์ ์์ ๋๋๋ ๊ฒฝ๋ก๋ฅผ ๋ํ๋
๋๋ค. ์ค์ ๋ก ์ด๋ ์๊ฐ์ ์ผ๋ก ์๋ฌด๊ฒ๋ ๋ํ๋ด์ง ์๋, ๋ถ์์ ํ ํน์ ์๋์ ์ผ๋ก ๋น ๊ฒฝ๋ก์ผ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ SVG ์ด๋ฏธ์ง์ ์ผ๋ถ๋ถ์ด๊ฑฐ๋, ํน์ ํ ๋ชฉ์ ์ ์ํด ์๋์ ์ผ๋ก ๋น ๊ฒฝ๋ก๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ์ผ ์ ์์ต๋๋ค.
์ด SVG ์ฝ๋๋ ํน์ ํ ๊ทธ๋ํฝ ๋์์ธ ๋๋ ์ด๋ฏธ์ง๋ฅผ ๋ํ๋ด๋ฉฐ, ์น ํ์ด์ง๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ฝ๋๋ง์ผ๋ก๋ ์ด๋ฏธ์ง์ ์๊ฐ์ ๋ชจ์ต์ ์ ํํ ํ์
ํ๊ธฐ ์ด๋ ต์ง๋ง, ๋ธ๋ผ์ฐ์ ๋ SVG ํธ์ง ๋๊ตฌ๋ฅผ ํตํด ๋ ๋๋งํ๋ฉด ํด๋น ์ด๋ฏธ์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
index.js
ํ์ผ์ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์น ํ์ด์ง์ ๋ง์ดํธํ๋ ์ญํ ์ ํฉ๋๋ค.
์ฝ๋์ ๊ฐ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ์ํํฉ๋๋ค:
๋ชจ๋ ์ํฌํธ:
import React from 'react';: React ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํฌํธํฉ๋๋ค. React ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๋ ๋ฐ ํ์ํฉ๋๋ค.
import ReactDOM from 'react-dom/client';: React 18 ์ด์์ ๋ฒ์ ์์ ์๋กญ๊ฒ ๋์
๋ ReactDOM ํด๋ผ์ด์ธํธ๋ฅผ ์ํฌํธํฉ๋๋ค. ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ DOM์ ๋ง์ดํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
import './index.css';: ํ์ฌ ํ์ผ๊ณผ ๋์ผํ ๋๋ ํ ๋ฆฌ์ ์๋ index.css ์คํ์ผ์ํธ๋ฅผ ์ํฌํธํฉ๋๋ค. ์ด๋ ์ ์ญ ์คํ์ผ์ ์ ์ํ ์ ์์ต๋๋ค.
import App from './App';: App ์ปดํฌ๋ํธ๋ฅผ ์ํฌํธํฉ๋๋ค. ์ด ์ปดํฌ๋ํธ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ์ธ ์ปดํฌ๋ํธ์
๋๋ค.
import reportWebVitals from './reportWebVitals';: ์ฑ๋ฅ ์ธก์ ํจ์ reportWebVitals๋ฅผ ์ํฌํธํฉ๋๋ค. ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ ์งํ๋ฅผ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
๋ฃจํธ ์์ฑ ๋ฐ ๋ ๋๋ง:
const root = ReactDOM.createRoot(document.getElementById('root'));: ์น ํ์ด์ง์ 'root' ์๋ฆฌ๋จผํธ๋ฅผ ์ฐพ์์ React ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฃจํธ๋ฅผ ์์ฑํฉ๋๋ค.
root.render(...): React.StrictMode๋ฅผ ์ฌ์ฉํ์ฌ App ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค.
React.StrictMode๋ ๊ฐ๋ฐ ๋ชจ๋์์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ์ ์ฌ์ ๋ฌธ์ ๋ฅผ ์ฐพ๋ ๋ฐ ๋์์ ์ค๋๋ค.
์ฑ๋ฅ ์ธก์ :
reportWebVitals();: ์ด ํจ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ ์งํ๋ฅผ ์ธก์ ํ๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์๋ฌด๋ฐ ์์
๋ ์ํํ์ง ์์ต๋๋ค. ์ฑ๋ฅ ๋ฐ์ดํฐ๋ฅผ ๋ก๊น
ํ๊ฑฐ๋ ๋ถ์ ์๋ํฌ์ธํธ๋ก ์ ์กํ๋ ค๋ฉด, ์ด ํจ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
index.js
์ด ์ฝ๋๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๊ธฐ ์ํ ๊ธฐ๋ณธ ์ค์ ์ ํฌํจํ๊ณ ์์ต๋๋ค.
๊ฐ๋จํ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
import ๊ตฌ๋ฌธ์ ํตํด React, ReactDOM, CSS ํ์ผ, App ์ปดํฌ๋ํธ, ๊ทธ๋ฆฌ๊ณ reportWebVitals ํจ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
ReactDOM.createRoot ํจ์๋ฅผ ์ฌ์ฉํด 'root' DOM ๋
ธ๋์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋ง์ดํธํฉ๋๋ค. ์ด๋ React 18๋ถํฐ ๋์
๋ ์๋ก์ด ๋ฐฉ์์
๋๋ค.
root.render๋ฅผ ์ฌ์ฉํ์ฌ <App /> ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค. React.StrictMode๋ ๊ฐ๋ฐ ๋ชจ๋์์ ์ ํ๋ฆฌ์ผ์ด์
๋ด์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์ฐพ์๋ด๋๋ฐ ๋์์ ์ค๋๋ค.
reportWebVitals ํจ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฃผ์ ์ฒ๋ฆฌ๋ ๋ถ๋ถ์ ์ด ํจ์๋ฅผ ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์ด๋ค์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์กฐ์ ์คํ์ผ์ ๊ฒฐ์ ํฉ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก, ์ฑ๋ฅ ์ธก์ ์ด๋ ๋ถ์์ ์ํด reportWebVitals๋ฅผ ํ์ฑํ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค
์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋ ๋ธ๋ผ์ฐ์ ์ ์ฝ์์ ์ฑ๋ฅ ์งํ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
์ด ๋ฐ์ดํฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๋ฉ ์๊ฐ, ์ํธ ์์ฉ ์ง์ฐ ๋ฑ์ ํฌํจํ ์ ์์ผ๋ฉฐ,
์ด๋ฅผ ํตํด ์ฑ๋ฅ ๊ฐ์ ์ ์ํ ํต์ฐฐ์ ์ป์ ์ ์์ต๋๋ค.
reportWebVitals ํจ์์์ ์น ์ฑ๋ฅ ์งํ๋ฅผ ๋ํ๋ ๋๋ค:
'First Contentful Paint (FCP)'์
'Time to First Byte (TTFB)'.
๊ฐ๊ฐ์ ๋ํด ๊ฐ๋จํ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
First Contentful Paint (FCP):
name: 'FCP': ์ด๋ 'First Contentful Paint'๋ฅผ ๋ํ๋
๋๋ค.
value: 610.5: ํ์ด์ง๊ฐ ๋ก๋๋๊ณ ์ฒซ ๋ฒ์งธ ์ฝํ
์ธ ๊ฐ ํ๋ฉด์ ๊ทธ๋ ค์ง๊ธฐ๊น์ง 610.5 ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ ธ์์ ์๋ฏธํฉ๋๋ค.
delta: 610.5: ์ด์ ์ธก์ ๋๋น ๋ณํ๋์ ๋ํ๋
๋๋ค.
entries: Array(1): ์ฑ๋ฅ ์ธก์ ๊ณผ ๊ด๋ จ๋ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ๋ฐฐ์ด์
๋๋ค.
์ด ๊ฒฝ์ฐ, PerformancePaintTiming ๊ฐ์ฒด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
id: ์ฑ๋ฅ ์ด๋ฒคํธ์ ๊ณ ์ ์๋ณ์์
๋๋ค.
FCP๋ ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ฒซ ์ฝํ
์ธ ๋ฅผ ๋ณผ ์ ์๋ ์์ ์ ๋ํ๋ด๋ฉฐ,
์ผ๋ฐ์ ์ผ๋ก ๋ ๋ฎ์ ๊ฐ์ด ๋ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์๋ฏธํฉ๋๋ค.
Time to First Byte (TTFB):
name: 'TTFB': ์ด๋ 'Time to First Byte'๋ฅผ ๋ํ๋
๋๋ค.
value: 16.1: ์๋ฒ๋ก๋ถํฐ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ๋ฅผ ๋ฐ๋ ๋ฐ๊น์ง 16.1 ๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ ธ์์ ์๋ฏธํฉ๋๋ค.
delta: 16.1: ์ด์ ์ธก์ ๋๋น ๋ณํ๋์ ๋ํ๋
๋๋ค.
entries: [PerformanceNavigationTiming]: ์ฑ๋ฅ ์ธก์ ๊ณผ ๊ด๋ จ๋ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ๋ฐฐ์ด์
๋๋ค. ์ด ๊ฒฝ์ฐ, PerformanceNavigationTiming ๊ฐ์ฒด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
id: ์ฑ๋ฅ ์ด๋ฒคํธ์ ๊ณ ์ ์๋ณ์์
๋๋ค.
TTFB๋ ์๋ฒ ์๋ต ์๊ฐ์ ์ธก์ ํฉ๋๋ค. ์ด ๊ฐ์ด ๋ฎ์์๋ก ์๋ฒ๊ฐ ๋ ๋น ๋ฅด๊ฒ ์๋ตํ๊ณ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ก๋ฉ ์ฑ๋ฅ์ ํ๊ฐํ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, FCP๊ฐ ๋๋ค๋ฉด ํ์ด์ง ๋ก๋ฉ ์ต์ ํ๋ฅผ ๊ณ ๋ คํ ์ ์์ผ๋ฉฐ,
TTFB๊ฐ ๋๋ค๋ฉด ์๋ฒ ์๋ต ์๊ฐ์ด๋ ๋คํธ์ํฌ ์ง์ฐ์ ์ ๊ฒํด๋ณผ ์ ์์ต๋๋ค.
์ด CSS ์ฝ๋๋ ์น ํ์ด์ง์ ์ ์ฒด์ ์ธ ์คํ์ผ์ ์ ์ํ๋ ๊ฒ์
๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ํด์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
body: ์น ํ์ด์ง์ ๋ณธ๋ฌธ์ ํด๋นํ๋ ๋ชจ๋ ์์์ ์ ์ฉ๋ฉ๋๋ค.
margin: 0;: ๋ณธ๋ฌธ์ ๋ชจ๋ ๋ฉด์ ๋ง์ง(์ฌ๋ฐฑ)์ด ์๋๋ก ์ค์ ํฉ๋๋ค.
font-family: ๋ณธ๋ฌธ์ ์ฌ์ฉํ ํฐํธ ํจ๋ฐ๋ฆฌ๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ ์์คํ
์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ํ์๋ ์ ์๋ ํฐํธ๋ค์ ์์ฐจ์ ์ผ๋ก ๋์ดํ ๊ฒ์
๋๋ค. ์ฌ์ฉ์์ ์์คํ
์ ์ฒซ ๋ฒ์งธ ํฐํธ๊ฐ ์ค์น๋์ด ์์ง ์์ ๊ฒฝ์ฐ, ๋ค์ ํฐํธ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. '-apple-system'๊ณผ 'BlinkMacSystemFont'๋ ๊ฐ๊ฐ ์ ํ๊ณผ ๊ตฌ๊ธ ํฌ๋กฌ OS์ ์ต์ ํ๋ ์์คํ
ํฐํธ์
๋๋ค. 'Segoe UI', 'Roboto' ๋ฑ์ ๋ค๋ฅธ ์ด์์ฒด์ ์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ํฐํธ๋ค์
๋๋ค. ๋ง์ง๋ง์ผ๋ก, 'sans-serif'๋ ์์ ๋์ด๋ ํฐํธ๋ค ์ค ์ด๋ ๊ฒ๋ ์ฌ์ฉํ ์ ์์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋ ์๋น ํฐํธ์
๋๋ค.
-webkit-font-smoothing: antialiased;: ์นํท ๊ธฐ๋ฐ ๋ธ๋ผ์ฐ์ (ํฌ๋กฌ, ์ฌํ๋ฆฌ ๋ฑ)์์ ํฐํธ์ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌํ์ฌ ๊ฐ๋
์ฑ์ ๋์
๋๋ค.
-moz-osx-font-smoothing: grayscale;: ํ์ด์ดํญ์ค ๋ธ๋ผ์ฐ์ ์์ ๋งฅ OS X ์ด์์ฒด์ ๋ฅผ ์ฌ์ฉํ ๋ ํฐํธ์ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ํ์์กฐ๋ก ์ฒ๋ฆฌํ์ฌ ๊ฐ๋
์ฑ์ ๋์
๋๋ค.
code: <code> ํ๊ทธ๋ก ํ์๋ ํ
์คํธ์ ์ ์ฉ๋ฉ๋๋ค.
font-family: ์ฝ๋ ๋ธ๋ก์ ์ฌ์ฉํ ํฐํธ ํจ๋ฐ๋ฆฌ๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ ์ฃผ๋ก ๊ณ ์ ํญ(fixed-width) ํฐํธ์ธ 'source-code-pro', 'Menlo', 'Monaco', 'Consolas', 'Courier New' ๋ฑ์ ๋์ดํ ๊ฒ์
๋๋ค. ์ด ํฐํธ๋ค์ ์ฝ๋์ ๋ฌธ์๊ฐ ๋ชจ๋ ๊ฐ์ ๋๋น๋ฅผ ๊ฐ์ง๋๋ก ํด์ ๊ฐ๋
์ฑ์ ๋์ด๋๋ฐ ์ ํฉํฉ๋๋ค. 'monospace'๋ ์์ ๋์ด๋ ํฐํธ๋ค ์ค ์ด๋ ๊ฒ๋ ์ฌ์ฉํ ์ ์์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋ ์๋น ํฐํธ์
๋๋ค.
์ด ์คํ์ผ ๊ท์น์ ์น ํ์ด์ง์ ํ
์คํธ๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ด์์ฒด์ ๊ฐ์ ์ผ๊ด๋๊ณ ์ ๋ช
ํ๊ฒ ๋ณด์ด๋๋ก ๋๋ ๋ฐ ์ค์ ์ ๋๊ณ ์์ต๋๋ค.
์ด CSS ์ฝ๋๋ ํน์ ํด๋์ค๊ฐ ์ ์ฉ๋ HTML ์์์ ์คํ์ผ์ ์ ์ํ๊ณ ์์ต๋๋ค. ๊ฐ ํด๋์ค์ ๋ํ ์ค๋ช
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
.App: ํด๋์ค ์ด๋ฆ์ด App์ธ ์์์ ์ ์ฉ๋ฉ๋๋ค.
text-align: center;: ํ
์คํธ๋ฅผ ๊ฐ์ด๋ฐ ์ ๋ ฌํฉ๋๋ค.
.App-logo: ํด๋์ค ์ด๋ฆ์ด App-logo์ธ ์์์ ์ ์ฉ๋ฉ๋๋ค.
height: 40vmin;: ์์์ ๋์ด๋ฅผ viewport(๋ธ๋ผ์ฐ์ ํ๋ฉด)์ ๊ฐ์ฅ ์์ ์ธก๋ฉด์ ๊ธธ์ด์ 40%๋ก ์ค์ ํฉ๋๋ค.
pointer-events: none;: ์์์ ๋ง์ฐ์ค ์ด๋ฒคํธ๊ฐ ์ ์ฉ๋์ง ์๋๋ก ํฉ๋๋ค(์: ๋ง์ฐ์ค ํด๋ฆญ์ด ๋ฌด์๋จ).
@media (prefers-reduced-motion: no-preference): ์ฌ์ฉ์๊ฐ ์ด์์ฒด์ ๋ ๋ฒจ์์ ์์ง์์ ์ค์ด์ง ์๋๋ก ์ค์ ํ์ ๋ ์ ์ฉ๋๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ์
๋๋ค.
.App-logo: ์ด ๋ธ๋ก ๋ด์ .App-logo ํด๋์ค์ ๋ํ ์ถ๊ฐ ์คํ์ผ์ ์ ์ํฉ๋๋ค.
animation: App-logo-spin์ด๋ผ๋ ์ด๋ฆ์ ์ ๋๋ฉ์ด์
์ ๋ฌดํ์ ๋ฐ๋ณตํ๊ณ , ํ ์ฌ์ดํด์ ์๋ฃํ๋ ๋ฐ 20์ด๊ฐ ๊ฑธ๋ฆฌ๋ฉฐ, ์ ๋๋ฉ์ด์
์๋๊ฐ ์ผ์ ํ๋๋ก(linear) ์ค์ ํฉ๋๋ค.
.App-header: ํด๋์ค ์ด๋ฆ์ด App-header์ธ ์์์ ์ ์ฉ๋ฉ๋๋ค.
background-color: ๋ฐฐ๊ฒฝ์์ #282c34 (์ด๋์ด ํ์์กฐ)๋ก ์ค์ ํฉ๋๋ค.
min-height: ์ต์ ๋์ด๋ฅผ viewport์ ๋์ด(100vh)๋ก ์ค์ ํฉ๋๋ค.
display: flex;: flexbox ๋ ์ด์์์ ์ฌ์ฉํฉ๋๋ค.
flex-direction: column;: ์์ ์์๋ค์ ์์ง ๋ฐฉํฅ(์ด)์ผ๋ก ์ ๋ ฌํฉ๋๋ค.
align-items: center;: ๊ฐ๋ก์ถ์ ์ค์ฌ์ผ๋ก ์์ ์์๋ค์ ๊ฐ์ด๋ฐ ์ ๋ ฌํฉ๋๋ค.
justify-content: center;: ์ธ๋ก์ถ์ ์ค์ฌ์ผ๋ก ์์ ์์๋ค์ ๊ฐ์ด๋ฐ ์ ๋ ฌํฉ๋๋ค.
font-size: ํฐํธ ํฌ๊ธฐ๋ฅผ viewport์ ๊ฐ์ฅ ์์ ์ธก๋ฉด ๊ธธ์ด์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๊ณ์ฐํฉ๋๋ค(calc(10px + 2vmin)).
color: ํ
์คํธ ์์์ ํฐ์์ผ๋ก ์ค์ ํฉ๋๋ค.
.App-link: ํด๋์ค ์ด๋ฆ์ด App-link์ธ ์์์ ์ ์ฉ๋ฉ๋๋ค.
color: ํ
์คํธ ์์์ #61dafb (์ฐํ ์ฒญ์์กฐ)๋ก ์ค์ ํฉ๋๋ค.
@keyframes App-logo-spin: App-logo-spin์ด๋ผ๋ ์ด๋ฆ์ ํคํ๋ ์ ์ ๋๋ฉ์ด์
์ ์ ์ํฉ๋๋ค.
from: ์ ๋๋ฉ์ด์
์์ ์, ์์๋ 0๋ ํ์ ์ํ์
๋๋ค.
to: ์ ๋๋ฉ์ด์
๋์ ๋๋ฌํ์ ๋, ์์๋ 360๋ ํ์ ํ ์ํ์
๋๋ค.
์ด CSS ์ฝ๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ํค๋, ๋ก๊ณ , ๋งํฌ ๋ฑ์ ์๊ฐ์ ์์๋ฅผ ์คํ์ผ๋งํ๋ฉฐ, ํนํ ๋ก๊ณ ์ ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ฅผ ์ฃผ๋ ๋ฐ ์ค์ ์ ๋๊ณ ์์ต๋๋ค.
app.css์ index.css๋ฅผ ๋ถ๋ฆฌํด ๋์ ์ด์ sms -?
์ฃผ๋ก ์กฐ์งํ์ ์ ์ง๋ณด์์ ์ฉ์ด์ฑ ๋๋ฌธ์
๋๋ค. ๊ฐ๊ฐ์ ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค:
index.css:
์ด ํ์ผ์ ์ ์ญ ์คํ์ผ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ๊ธฐ๋ณธ ์คํ์ผ์ด ํฌํจ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ธฐ๋ณธ ํฐํธ ์คํ์ผ, ๋ฐฐ๊ฒฝ์, ๊ธฐ๋ณธ ๋ง์ง ๋ฐ ํจ๋ฉ ์ค์ ๋ฑ์ด ์ด์ ํด๋นํฉ๋๋ค.
index.css๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์คํ์ผ๋ง์ ์ค์ ํ๋ฉฐ,
๋ค๋ฅธ ๋ชจ๋ ์คํ์ผ์ํธ๋ณด๋ค ๋จผ์ ๋ก๋๋์ด์ผ ํ๋ ๊ธฐ๋ณธ ์คํ์ผ ๊ท์น์ ํฌํจํ ์ ์์ต๋๋ค.
App.css:
App.css๋ ํนํ App ์ปดํฌ๋ํธ์ ๊ด๋ จ๋ ์คํ์ผ์ ์ ์ํฉ๋๋ค.
์ด ํ์ผ์ App ์ปดํฌ๋ํธ์ ๋ ์ด์์, ์์, ํฐํธ, ๊ฐ๊ฒฉ ๋ฑ์ ํฌํจํ์ฌ ํด๋น ์ปดํฌ๋ํธ์ ์๊ฐ์ ์์๋ฅผ ๊ตฌ์ฒดํํฉ๋๋ค.
์ด ํ์ผ์ ์ฌ์ฉํจ์ผ๋ก์จ, App ์ปดํฌ๋ํธ์ ์คํ์ผ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ ์ ์ญ ์คํ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ด๋ ์ฝ๋์ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํ๋ฉฐ, ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ค๊ณ์ ์ฅ์ ์ ์ด๋ฆฝ๋๋ค.
์ด๋ฐ ๋ฐฉ์์ผ๋ก ์คํ์ผ์ํธ๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ, ๊ฐ๋ฐ์๋ ์ ์ญ ์คํ์ผ๊ณผ ํน์ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ์ฝ๊ฒ ๊ตฌ๋ถํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๋ํ, ์ด๋ฌํ ๋ถ๋ฆฌ๋ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ด๋ฉฐ, ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ํนํ ์ ์ฉํฉ๋๋ค
๋ค์ ํฌ์คํ ์์ manifest.json ํ์ผ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค
'Development๐ฉ๐ปโ๐ฆณ > Tutorial' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ์กํธ์ ํ: ๊ณ ์ฑ๋ฅ ์น ์ฑ ๊ฐ๋ฐ (0) | 2023.11.19 |
---|---|
์์์ ์ฝ๋ ์ด์ผ๊ธฐ (0) | 2023.09.11 |