์ค๋์ ๋จ์ด๋ js์ jsx์ด๋ค.
์ฌ์ค jsx๋ฅผ ์๊ฐํ๊ธฐ ์ํด js๋ ์ค๋์ ๋จ์ด์ ์ถ๊ฐํ๋ค.
React๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ณต๋ถํ๋ฉด์ Javascript ํ์ผ์ ์์ฑํ ๋, ํ์ฅ์๊ฐ .js ์ธ ๊ฒฝ์ฐ๋ ์๊ณ , .jsx ์ธ ๊ฒฝ์ฐ๋ ์์๋ค.
์ฒ์์๋ ํฐ ์ฐจ์ด๊ฐ ์์ด ๋ณด์ฌ์ ๋ณดํธ์ ์ธ .js๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ฉํ์๋๋ฐ, ๊ฐ ๊ธฐ๋ฅ์ ๋ํด ์์์ผ ํ์์ ์ ๋๋ก ํ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ ์ ๋ฆฌํด๋์๋ค.
๐ญ์์ฝ!
: JS๋ ํ์ค ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ปํ๊ณ , JSX๋ ์ฌ์ฉ์๊ฐ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํด ์ข ๋ ์ง๊ด์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์๋ HTML์ ๋ฌธ๋ฒ์ด๋ค.
๐ฉ๐ป๐ป JSX๋?
- Javascript XML์ ์ฝ์ด
- ์ฝ๊ฒ๋งํด jsx๋ JavaScript ํ์ฅ ๋ฌธ๋ฒ
- js๋ณด๋ค jsx๋ฅผ ์ฐ๋ ์ด์ ๋ ๋ณดํต ์๋ฐ์คํฌ๋ฆฝํธ ๋ด์ HTML์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ
- JSX๋ฅผ “babel”๋ก ์ปดํ์ผ ํ๋ฉด React ํ์ค ๋ฌธ๋ฒ์ธ javascript๋ก ์๋ ๋ณํ์ด ๋จ.
- ๋์ ๊ธฐ๋ฅ ์ฐจ์ด๋ ํฌ๊ฒ ์์ผ๋ฏ๋ก ์ฐ๊ธฐ ๋๋ฆ์ด๊ณ , React ๊ณต์ ๋ฌธ์์์๋ “ํ์๋ ์๋์ง๋ง ์ถ์ฒ” ์ด๋ผ๊ณ ๋์ ์์.
๐JS vs JSX ์ฝ๋ ๋น๊ต
1. JS
// .js
function greet(name) {
return "Hello, " + name + "!";
}
console.log(greet("John"));
์์ ์ฝ๋๋ ์ผ๋ฐ JavaScript ํ์ผ(.js)์ด๋ฉฐ, ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ์์ฑํ๊ณ ์ฝ์์ ์ถ๋ ฅํ๋ค. ๋ ๋ฒ์งธ๋ React ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ JSX ํ์ผ(.jsx)์ด๋ฉฐ, Greeting ์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๊ณ ReactDOM.render๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค. ์ด๋ ๊ฒ .js์ .jsx ํ์ผ์ ์๋ก ๋ค๋ฅธ ํ์ฅ์๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , React์ JSX ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
2. JSX
// .jsx
function Greeting({ name }) {
return <div>Hello, {name}!</div>;
}
ReactDOM.render(<Greeting name="John" />, document.getElementById("root"));
์ด ์ฝ๋๋ React ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ JSX ํ์ผ(.jsx)์ด๋ฉฐ, Greeting ์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๊ณ ReactDOM.render๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ค.
์ด๋ ๊ฒ .js์ .jsx ํ์ผ์ ์๋ก ๋ค๋ฅธ ํ์ฅ์๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , React์ JSX ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ์ฐจ์ด์ ์ด ์๋ค.
๐ญJSX ๋ฌธ๋ฒ
: ์ผ๋จ js์ jsx๋ ๋ฌธ๋ฒ์์ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ผ๋ฏ๋ก, js ์ฌ์ฉ ์ ์ฃผ์ํด์ผ ํ๋ ๋ฌธ๋ฒ์ ๋ช ๊ฐ์ง ์๊ฐํ๊ฒ ๋ค.
1. ํํ์ ์ฌ์ฉ
: ๋๋ถ๋ถ์ javascript ํํ์์ ๋ชจ๋ ๊ตฌํ์ด ๊ฐ๋ฅํ๋, ํํ์์ {}๋ก ๊ฐ์ธ์ ๋ํ๋ด์ผ ํ๋ค
const name = 'John';
const element = <div>Hello, {name}!</div>;
์์ ์์์์ name ๋ณ์๋ JSX ํํ์ ์์์ ์ค๊ดํธ {}๋ก ๊ฐ์ธ์ ธ ์๋ค. JSX์์ ์ค๊ดํธ๋ก ๊ฐ์ธ์ง ๋ถ๋ถ์ JavaScript ํํ์์ผ๋ก ๊ฐ์ฃผ๋๋ฉฐ, ํด๋น ํํ์์ ๊ฒฐ๊ณผ๊ฐ์ด JSX์ ์ฝ์ ๋๋ค.
2. ํด๋์ค ์ด๋ฆ๊ณผ ์คํ์ผ
: JSX์์ ํด๋์ค ์ด๋ฆ์ ์ง์ ํ ๋ class ๋์ className์ ์ฌ์ฉํด์ผ ํ๋ค. ๋ํ ์ธ๋ผ์ธ ์คํ์ผ์ ์ง์ ํ ๋ ๊ฐ์ฒด ํํ๋ก ์์ฑํด์ผ ํ๋ค.
const element = <div className="container" style={{ color: 'blue', fontSize: '16px' }}>Hello, JSX!</div>;
3. ์กฐ๊ฑด๋ถ ๋๋๋ง
: ์กฐ๊ฑด๋ถ๋ก ์์๋ฅผ ๋ ๋๋งํ ๋, ์ผํญ ์ฐ์ฐ์๋ ๋
ผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
const isLoggedIn = true;
const element = isLoggedIn ? <div>Welcome, User!</div> : <div>Please log in.</div>;
3. ์ฃผ์
: JSX ์์์ ์ฃผ์์ ์์ฑํ ๋๋ ์ค๊ดํธ ์์ ์ฃผ์์ ์์ฑํด์ผ ํ๋ค.
const element = (
<div>
{/* ์ด๊ฒ์ ์ฃผ์์
๋๋ค. */}
<p>Hello, JSX!</p>
</div>
);
์ด์ธ์๋ ๋ช ๊ฐ์ง ๋ฌธ๋ฒ ์ฌํญ๋ค์ด ์์ง๋ง, ๊ฐ๋จํ ๊ฒ๋ง ๋ช ๊ฐ ์๊ฐํด๋ณด์๋ค. ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป์ผ๋ ค๋ฉด React ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค. ์ด๋ฐ ์์ผ๋ก ์์ ๊ฐ์ ๋ฌธ๋ฒ์ ์ง์ผ JSX๋ฅผ ์์ฑํ๋ฉด ์ ์์ ์ผ๋ก ๋ ๋๋ง๋๊ณ ์คํ๋๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ค.
* / ์ฐธ๊ณ /*
babel ์ปดํ์ผ๋ฌ ์ฌ์ฉ๋ฒ๋ ๊ฐ๋จํ ์ ์ด๋๋ฉด ์ข์๊ฒ ๊ฐ์ ์ฒจ๋ถํ๋ค.ใ ์ ์ด๋๋ฉด ์ข์๊ฒ ๊ฐ์ ์ฒจ๋ถํ๋ค.
* JSX๋ฅผ Babel ์ปดํ์ผ๋ฌ๋ก ์ ์ฉํ๋ ๋ฐฉ๋ฒ
1. Node.js์ npm ์ค์น
2, ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ ์์ฑ ๋ฐ npm ํ๋ก์ ํธ๋ฅผ ์ด๊ธฐํ
npm init -y
3. Babel ๋ฐ JSX ๊ด๋ จ ํจํค์ง ์ค์น
npm install @babel/core @babel/cli @babel/preset-react --save-dev
4. ํ๋ก์ ํธ ๋ฃจํธ์ babel.config.json ํ์ผ์ ์์ฑํ๊ณ , ๋ค์๊ณผ ๊ฐ์ด ์ค์ ์ ์ถ์ .
{
"presets": ["@babel/preset-react"]
}
5. JSX๋ก ์์ฑ๋ ํ์ผ์ ์ปดํ์ผํ์ฌ ์ผ๋ฐ JavaScript ํ์ผ๋ก ๋ณํ. (Babel CLI๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ด ์ปดํ์ผ ๊ฐ๋ฅ)
npx babel src --out-dir dist
์์ ๋ช ๋ น์ด์์ src๋ JSX ํ์ผ์ด ์๋ ๋๋ ํ ๋ฆฌ, dist๋ ์ปดํ์ผ๋ JavaScript ํ์ผ์ด ์์ฑ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ํ๋ธ๋ค.
* JSX ์ฝ๋์ ์ถ๊ฐํด์ผ ๋ ์ฝ๋
1. React์ ReactDOM ๋ชจ๋์ import
import React from 'react';
import ReactDOM from 'react-dom';
2. JSX ๋ฌธ๋ฒ์ผ๋ก ์์ฑ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฑ
3. JSX ์ปดํฌ๋ํธ๋ฅผ ์ค์ ๋ก ๋ ๋๋งํด์ผ ํจ. ์ด๋ฅผ ์ํด ReactDOM.render() ํจ์๋ฅผ ์ฌ์ฉ
ReactDOM.render(<YourComponent />, document.getElementById('root'));
์ฌ๊ธฐ์ <YourComponent />์ JSX๋ก ์์ฑ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋จ.
document.getElementById('root')๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ DOM ์์์ ID๋ฅผ ๋ํ๋ ๋๋ค. ์ด ์์๋ ํ๋ก์ ํธ์ HTML ํ์ผ์์ ์ ์๋์ด ์์ด์ผ ํจ.
์ด๋ ๊ฒ ์ปดํ์ผ๋ ํ์ผ๋ค์ ๋ธ๋ผ์ฐ์ ์์ ์คํํ ์ ์๋ ์ผ๋ฐ JavaScript ์ฝ๋๋ก ๋ณํ๋๋ค.
'8์ Challenge : ๋จ์ด ๋ ๊ฐ์ฉ ์๊ฐํ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
8/10 (0) | 2023.08.10 |
---|---|
[CS์ง์] ํ๋ ์์ํฌ(Framework)์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Library) (0) | 2023.08.09 |
[html] script / script async vs script defer ์ฐจ์ด (0) | 2023.08.07 |
[8.1] ๋จธ์ ๋ฌ๋(Machine Learning)๊ณผ ๋ฅ๋ฌ๋(Deep Learning (0) | 2023.08.02 |
8์ Challenge! ๋งค์ผ ๊ฐ๋ฐ ๋จ์ด ๋ ๊ฐ์ฉ ์๊ฐํ๊ธฐ (0) | 2023.08.02 |