๐Ÿง‘‍๐Ÿ’ป๊ฐœ๋ฐœ_Deep Dive/React

[๋ฆฌ์•กํŠธ] CRA ์—†์ด ๋ฆฌ์•กํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•ํ•ด๋ณด๊ธฐ

Daisy.lee 2022. 2. 4. 20:36

๊ฐ•์˜๋ฅผ ๋“ฃ๊ฑฐ๋‚˜ ํ˜ผ์ž ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ, ์•„๋ฌด ์ƒ๊ฐ ์—†์ด ์Šต๊ด€์ ์œผ๋กœ CRA(Create React App)๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๋‹ค๋ณด๋‹ˆ ๋ฆฌ์•กํŠธ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์›๋ฆฌ๋ฅผ ์ง€๋‚˜์น˜๊ฒŒ ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. CRA ์—†์ด index.html์— ๋ฆฌ์•กํŠธ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.


์šฐ์„  ๋Œ€๋ถ€๋ถ„์˜ ์„ค์ •์€ ๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ์— ๋‚˜์™€์žˆ์œผ๋ฏ€๋กœ ๊ณต์‹ ๋ฌธ์„œ๋งŒ ๋”ฐ๋ผํ•ด๋„ ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ œ๊ฐ€ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์ •๋ฆฌ๋ฅผ ํ•˜๊ณ  ์‹ถ์–ด์„œ ๋ธ”๋กœ๊ทธ์— ์ ๊ณ ์žˆ์Šต๋‹ˆ๋‹ค๐Ÿ˜Š

https://ko.reactjs.org/docs/add-react-to-a-website.html

 

์›น์‚ฌ์ดํŠธ์— React ์ถ”๊ฐ€ – React

A JavaScript library for building user interfaces

ko.reactjs.org

1. <body> ํƒœ๊ทธ ์•ˆ์— ๋น„์–ด์žˆ๋Š” <div> ํƒœ๊ทธ ํ•˜๋‚˜ ๋งŒ๋“ค๊ธฐ

์ž‘์„ฑํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ณด์—ฌ์งˆ ๋น„์–ด์žˆ๋Š” ํƒœ๊ทธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋•Œ <div>ํƒœ๊ทธ์— id๋ฅผ ๋ถ€์—ฌํ•ด์ค๋‹ˆ๋‹ค. id๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ์ด์œ ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ id๋ฅผ ํ†ตํ•ด ํ•ด๋‹น <div> ํƒœ๊ทธ๋ฅผ ์ฐพ์•„์„œ ๊ทธ ์•ˆ์— React ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. id ์ด๋ฆ„์€ ์–ด๋–ป๊ฒŒ ์ง€์–ด๋„ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.

2. ๋ฆฌ์•กํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” <script> ํƒœ๊ทธ ์ถ”๊ฐ€ํ•˜๊ธฐ

<body> ํƒœ๊ทธ ์•ˆ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ <script> ํƒœ๊ทธ 2๊ฐœ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์™€์žˆ๊ณ , ๊ณต์‹ ๋ฌธ์„œ์—๋Š” ์•„๊นŒ ๋งŒ๋“  <div> ํƒœ๊ทธ ์œ„์— ์œ„์น˜ํ•˜๊ณ  ์žˆ์–ด์„œ ๊ทธ๋Œ€๋กœ ๋ณต๋ถ™ํ–ˆ์Šต๋‹ˆ๋‹ค.

<script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>

3. ๋ฐ”๋ฒจ์„ ์‹คํ–‰ํ•˜๋Š” <script> ํƒœ๊ทธ ์ถ”๊ฐ€ํ•˜๊ธฐ

๋ฆฌ์•กํŠธ์—์„œ๋Š” JSX๋ผ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™•์žฅ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JSX๋Š” html์˜ ํƒœ๊ทธ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ‘œํ˜„์‹(๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ)์„ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค. (๋งํฌ) ๊ทธ๋Ÿฐ๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” JSX๋ฅผ ํ•ด์„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐ”๋ฒจ(babel) ์ด๋ผ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋กœ JSX๋ฅผ ํ•ด์„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ ์žฌ์ž‘์„ฑํ•ด์ค๋‹ˆ๋‹ค. ๋ฐ”๋ฒจ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„์™€ ๊ฐ™์ด <script> ํƒœ๊ทธ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

๋ฐ”๋ฒจ์„ ์‚ฌ์šฉํ•˜๋Š” <script> ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‚˜์„œ, html ํŒŒ์ผ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ <script> ํƒœ๊ทธ ์•ˆ์—์„œ ์‹ค์ œ๋กœ ์ฝ”๋”ฉ์„ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ „์—, ์‹ค์ œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”<script> ํƒœ๊ทธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด type ์†์„ฑ์„ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<script type="text/babel">

4. <div> ํƒœ๊ทธ๋ฅผ ์ฐพ๋Š” ์ฝ”๋“œ์™€ ReactDOM ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ฝ”๋“œ ๋„ฃ๊ธฐ

๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” <script> ํƒœ๊ทธ ๋งจ ์•„๋ž˜์— ๋ฆฌ์•กํŠธ๋ฅผ ์ž‘๋™์‹œํ‚ค๋Š” ์ฝ”๋“œ ๋‘ ์ค„์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” <body> ํƒœ๊ทธ ์ตœ์ƒ๋‹จ์— id๋ฅผ ๋ถ€์—ฌํ•œ ์ปจํ…Œ์ด๋„ˆ <div> ํƒœ๊ทธ๋ฅผ ์ฐพ๋Š” ์ฝ”๋“œ์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ฆฌ์•กํŠธ์˜ ํŠน์ง•์ธ Virtual DOM์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ์˜ Virtual DOM๊ณผ ์ž‘๋™ ๋ฐฉ์‹์€ ์ด ๊ธ€์— ์ž์„ธํ•˜๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

const ์—ฌ๊ธฐ๋‹ค๊ฐ€๊ทธ๋ ค = document.querySelector("#์•„์ด๋”” ์ด๋ฆ„");
ReactDOM.render(์ปดํฌ๋„ŒํŠธ๋ฅผ, ์—ฌ๊ธฐ๋‹ค๊ฐ€๊ทธ๋ ค);

document.querySelector ๋ผ๋Š” API๋ฅผ ํ†ตํ•ด <div> ํƒœ๊ทธ์˜ id๋ฅผ ์ฐพ๊ณ , ReactDOM.render ๋ผ๋Š” ๋ฆฌ์•กํŠธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ReactDOM.render ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ parameter๋กœ ๋ Œ๋”๋งํ•  ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋‹ด๊ณ  ์žˆ๋Š” ์ตœ์ƒ์œ„ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ›๊ณ , ๋‘ ๋ฒˆ์งธ parameter๋กœ <body> ํƒœ๊ทธ ์•ˆ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ <div> ํƒœ๊ทธ๋ฅผ ์ •์˜ํ•œ ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฆฌ์•กํŠธ์˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ž‘์„ฑํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค์ค๋‹ˆ๋‹ค.