React๋ฅผ ์ค๋๋ง์ ์ฌ์ฉ์ ํ๋ฉด์ (์ฝ 7๊ฐ์ ์ ์ฌ์ฉ..) ๊ทธ๊ฐ ์๊ณ ์๋ React์ ๋ํ ๊ฐ๋ ๋ค์ ๋ค์ ์ ๋ฆฌ๋ฅผ ํด๋ณด์์ผ๊ฒ ๋ค.
Lieto Project๋ฅผ ์์ํ๋ฉฐ ๊ฐ๋จํ API(kakao api)๋ฅผ ์ฐ๊ฒฐํ๋๋ฐ ๋ญ๊ฐ ์ด๋ป๊ฒ ์ปดํฌ๋ํธ์ ๋ฐ์์ ํด์ผํ ์ง React์ ์ข์ ์ ์ด ๋ญ์๋์ง๋ฅผ ๋ค์ ํ๋ฒ ์์ฑํด๋ณด๋ฉฐ Project๋ฅผ ์ค๊ณ ๋ฐ ๊ฐ๋ฐ ํด๋ณด์ ๐ง
JSX๋ Html+js ๋ฌธ๋ฒ!
Javascript Syntex eXtension
๊ฒฐ๊ตญ Javascript๋ฌธ๋ฒ์ ํ์ฅํ ๋ฌธ๋ฒ์ด๋ค.
์ฐ๋ฆฌ๊ฐ JS๋ฌธ๋ฒ์ ์ฌ์ฉํ ๋๋ html๋ฐ๋ก Javascript ๋ฐ๋ก ๊ด๋ฆฌ๋ฅผ ํ๋ค๋ณด๋ ๊ฐ๋ฐํ๋ ์ ์ฅ์์๋ ๋ถํธ๊ฐ์ด ์์๋ค.
๊ทธ๋ฐ๋ฐ JSX๋ฌธ๋ฒ์ Html ํ๊ทธ๋ฅผ Returnํ๊ณ ๊ทธ ์์ Javascript ์ฝ๋๋ฅผ ์ ํ์ค ์ ์๋ค.
๊ทธ๋ฅ Javascript+html์ด ๊ฐ๋ฅํ ๋ฌธ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
์ฐ๋ฆฌ๊ฐ event๋ฅผ ๊ฐ์งํ์ฌ console์ "Hello"๋ฅผ ์ฐ๋ ๊ณผ์ ์ ๊ฐ ๋ค๋ฅธ ๋ฌธ๋ฒ (VanillaJS, JSX)์ผ๋ก ๋น๊ตํด๋ณด์
//html
<body>
<div>
<form>
<button>hi</button>
</form>
</div>
</body>
//js
const BTN = document.querySeletor("button")
BTN.addEventListener((e)=>console.log("Hello"))
๋ค์๊ณผ ๊ฐ์ด VanillaJS๋ ํด๋น ๊ณผ์ ์ ๋ชจ๋ ๋ช
๋ นํ์ผ๋ก ์์ฑ์ ํด์ฃผ์ด์ผํ๋ค.
๊ทธ๋ ๋ค๋ณด๋ ์ฝ๋๊ฐ ๋น๊ต์ ๊ธธ๊ณ ํ๋์ ์ด๋ค button์ ๋๋ ์ ๋์ธ์ง ๋ณด๊ธฐ ํ๋ ๋ถ๋ถ์ด ์๋ค.
React๋ ์ด๋ฌํ ๋ถ๋ถ์ ์ ์ธํ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑ์ด ๊ฐ๋ฅํ๊ฒํด์ค๋ค.
return <div>
<form>
<button onClick={()=>console.log("Hello")}></button>
</form>
</div>
์ด๋ ๊ฒ ์ปดํฌ๋ํธํจ์ ์์ ๋ฐ๋ก ํด๋น ํจ์๋ฅผ ์ ์ฉํ ์ ์๋ค.
์ฆ, ์ ์ธ์ ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ์ํ๋ ๋์์ ์์ฑํ ์ ์๋ค.
์ข์์
1. ์ด๋ค ์ปดํฌ๋ํธ์ ์ด๋ค ๊ธฐ๋ฅ์ด ์๋์ง ํ๋์ ๋ณผ ์ ์๋ค.(๊ฐ๋ ์ฑ์ฆ๊ฐ)
2. ์๋๋ฅผ ๋ช ํํ๊ฒ ํํํ ์ ์๋ค.
3. ๊ฐ๋ฐ์๊ฐ ์ณ์ผํ๋ ์ฝ๋์ ๊ธธ์ด๊ฐ ์ค์ด๋ ๋ค.
์ฆ, React ์ JSX๋ ์์ ๊ฐ์ ์ฅ์ ์ ๊ฐ์ง ๊ฒ์ด๋ค!
๊ฒฐ๋ก ์ ๊ทธ๋ ์ง ์๋ค.
๋ธ๋ผ์ฐ์ ๋ Javascript ์ฝ๋๋ฅผ ์ฝ์ ์๋ ์์ง๋ง JSX๋ฌธ๋ฒ์ ๋ฐ๋ก ์ฝ์ด์ฃผ์ง ๋ชปํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Babel ์ด๋ผ๋ ํธ๋์คํ์ผ๋ฌ๊ฐ ๊ด์ฌํด js์ฝ๋๋ก ๋ณํ์์ผ์ค๋ค!
Babel์ Reactํ์ผ์ build ํ๋ฉด์ ๊ด์ฌํ๊ฒ ๋๋ค.
- ์ฝ๋ ๋ฒ๋ค๋ง: JavaScript ์ฝ๋๋ ์ฌ๋ฌ ํ์ผ๋ก ๋๋์ด ์์ ์ ์์ง๋ง, ๋น๋ ํ๋ก์ธ์ค์์๋ ์ด๋ฅผ ํ๋์ ํ์ผ๋ก ๋ฒ๋ค๋งํฉ๋๋ค. ์ด ๊ณผ์ ์์๋ ์ฃผ๋ก webpack์ด๋ Parcel๊ณผ ๊ฐ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- JSX๋ฅผ JavaScript๋ก ๋ณํ: React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ JSX ์ฝ๋๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ํด์ํ ์ ์์ผ๋ฏ๋ก, Babel๊ณผ ๊ฐ์ ํธ๋์คํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ JSX๋ฅผ ์ผ๋ฐ JavaScript ์ฝ๋๋ก ๋ณํํฉ๋๋ค.
- CSS, ์คํ์ผ ์ฒ๋ฆฌ: ํ๋ก์ ํธ์์ ์ฌ์ฉ๋ ์คํ์ผ ์ํธ๋ค์ ํ๋์ CSS ํ์ผ๋ก ๋ฒ๋ค๋ง๋๊ฑฐ๋ ํ์์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ์ CSS ํ์ผ๋ก ๋ถ๋ฆฌ๋ ์ ์์ต๋๋ค. ์ด ํ์ผ๋ค์ ๋น๋ ๊ณผ์ ์์ ์์ฑ๋์ด HTML ํ์ผ๊ณผ ํจ๊ป ๋ก๋๋ ์ ์๋๋ก ํฉ๋๋ค.
- ์ ์ ์์ ๋ณต์ฌ: ํ๋ก์ ํธ์ ์ฌ์ฉ๋ ์ด๋ฏธ์ง, ํฐํธ ๋ฑ์ ์ ์ ์์ ํ์ผ์ ๋น๋ ๊ณผ์ ์์ ํด๋น ๋๋ ํ ๋ฆฌ๋ก ๋ณต์ฌ๋ฉ๋๋ค. ์ด๋ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ํจ๊ป ํฌํจ๋์ด ์๋ฒ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํธ์คํ ํ ๋ ํ์ํฉ๋๋ค.
- HTML ์์ฑ: React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์ ์ด ๋๋ HTML ํ์ผ์ด ์์ฑ๋ฉ๋๋ค. ์ด HTML ํ์ผ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๋ํ๊ณ ์คํํ๋๋ฐ ํ์ํ ์คํฌ๋ฆฝํธ ํ๊ทธ์ ๋งํฌ ํ๊ทธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
- ์ต์ ํ ๋ฐ ์์ถ: ์์ฑ๋ JavaScript ๋ฐ CSS ํ์ผ์ ์ฃผ๋ก ์ต์ ํ ๋ฐ ์์ถ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ์ด๋ฅผ ํตํด ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ํฌ๊ธฐ๋ฅผ ์ต์ํํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋น๋ ๊ฒฐ๊ณผ๋ฌผ ์์ฑ: ์์ ๋ชจ๋ ๊ณผ์ ์ด ์๋ฃ๋๋ฉด, ์ต์ข ์ ์ผ๋ก ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ด ์์ฑ๋ฉ๋๋ค. ์ด ๊ฒฐ๊ณผ๋ฌผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ์ ๋ฐฐํฌํ๊ณ ํธ์คํ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ํตํด React๋ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ์์ฑํ๊ฒ ๋๋๋ฐ 2๋ฒ์ ๋ณด๋ฉด JSX๊ฐ Javascript๋ก ๋ณํ๋๋ ๊ฑธ ๋ณผ ์ ์๋ค.
React์ ํจ์๋ฅผ ์๋ฌธ์๋ก ๋ง๋ ํ ์ปค์คํ
์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ํ html์ฝ๋ ์ฌ์ด์ ๋ฃ์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์ ๊ทธ๋ด๊น??
//customButton.js
const customButton =()=>{
return <div>
<button></button>
</div>
}
// main.js
return
<div>
<h1>Title</h1>
<customButton/>
</div>
// ์ค๋ฅ๋ฐ์!
๊ทธ๊ฑด ๋ฐ๋ก JSX๋ฅผ ํธ๋์คํ์ผ๋งํ๋ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋จผ์ Babel์ ํตํด JSX => JavaScript๋ก ๋ณํ๋ ๋ ๋๋ฌธ์๋ก ์์ํ๋ ํจ์๋
React.createElement() ํจ์๋ฅผ ํตํด ์ปดํฌ๋ํธ๋ก ์ทจ๊ธ๋๊ณ ,
์๋ฌธ์๋ก ์์ํ๋ ์ด๋ฆ์ ์ผ๋ฐ HTML ํ๊ทธ๋ก ์ทจ๊ธ๋๋ค.
์ฌ์ค htmlํ๊ทธ๋ ๋ชจ๋ ์์ด ์๋ฌธ์์ธ๋ฐ
์ปดํฌ๋ํธ๋ฅผ Returnํ๋ ํจ์๊ฐ ์๋ค๊ณ ํ์๋ ์ด๊ฒ ์๋ฌธ์๋ผ๋ฉด? ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด๋ฆ์ด title์ด๋ผ๋ฉด?
Babel์ ์ปค์คํ
๋ title๊ณผ htmlํ๊ทธ์ title์ ๊ตฌ๋ถํ ๋ฐฉ๋ฒ์ด ์๋ค.
๊ทธ๋์ ๋ฆฌ์กํธ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ ๋๋ฌธ์๋ก ์์ฑํด์ฃผ์ด์ผํ๋ค!
์ฝ๊ฒ๋งํด์ htmlํ๊ทธ๋ ๊ฒน์น๋๊น Jsx๋ ๋๋ฌธ์๋ก ์ ์ธํด๋ผ~