๋ฆฌ์•กํŠธ ์ดˆ๊ธฐ ์„ธํŒ…๋ฐฉ๋ฒ•๊ณผ ๊ธฐ๋ณธ ๋ถ€๋ชจ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์š”์†Œ ๋ถ„์„ (ํ•ด์„ ๋งŽ์€ ์ฃผ์˜)

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์˜ ์‚ฌ์ดํŠธ๋‹ค



npm (Node Package Manager)๋Š” JavaScript 

๊ฐœ๋ฐœ์ž๋“ค์„ ์œ„ํ•œ ํˆด๊ณผ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.

GitHub์ด ์šด์˜ํ•˜๋ฉฐ, npm Registry์™€ npm CLI๋ฅผ 

๋ฌด๋ฃŒ๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹คโ€‹โ€‹. 

npm์„ ํ†ตํ•ด JavaScript ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, 

npm Pro ๋ฒ„์ „์—์„œ๋Š” ํ”„๋ผ์ด๋น— ํŒจํ‚ค์ง€์™€ ๊ฐ™์€ ํ”„๋ฆฌ๋ฏธ์—„ ๊ธฐ๋Šฅ์„ 

์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คโ€‹โ€‹. ์ „ ์„ธ๊ณ„ 1700๋งŒ ๋ช… ์ด์ƒ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, 

200๋งŒ ๊ฐœ ์ด์ƒ์˜ ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ตœ๋Œ€์˜ ์†Œํ”„ํŠธ์›จ์–ด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ, 

JavaScript ์ฝ”๋“œ ๊ณต์œ ์˜ ์ค‘์‹ฌ์ด ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹คโ€‹โ€‹.


node --version : ํ˜„์žฌ ์„ค์น˜๋œ node.js๋ฒ„์ „ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•œ ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์–ด

node --version ํ„ฐ๋ฏธ๋„ ์‹คํ–‰์˜ ๊ฒฐ๊ณผ์ด๋‹ค


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์„ ๋งค๋ฒˆ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค 
์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
(์‚ฌ์šฉ์‹œ ๋งŽ์€ ๋ฆฌ์•กํŠธ ๊ด€๋ จ ์ข…์†์„ฑ๋“ค์„ ํ•œ๋ฒˆ์— ์„ค์น˜์‹œ์ผœ์ค€๋‹ค)

 

์ €๋Š” ํด๋”์ด๋ฆ„์„ a๋ผ๊ณ  ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค

 

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 ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค