Post

๐ŸŒŒ React ์ž…๋ฌธ 03 - JSX ๋ฌธ๋ฒ•

๐ŸŒŒ React ์ž…๋ฌธ 03 - JSX ๋ฌธ๋ฒ•

๐Ÿ“˜ ใ€Ž์†Œํ”Œ์˜ ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธใ€๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

JSX๋ž€?

1
const element = <h1>Hello, world! {name}</h1>;
  • JSX๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™•์žฅํ•œ ๋ฌธ๋ฒ•์œผ๋กœ, JavaScript eXtension์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ƒ๊ธฐ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ XML, HTML์„ ํ•ฉ์นœ ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
  • JSX ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด Component ๋‚ด๋ถ€์—์„œ createElement() ๋ฉ”์„œ๋“œ๋กœ ๋Œ€์ฒด๋œ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// JS
const element1 = React.createElement('h1', {className: 'greeting'}, 'Hello, world! ${name}'});

// JSX
const element2 = <h1 className="greeting">Hello, world! {name}</h1>;

/*
element = {
    type: 'h1',
    props: {
        className: 'greeting'
        children: 'Hello, world!'
    }
}
*/
console.log(element1);
console.log(element2);
  • ๊ฐ€๋ น ์œ„ ์ฝ”๋“œ์—์„œ element1๊ณผ element2๋ฅผ ์ฝ˜์†” ๋กœ๊ทธ๋กœ ์ถœ๋ ฅํ•˜๋ฉด ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.
  • ์ด์ฒ˜๋Ÿผ React.createElement() ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— JSX ๋ฌธ๋ฒ•์ด ํ•„์ˆ˜๋Š” ์•„๋‹ˆ๋‹ค.
  • ์ฐธ๊ณ ๋กœ JSX์—์„œ๋Š” ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด์กฐ๊ฑด Javascript ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

ย JSX ์™œ ์จ์•ผ ํ• ๊นŒ?

โœ… ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

  • ย JSX ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.
  • ์ด๋Š” ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ ์‹œํ‚จ๋‹ค.

โœ… ๋ณด์•ˆ ํ™•๋ณด

  • Injection Attack ํ•ดํ‚น ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ๋ณด์•ˆ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฆฌ์•กํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•˜๊ธฐ ์ „์— ์ž„๋ฒ ๋”ฉ๋œ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ๊ฐ’์€ ๊ด„ํ˜ธ ์‚ฌ์ด์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด๊ฒƒ์€ XSS๋ผ ๋ถˆ๋ฆฌ๋Š” Cross-site-scripting Attacks ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
1
2
const input = response.cross_site_scripting_attacks_code;
const element = <h1>{input}</h1>;
  • ์œ„ ์ฝ”๋“œ์—์„œ input์— Javascript ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

์‹ค์Šต

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import React from "react";

function Member(props) {
	return (
		<div>
			<h3>{`๐Ÿ˜† ๋ฉค๋ฒ„์˜ ์ด๋ฆ„์€ ${props.name}์ž…๋‹ˆ๋‹ค.`}</h3>
			<h4>{`โœ… ${props.name}๋‹˜์€ ์ด ${props.numOfProject}๊ฐœ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.`}</h4>
			<br/>
		</div>
	);
}

function Team() {
    return (
    <div>
	    <Member name="๊น€์ง„ํ˜•" numOfProject={3} />
	    <Member name="๋ฐ•โ—‹โ—‹" numOfProject={4} />
	    <Member name="์œคโ–กโ–ก" numOfProject={5} />
	    </div>
	);
}

export default Team;
  • ๋ฌธ์ž์—ด์— ๋™์ ์ธ ๊ฐ’์„ ๋„ฃ์œผ๋ ค๋ฉด ${}๋กœ ๊ฐ์‹ผ ํ›„ ๋ฐฑํ‹ฑ์œผ๋กœ ํ•œ๋ฒˆ ๋” ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import reportWebVitals from './reportWebVitals';
import Team from './Team';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
	<React.StrictMode>
		<Team/>
	</React.StrictMode>
);

reportWebVitals();
  • index.js์— ์ž‘์„ฑํ•œ Team Component๋ฅผ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

ํšŒ๊ณ 

  • ์ฑ…์„ ์ฝ์„ ๋•Œ๋Š” ์ดํ•ด๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์•˜๋Š”๋ฐ, ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋ ค๋‹ˆ ์ƒ๊ฐ์ฒ˜๋Ÿผ ๋˜์ง€ ์•Š์•˜๋‹ค.
  • ์ฑ…์„ ์ฝ์œผ๋ฉด์„œ ์‹ค์Šตํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ ์šฉํ•  ๋•Œ ๋งŽ์€ ๊ณต๋ถ€๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
This post is licensed under CC BY 4.0 by the author.