리μ‘νΈ μ»΄ν¬λνΈ μ¬μ¬μ©μ±μ λμ΄λ μ»΄ν¬μ§μ ν¨ν΄
리μ‘νΈλ μ»΄ν¬λνΈ κΈ°λ°μ UI κ°λ°μ ν΅ν΄ μ½λμ λͺ¨λνμ μ¬μ¬μ©μ±μ κ·Ήλνν μ μλ κ°λ ₯ν λꡬμ λλ€. λκ·λͺ¨ μ ν리μΌμ΄μ μ κ°λ°νλ©΄μ μ μ§λ³΄μμ±κ³Ό νμ₯μ±μ λμ΄κΈ° μν΄μλ, λ¨μν μ»΄ν¬λνΈλ₯Ό λΆλ¦¬νλ κ²μ λμ΄μ μ¬μ¬μ© κ°λ₯ν ν¨ν΄μ λμ νλ κ²μ΄ νμμ μ λλ€.
μ΄λ² ν¬μ€ν μμλ μ»΄ν¬λνΈ μ»΄ν¬μ§μ , κ³ μ°¨ μ»΄ν¬λνΈ(HOC), λ λ νλ‘ν(Render Prop) λ± λ€μν ν¨ν΄μ νμ©νμ¬ λ¦¬μ‘νΈ μ»΄ν¬λνΈμ μ¬μ¬μ©μ±κ³Ό μ μ§λ³΄μμ±μ ν₯μμν€λ λ°©λ²μ λν΄ μ¬λ μκ² λ Όμνκ³ μ ν©λλ€.
μ»΄ν¬λνΈ μ»΄ν¬μ§μ μ κ°λ κ³Ό μ₯μ
μ»΄ν¬λνΈ μ»΄ν¬μ§μ μ 리μ‘νΈμ κ°μ₯ κΈ°λ³Έμ μΈ μ€κ³ μ² ν μ€ νλλ‘, μ¬λ¬ κ°μ μμ μ»΄ν¬λνΈλ₯Ό μ‘°ν©νμ¬ λ³΅μ‘ν UIλ₯Ό ꡬμ±νλ λ°©λ²μ λλ€. μ΄ λ°©μμ λ€μκ³Ό κ°μ μ΄μ μ μ 곡ν©λλ€.
- λͺ¨λν: κΈ°λ₯ λ¨μλ‘ μ»΄ν¬λνΈλ₯Ό λΆλ¦¬νμ¬, κ°κ°μ μ»΄ν¬λνΈκ° λ¨μΌ μ± μ μμΉ(Single Responsibility Principle)μ λ°λ₯΄κ² λ©λλ€. μ΄λ κ² λΆλ¦¬λ μ»΄ν¬λνΈλ κ°κ° λ 립μ μΌλ‘ κ°λ°, ν μ€νΈ, μ μ§λ³΄μν μ μμ΅λλ€.
- μ¬μ¬μ©μ±: λμΌν UI μμλ λ‘μ§μ΄ λ°λ³΅λλ κ²½μ°, νλμ μ»΄ν¬λνΈλ₯Ό μ¬λ¬ κ³³μμ νμ©ν μ μμ΄ μ½λ μ€λ³΅μ μ€μ΄κ³ ν¨μ¨μ±μ λμ λλ€.
- μ μ°μ±: μ»΄ν¬λνΈλ₯Ό μ‘°ν©νλ λ°©μμ, μμ μ»΄ν¬λνΈκ° νμ μ»΄ν¬λνΈμ λ΄μ©μ μμ λ‘κ² μ λ¬νκ±°λ μμ ν μ μκ² ν¨μΌλ‘μ¨ μ¬μ©μ μ μ UIλ₯Ό μ½κ² ꡬνν μ μλλ‘ λμμ€λλ€.
μλ₯Ό λ€μ΄, λ μ΄μμ μ»΄ν¬λνΈμ μ½ν μΈ μ»΄ν¬λνΈλ₯Ό λΆλ¦¬νμ¬ μ¬μ©νλ λ°©μμ, λ μ΄μμμ 곡ν΅λ μ€νμΌκ³Ό ꡬ쑰λ₯Ό μ μ§νλ©΄μ μ½ν μΈ λ§ κ°λ³μ μΌλ‘ λ³κ²½ν μ μλ μ μ°ν λμμΈμ κ°λ₯νκ² ν©λλ€.
κ³ μ°¨ μ»΄ν¬λνΈ(Higher-Order Component, HOC)
κ³ μ°¨ μ»΄ν¬λνΈ(HOC)λ κΈ°μ‘΄ μ»΄ν¬λνΈλ₯Ό μΈμλ‘ λ°μ μλ‘μ΄ κΈ°λ₯μ΄λ λ°μ΄ν°λ₯Ό μΆκ°νμ¬ νμ₯λ μ»΄ν¬λνΈλ₯Ό λ°ννλ ν¨ν΄μ λλ€. HOCλ κ³΅ν΅ λ‘μ§μ μ¬λ¬ μ»΄ν¬λνΈμ κ±Έμ³ μ¬μ¬μ©ν λ λ§€μ° μ μ©ν©λλ€.
HOCμ μ£Όμ νΉμ§
- μ½λ μ¬μ¬μ©: 곡ν΅μ μΈ κΈ°λ₯(μ: λ°μ΄ν° ν¨μΉ, μΈμ¦, λ‘κΉ )μ HOC λ΄λΆμ μΊ‘μνν¨μΌλ‘μ¨, ν΄λΉ κΈ°λ₯μ μ¬λ¬ μ»΄ν¬λνΈμμ μ€λ³΅ μμ΄ μ¬μ©ν μ μμ΅λλ€.
- κ΄μ¬μ¬μ λΆλ¦¬: UIμ λΉμ¦λμ€ λ‘μ§μ λΆλ¦¬νμ¬, κ°κ°μ μ»΄ν¬λνΈκ° μμ μ μ± μμ μ§μ€ν μ μλλ‘ λμμ€λλ€.
- μ»΄ν¬λνΈ νμ₯: κΈ°μ‘΄ μ»΄ν¬λνΈμ κΈ°λ₯μ μ½κ² νμ₯ν μ μμ΄, μ μ§λ³΄μμ±κ³Ό νμ₯μ±μ΄ λμμ§λλ€.
μλλ κ°λ¨ν HOC μμ μ λλ€. μ΄ μμ λ μ¬μ©μμ μΈμ¦ μνλ₯Ό νμΈνμ¬, μΈμ¦λμ§ μμ κ²½μ° λ‘κ·ΈμΈ νμ΄μ§λ‘ 리λ€μ΄λ νΈνλ κΈ°λ₯μ μΆκ°ν©λλ€.
import React from 'react';
import { Redirect } from 'react-router-dom';
const withAuth = (WrappedComponent) => {
return class extends React.Component {
render() {
const { isAuthenticated } = this.props;
if (!isAuthenticated) {
return <Redirect to="/login" />;
}
return <WrappedComponent {...this.props} />;
}
};
};
export default withAuth;
μ μ½λλ withAuthλΌλ HOCλ₯Ό ν΅ν΄, μ λ¬λ μ»΄ν¬λνΈκ° μΈμ¦λ μ¬μ©μμκ²λ§ λ ΈμΆλλλ‘ μ μ΄ν©λλ€. μ΄λ₯Ό ν΅ν΄ λ‘κ·ΈμΈ κ΄λ ¨ λ‘μ§μ μ¬λ¬ μ»΄ν¬λνΈμ λ°λ³΅νμ§ μκ³ λ μ¬μ¬μ©ν μ μμ΅λλ€.
λ λ νλ‘ν(Render Prop) ν¨ν΄
λ λ νλ‘ν ν¨ν΄μ μ»΄ν¬λνΈκ° μμ μ λ λλ§ λ‘μ§μ ν¨μλ‘ μ λ¬λ°μ, κ·Έ ν¨μκ° λ°ννλ JSXλ₯Ό λ λλ§νλ λ°©μμ λλ€. μ΄ ν¨ν΄μ μ»΄ν¬λνΈ κ°μ μνλ λ‘μ§μ 곡μ νλ λ° ν¨κ³Όμ μ λλ€.
λ λ νλ‘νμ μ₯μ
- μ μ°ν λ°μ΄ν° μ λ¬: λ λ νλ‘νλ₯Ό μ¬μ©νλ©΄, λΆλͺ¨ μ»΄ν¬λνΈμμ μμ μ»΄ν¬λνΈμ λ°μ΄ν°λ₯Ό μ λ¬νλ λ°©μμ΄ λ¨μν΄μ§κ³ , λ€μν 쑰건μ λ°λΌ λ λλ§ λ‘μ§μ μ½κ² 컀μ€ν°λ§μ΄μ§ν μ μμ΅λλ€.
- λ‘μ§ μΊ‘μν: 볡μ‘ν μν κ΄λ¦¬λ μ΄λ²€νΈ μ²λ¦¬λ₯Ό λ³λμ ν¨μλ‘ λΆλ¦¬νμ¬, μ¬μ¬μ© κ°λ₯ν λ‘μ§μΌλ‘ λ§λ€ μ μμ΅λλ€.
- μ»΄ν¬λνΈ λ 립μ±: λ λ νλ‘νλ₯Ό μ¬μ©νλ©΄, λ λλ§κ³Ό λ‘μ§ μ²λ¦¬λ₯Ό λΆλ¦¬ν μ μμ΄ μ»΄ν¬λνΈμ λ 립μ±μ΄ κ°νλκ³ ν μ€νΈκ° μ©μ΄ν΄μ§λλ€.
μλ μμ λ λ§μ°μ€ μμΉλ₯Ό μΆμ νλ μ»΄ν¬λνΈλ₯Ό λ λ νλ‘ν λ°©μμΌλ‘ ꡬνν μμ λλ€.
import React, { Component } from 'react';
class MouseTracker extends Component {
state = { x: 0, y: 0 };
handleMouseMove = (event) => {
this.setState({ x: event.clientX, y: event.clientY });
};
render() {
return (
<div style={{ height: '100vh' }} onMouseMove={this.handleMouseMove}>
{/* λΆλͺ¨ μ»΄ν¬λνΈμμ render propμ ν΅ν΄ λ§μ°μ€ μ’νλ₯Ό μ λ¬λ°μ΅λλ€. */}
{this.props.render(this.state)}
</div>
);
}
}
export default MouseTracker;
μ΄μ μ΄ μ»΄ν¬λνΈλ₯Ό νμ©νμ¬, νλ©΄μ λ§μ°μ€ μ’νλ₯Ό μΆλ ₯νλ μ»΄ν¬λνΈλ₯Ό μ½κ² ꡬνν μ μμ΅λλ€.
import React from 'react';
import MouseTracker from './MouseTracker';
const App = () => {
return (
<div>
<h2>λ λ νλ‘ν ν¨ν΄μ νμ©ν λ§μ°μ€ μμΉ μΆμ </h2>
<MouseTracker render={({ x, y }) => (
<h3>νμ¬ μμΉ: {x} x {y}</h3>
)} />
</div>
);
};
export default App;
μ΄μ κ°μ΄ λ λ νλ‘ν ν¨ν΄μ μ¬μ©νλ©΄, μν κ΄λ¦¬μ λ λλ§ λ‘μ§μ λΆλ¦¬νκ³ μ μ°νκ² μ¬μ¬μ©ν μ μμ΅λλ€.
ν¨ν΄ μ ν μ κ³ λ €μ¬ν
μ»΄ν¬λνΈ μ¬μ¬μ©μ±μ λμ΄κΈ° μν΄ μ¬λ¬ ν¨ν΄μ λμ ν λ, λ€μκ³Ό κ°μ μ¬νλ€μ κ³ λ €νλ κ²μ΄ μ€μν©λλ€.
- νλ‘μ νΈμ κ·λͺ¨μ 볡μ‘μ±: μκ·λͺ¨ νλ‘μ νΈμμλ κ°λ¨ν μ»΄ν¬λνΈ μ»΄ν¬μ§μ λ§μΌλ‘λ μΆ©λΆν μ μμ§λ§, λκ·λͺ¨ μ ν리μΌμ΄μ μμλ HOCλ λ λ νλ‘ν κ°μ ν¨ν΄μ ν΅ν΄ κ³΅ν΅ λ‘μ§μ μΊ‘μννλ κ²μ΄ ν¨κ³Όμ μ λλ€.
- μ μ§λ³΄μμ νμ₯μ±: κ³΅ν΅ κΈ°λ₯μ λͺ¨λννκ³ μ¬μ¬μ© κ°λ₯ν ννλ‘ μμ±νλ©΄, λμ€μ κΈ°λ₯ νμ₯μ΄ νμν λ μμ λ²μκ° μ΅μνλ©λλ€.
- κ°λ μ±κ³Ό ν μ€νΈ μ©μ΄μ±: ν¨ν΄μ μ μ ν μ ννμ¬ μ»΄ν¬λνΈμ λ‘μ§μ λΆλ¦¬νλ©΄, μ½λμ κ°λ μ±μ΄ ν₯μλκ³ λ¨μ ν μ€νΈλ₯Ό ν΅ν΄ κ° κΈ°λ₯μ λ 립μ μΌλ‘ κ²μ¦ν μ μμ΅λλ€.
- νΌν¬λ¨Όμ€ κ³ λ €: HOCλ λ λ νλ‘νλ₯Ό μ¬μ©ν λ λΆνμν λ λλ§μ΄ λ°μνμ§ μλλ‘ μ΅μ ννλ κ²μ΄ μ€μν©λλ€. μλ₯Ό λ€μ΄, React.memoλ useCallbackμ μ μ ν νμ©νμ¬ μ±λ₯ μ νλ₯Ό λ°©μ§ν μ μμ΅λλ€.
κ²°λ‘
μ»΄ν¬λνΈ μ»΄ν¬μ§μ , κ³ μ°¨ μ»΄ν¬λνΈ(HOC), λ λ νλ‘ν λ± λ€μν ν¨ν΄μ 리μ‘νΈ μ ν리μΌμ΄μ μμ μ½λ μ¬μ¬μ©μ±κ³Ό μ μ§λ³΄μμ±μ ν¬κ² ν₯μμν€λ ν΅μ¬ μ λ΅μ λλ€. μ»΄ν¬λνΈ μ»΄ν¬μ§μ μ κΈ°λ³Έμ μΈ λͺ¨λνμ μ¬μ¬μ©μ±μ μ 곡νλ©°, HOCλ κ³΅ν΅ λ‘μ§μ μΊ‘μννμ¬ μ¬λ¬ μ»΄ν¬λνΈμ μ μ©ν μ μλ μ μ°ν λ°©λ²μ μ 곡ν©λλ€. λν, λ λ νλ‘ν ν¨ν΄μ μνμ λ λλ§ λ‘μ§μ λΆλ¦¬νμ¬ λμ± μ μ°ν λ°μ΄ν° μ λ¬ λ° UI 컀μ€ν°λ§μ΄μ§μ κ°λ₯νκ² ν©λλ€.
μ΄λ¬ν ν¨ν΄λ€μ μ μ ν μ‘°ν©νκ³ νμ©νλ©΄, μ½λ μ€λ³΅μ μ€μ΄κ³ μ μ§λ³΄μλ₯Ό μ½κ² νλ©°, νμ₯μ±μ΄ λ°μ΄λ μ ν리μΌμ΄μ μ κ°λ°ν μ μμ΅λλ€. νλ‘μ νΈμ νΉμ±κ³Ό μꡬμ¬νμ λ§μΆ° μ ν©ν ν¨ν΄μ μ ννκ³ , νμμ λ°λΌ React.memo, useCallback λ±μ μ΅μ ν κΈ°λ²μ λ³ννλ©΄, λ³΄λ€ μμ μ μ΄κ³ ν¨μ¨μ μΈ λ¦¬μ‘νΈ μ ν리μΌμ΄μ μ ꡬνν μ μμ κ²μ λλ€.
리μ‘νΈ μ»΄ν¬λνΈ μ¬μ¬μ©μ± ν₯μμ μν λ€μν ν¨ν΄μ μ΄ν΄νκ³ μ μ©νλ κ²μ κ°λ°μλ‘μμ μλμ ν¬κ² λμ΄λ μ€μν λ¨κ³μ λλ€. μ΄λ¬ν μ κ·Ό λ°©μμ ν΅ν΄ ν₯ν 볡μ‘ν μ ν리μΌμ΄μ μμλ μ§μμ μΌλ‘ μ μ§λ³΄μμ νμ₯μ΄ μ©μ΄ν μ½λλ₯Ό μμ±νμκΈΈ λ°λλλ€.
λκΈ