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๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ฑ์ด ๋๊ณ ์ง๊ด์ ์ธ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ
- ์๋ฒฝํ ์์ฑํ์๋๋ฐ ๊ฒฐ๊ณผ๊ฐ ์ ๋๋ก ๋์ค์ง ์์ ์์ ์ค์ ์์ต๋๋ค