Post

🌌 React μž…λ¬Έ β…’ - JSX 문법

🌌 React μž…λ¬Έ β…’ - 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.