8์›” Challenge : ๋‹จ์–ด ๋‘ ๊ฐœ์”ฉ ์†Œ๊ฐœํ•˜๊ธฐ

[React] .js vs .jsx ์ฐจ์ด์ 

๋ฐ์ฅฌ๋”” 2023. 8. 3. 08:08

 

์˜ค๋Š˜์˜ ๋‹จ์–ด๋Š” 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 ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.