Front/React.js

[React] ์งง๊ณ  ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ JSX

ddo04 2024. 8. 6. 15:17

๐Ÿ‘จ‍๐ŸŽ“ JSX

  • React๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฑฐ์˜ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ
  • A syntax extension to javaScript
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ™•์žฅ ๋ฌธ๋ฒ•
  • JavaScript + XML/HTML์„ ๊ฒฐํ•ฉํ•œ ๊ฒƒ
const element = <h1>Hello, world!</h1>;

๐Ÿ‘จ‍๐ŸŽ“ JSX ์—ญํ• 

  • XML/HTML ์ฝ”๋“œ๋ฅผ JavaScript๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นจ
// JSX๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ

class Hello extends React.Component{
	render(){
    	return <div>Hello {this.props.toWhat}<div>;
    }
}

ReactDom.render(
	<Hello toWhat="World" />
    document.getElementById('root')
);
// JSX๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ

class Hello extends React.component{
	render(){
    	return React.createElement('div', null, 'Hello ${this.props.toWhat}');
    }
}

ReactDom.render(
	React.createElement(Hello, {toWhat:'world'}, null),
    document.getElementById('root)
);
  • React๋Š” ๊ฐ์ฒด๋“ค์„ ์ฝ์–ด์„œ DOM์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ ์œ ์ง€
  • React์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋ฅผ element๋ผ๊ณ  ๋ถ€๋ฆ„
  • createElement ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ
React.createElement(
	type,
    [props],
    [...children]
)
  • type๋Š” element์˜ ์œ ํ˜• ๋˜๋Š” ํƒ€์ž…์„ ๋‚˜ํƒ€๋ƒ„
  • type์—๋Š” div, span ๊ฐ™์€ htmlํƒœ๊ทธ๊ฐ€ ์˜ค๊ฑฐ๋‚˜ ๋‹ค๋ฅธ React component๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ
  • props๋Š” ์†์„ฑ๋“ค์ด ๋“ค์–ด๊ฐ
  • children๋Š” ํ˜„์žฌ element๊ฐ€ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์ž์‹ element
  • ๋ฆฌ์•กํŠธ์—์„œ ๊ผญ JSX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ createElement ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋ฉด ๋จ

๐Ÿ‘จ‍๐ŸŽ“ JSX ์žฅ์ 

  • ๊ฐ€๋…์„ฑ์ด ๋†’์œผ๋ฉฐ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” 
// JSX ์‚ฌ์šฉํ•จ

<div>Hello, {name}</div>

// JSX ์‚ฌ์šฉ ์•ˆํ•จ

React.createElement('div', null, 'Hello, ${name}');
  • ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ
    • JSX๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ HTML์˜ div ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ name์ด๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ„ ์ธ์‚ฌ๋ง ํ‘œํ˜„
    • JSX๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ๋Š” createElement ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰
  • ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
    • JSX๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๊ฐ€ ๊ทธ๋ ‡์ง€ ์•Š์€ ์ฝ”๋“œ์— ๋น„ํ•ด ์ฝ”๋“œ์˜ ์˜๋ฏธ๊ฐ€ ํ›จ์”ฌ ๋” ๋น ๋ฅด๊ฒŒ ์™€๋‹ฟ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ
    • ๊ฐ€๋…์„ฑ์€ ์ฝ”๋“œ ์ž‘์„ฑํ•  ๋•Œ ๋ถ„๋งŒ ์•„๋‹ˆ๋ผ ์œ ์ง€ ๋ณด์ˆ˜ ๊ด€์ ์—์„œ๋„ ์ค‘์š”ํ•œ ๋ถ€๋ถ„
    • ๊ฐ€๋…์„ฑ์ด ๋†’์„์ˆ˜๋ก ์ฝ”๋“œ ์ƒ์— ์กด์žฌํ•˜๋Š” ๋ฒ„๊ทธ ๋˜ํ•œ ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌ ๊ฐ€๋Šฅ
  • Injection Attacks ํ•ดํ‚น ๋ฐฉ์–ด
    • ๋ณด์•ˆ์„ฑ์ด ์˜ฌ๋ผ๊ฐ
    • ์ธ์ ์…˜ ์–ดํƒ์€ ์ž…๋ ฅ์ฐฝ์— ๋ฌธ์ž๋‚˜ ์ˆซ์ž ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๊ฐ’์ด ์•„๋‹Œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ํ•ดํ‚น ๋ฐฉ๋ฒ•
    • title์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ์ž ์žฌ์ ์œผ๋กœ ๋ณด์•ˆ ์œ„ํ—˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์‚ฝ์ž…๋จ
    • JSX ์ฝ”๋“œ์—์„œ๋Š” ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ title ๋ณ€์ˆ˜์— ์‚ฝ์ž…, ์ž„๋ฒ ๋”ฉํ•˜๊ณ  ์žˆ์Œ
    • React DOM์€ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์— ์ž„๋ฒ ๋”ฉํ•œ ๊ฐ’์„ ๋ชจ๋‘ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
    • ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ๊ฐ’์€ ๊ด„ํ˜ธ ์‚ฌ์ด์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†์Œ
    • XSS๋ผ ๋ถˆ๋ฆฌ๋Š” ํฌ๋กœ์Šค ์‚ฌ์ด๋“œ ์Šคํฌ๋ฆฝํŒ… ์–ดํƒ์„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์Œ
    • JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์œ„ํ—˜์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
const title = response.potentiallyMaliciousInput;

// ์ด ์ฝ”๋“œ๋Š” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค
const element = >h1>{title}</h1>;

๐Ÿ‘จ‍๐ŸŽ“ JSX ์‚ฌ์šฉ๋ฒ•

    • ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜๊ณ  ์ถ”๊ฐ€๋กœ XML๊ณผ HTML์„ ์„ž์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋จ
const name = '๋„ํฌ';
const element = <h1>์•ˆ๋…•, {name}</h1>

ReactDOM.render(
	element,
    document.getElementById('root')
);
  • element๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ถ€๋ถ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ HTML๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์„ž์ธ ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ
  • XML/HTML ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— JS ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์ฃผ๋ฉด ๋จ

๐Ÿ‘จ‍๐ŸŽ“ ํƒœ๊ทธ์˜ ์†์„ฑ์— ๊ฐ’์„ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•

// ํฐ๋”ฐ์˜ดํ‘œ ์‚ฌ์ด์— ๋ฌธ์ž์—ด์„ ๋„ฃ๊ฑฐ๋‚˜
const element = <div tabIndex="0"></div>;

//์ค‘๊ด„ํ˜ธ ์‚ฌ์ด์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋„ฃ์œผ๋ฉด ๋จ!
const element = <img src={user.avatarUrl}></img>;
  • JSX์—์„œ๋Š” ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค๋ผ๊ณ  ์™ธ์šฐ๋ฉด ๋จ

๐Ÿ‘จ‍๐ŸŽ“ ์ž์‹์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

const element = (
	<div>
    	<h1>์•ˆ๋…•ํ•˜์„ธ์š”>/h1>
        <h2>์—ด์‹ฌํžˆ ๋ฆฌ์•กํŠธ๋ฅผ ๊ณต๋ถ€ํ•ด ๋ด…์‹œ๋‹ค!</h2>
    </div>
);
  • ์ƒ์œ„ ํƒœ๊ทธ๊ฐ€ ํ•˜์œ„ ํƒœ๊ทธ๋ฅผ ๋‘˜๋Ÿฌ์‹ธ๋„๋ก ํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ž์‹์ด ์ •์˜๋จ

๐Ÿ‘จ‍๐ŸŽ“ ์‹ค์Šต - JSX ์ฝ”๋“œ ์ž‘์„ฑ

  • JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ๋†’๊ณ  ์ง๊ด€์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ

  • ์™„๋ฒฝํžˆ ์ž‘์„ฑํ•˜์˜€๋Š”๋ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ œ๋Œ€๋กœ ๋‚˜์˜ค์ง€ ์•Š์•„ ์ˆ˜์ • ์ค‘์— ์žˆ์Šต๋‹ˆ๋‹ค