Post

🌌 React μž…λ¬Έ XIV - Composition Β· Specialization

🌌 React μž…λ¬Έ XIV - Composition Β· Specialization

πŸ“˜ γ€Žμ†Œν”Œμ˜ 처음 λ§Œλ‚œ λ¦¬μ•‘νŠΈγ€λ₯Ό 읽고 μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.

Composition

  • μ—¬λŸ¬ 개의 Componentλ₯Ό ν•©μ³μ„œ μƒˆλ‘œμš΄ Componentλ₯Ό λ§Œλ“œλŠ” 것을 λ§ν•œλ‹€.
  • κ°€λ Ή Component A와 Component Bλ₯Ό μ‚¬μš©ν•΄ ν•˜λ‚˜μ˜ νŽ˜μ΄μ§€λ₯Ό λ§Œλ“€μ—ˆλ‹€κ³  ν•˜λ©΄ Composition을 μ‚¬μš©ν–ˆλ‹€κ³  λ³Ό 수 μžˆλ‹€.
  • μ—¬λŸ¬ 개의 Componentλ₯Ό μ‘°ν•©ν•˜λŠ” 방법에 λŒ€ν•œ Composition 기법이 μ‘΄μž¬ν•œλ‹€.

Containment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 1. Parent
function FancyBorder(props) {
	return (
		<div className={'FancyBorder FancyBorder-' + props.color}>
			{props.children}
		</div>
	);
}

// 2. Children
function WelcomeDialog(props) {
	return (
		<FancyBorder color="blue">
			<h1 className="Dialog-title">
				μ–΄μ„œμ˜€μ„Έμš”
			</h1>
			<p className="Dialog-message">
				우리 μ‚¬μ΄νŠΈμ— λ°©λ¬Έν•˜μ‹  것을 ν™˜μ˜ν•©λ‹ˆλ‹€!
			</p>
		</FancyBorder>
	);
}
  • ν•˜μœ„ Componentλ₯Ό ν¬ν•¨ν•˜λŠ” ν˜•νƒœμ˜ ν•©μ„± 방법이닀.
  • Sidebarλ‚˜ Dialog와 같은 λ°•μŠ€ ν˜•νƒœμ˜ ComponentλŠ” μžμ‹ μ˜ ν•˜μœ„ Componentλ₯Ό 미리 μ•Œ 수 μ—†λ‹€.
  • 이럴 땐 props에 κΈ°λ³Έ λ‚΄μž₯된 children 속성을 μ‚¬μš©ν•˜λŠ” Containment 기법을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

Specialization

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 1. Parent
function Dialog(props) {
	return (
		<FancyBorder color="blue">
			<h1 className="Dialog-title">
				{props.title}
			</h1>
			<p className="Dialog-message">
				{props.message}
			</p>
		</FancyBorder>
	);
}

// 2. Children
function WelcomeDialog(props) {
	return (
		<Dialog
			title="μ–΄μ„œμ˜€μ„Έμš”"
			message="우리 μ‚¬μ΄νŠΈμ— λ°©λ¬Έν•˜μ‹  것을 ν™˜μ˜ν•©λ‹ˆλ‹€!"
		/>
	);
}
  • λ²”μš©μ μΈ κ°œλ…μ„ ꡬ별이 λ˜λ„λ‘ κ΅¬μ²΄ν™”ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.
  • 일반적인 객체 μ§€ν–₯ μ–Έμ–΄μ—μ„œλŠ” 상속을 μ΄μš©ν•˜μ—¬ Specialization을 κ΅¬ν˜„ν•˜μ§€λ§Œ Reactμ—μ„œλŠ” Composition을 μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€.
  • 상기 μ½”λ“œμ²˜λŸΌ Specialization은 λ²”μš©μ μœΌλ‘œ μ“Έ 수 μžˆλŠ” Componentλ₯Ό λ§Œλ“€μ–΄ 놓고 이λ₯Ό νŠΉμˆ˜ν™” μ‹œμΌœμ„œ Componentλ₯Ό μ‚¬μš©ν•˜λŠ” Composition 방식이닀.

Containment + Spectialization

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 1. Parent
function Dialog(props) {
	return (
		<FancyBorder color="blue">
			<h1 className="Dialog-title">
				{props.title}
			</h1>
			<p className="Dialog-message">
				{props.message}
			</p>
			{props.children}
		</FancyBorder>
	);
}

// 2. Children
function SignUpDialog(props) {
	const [nickname, setNickname] = useState('');
	
	const handleChange = (event) => {
		setNickname(event.target.value);
	}
	
	const handleSignUp = () => {
		alert(`μ–΄μ„œμ˜€μ„Έμš”, ${nickname}λ‹˜!`);
	}
	
	return (
		<Dialog 
			title="ν™”μ„± 탐사 ν”„λ‘œκ·Έλž¨"
			message="λ‹‰λ„€μž„μ„ μž…λ ₯ν•΄ μ£Όμ„Έμš”">
			<input 
				value={nickname}
				onChange={handleChange} />
			<button onClick={handleSignUp}>
				κ°€μž…ν•˜κΈ° 
			</button>
		</Dialog>
	);
}
  • props.children은 Containment에 ν•΄λ‹Ήν•˜κ³ , props.title, props.messageλŠ” Spacialization에 ν•΄λ‹Ήν•œλ‹€.

상속

  • Reactλ₯Ό κ°œλ°œν•œ MetaλŠ” 상속 기반의 Component 생성 방법을 μ°Ύμ§€ λͺ»ν–ˆλ‹€.
  • κ²°κ΅­ λ³΅μž‘ν•œ Componentλ₯Ό μͺΌκ°œ μ—¬λŸ¬ 개의 Component둜 λ§Œλ“€κ³ , λ§Œλ“  Component듀을 μ‘°ν•©ν•˜μ—¬ μƒˆλ‘œμš΄ Componentλ₯Ό λ§Œλ“€μžλŠ” 결둠에 μˆ˜λ ΄ν•œλ‹€.

μ‹€μŠ΅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Card.jsx
function Card(props) {
	const { title, backgroundColor, children } = props;
	
	return (
		<div
			style=>	
			{title && <h1>{title}</h1>}
			{children}
		</div>
	);
}

export default Card;

// ProfileCard.jsx
function ProfileCard(props) {
	return (
		<Card title="Inje Lee" backgroundColor="#4ea04e">
			<p>μ•ˆλ…•ν•˜μ„Έμš”,</p>
			<p>μ €λŠ” λ¦¬μ•‘νŠΈλ₯Ό μ‚¬μš©ν•΄μ„œ κ°œλ°œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.</p>
		</Card>
	);
}

export default ProfileCard;
  • CardλŠ” λ ˆμ΄μ•„μ›ƒλ§Œ λ‹΄λ‹Ήν•˜κ³ , μ‹€μ œ λ‚΄μš©μ€ μ™ΈλΆ€μ—μ„œ 전달 λ°›λŠ”λ‹€.

회고

  • Reactμ—μ„œ 합성이 μ–΄λ–»κ²Œ ν™œμš©λ˜λŠ”μ§€ 체감 ν•  수 μžˆμ—ˆλ‹€.
This post is licensed under CC BY 4.0 by the author.