Search
Duplicate

Component

Component

React 의 μž¬μ‚¬μš© κ°€λŠ₯ν•œ UI μš”μ†Œ
μ»΄ν¬λ„ŒνŠΈλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ UI 쑰각으둜, 독립적이며 νŠΉμ • κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ»΄ν¬λ„ŒνŠΈμ˜ μ‘°ν•©μœΌλ‘œ κ΅¬μ„±λ˜λ©°, 각 μ»΄ν¬λ„ŒνŠΈλŠ” 자체적으둜 μƒνƒœλ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λͺ¨λ“ˆν™”λœ κ΅¬μ‘°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 보닀 효율적으둜 κ΄€λ¦¬ν•˜κ³  μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰½κ²Œ λ§Œλ“­λ‹ˆλ‹€.

μ»΄ν¬λ„ŒνŠΈ μ΄ν•΄ν•˜κΈ°

μœ„μ˜ κ·Έλ¦Όμ—μ„œ λ‹€μŒ λ¦¬μ•‘νŠΈ μ•„μ΄μ½˜μœΌλ‘œ ν‘œμ‹œν•œ 뢀뢄은 μ „λΆ€ μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
μ»΄ν¬λ„ŒνŠΈλŠ” React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ‹€μ–‘ν•œ 역할을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 주둜 λ‹€μŒκ³Ό 같은 μ—­ν• λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€
헀더, 메인, ν‘Έν„°, 메뉴바, μ‚¬μ΄λ“œλ°”, 폼, λ²„νŠΌ λ“±
1.
헀더 (Header) μ»΄ν¬λ„ŒνŠΈ: μ›Ή νŽ˜μ΄μ§€ 상단에 μœ„μΉ˜ν•˜λ©° μ‚¬μ΄νŠΈ 둜고, λ„€λΉ„κ²Œμ΄μ…˜ 등을 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.
2.
메인 (Main) μ»΄ν¬λ„ŒνŠΈ: μ›Ή νŽ˜μ΄μ§€μ˜ μ£Όμš” μ½˜ν…μΈ λ₯Ό ν‘œμ‹œν•˜λŠ” λΆ€λΆ„μœΌλ‘œ, λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈλ₯Ό ν¬ν•¨ν•˜μ—¬ νŽ˜μ΄μ§€λ₯Ό ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.
3.
ν‘Έν„° (Footer) μ»΄ν¬λ„ŒνŠΈ: μ›Ή νŽ˜μ΄μ§€ ν•˜λ‹¨μ— μœ„μΉ˜ν•˜λ©° μ €μž‘κΆŒ 정보, μ—°λ½μ²˜ 등을 ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
4.
메뉴바 (Navbar) μ»΄ν¬λ„ŒνŠΈ: λ„€λΉ„κ²Œμ΄μ…˜ 메뉴, 링크 등을 λ‹΄λ‹Ήν•˜μ—¬ μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€ 간을 이동할 수 있게 ν•©λ‹ˆλ‹€.
5.
μ‚¬μ΄λ“œλ°” (Sidebar) μ»΄ν¬λ„ŒνŠΈ: μ›Ή νŽ˜μ΄μ§€μ˜ 츑면에 μœ„μΉ˜ν•˜λ©° λΆ€κ°€ μ •λ³΄λ‚˜ 메뉴 등을 ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
6.
폼 (Form) μ»΄ν¬λ„ŒνŠΈ: μ‚¬μš©μžλ‘œλΆ€ν„° 정보λ₯Ό μž…λ ₯λ°›κΈ° μœ„ν•œ 폼 μš”μ†Œλ“€μ„ 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.
7.
λ²„νŠΌ (Button) μ»΄ν¬λ„ŒνŠΈ: μ‚¬μš©μžμ™€ μƒν˜Έμž‘μš©ν•˜κΈ° μœ„ν•œ λ²„νŠΌμ„ ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
λ˜ν•œ, Reactμ—μ„œλŠ” μ»΄ν¬λ„ŒνŠΈ μ•ˆμ— λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈλ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό Component Composition; "μ»΄ν¬λ„ŒνŠΈ ν•©μ„±" λ˜λŠ” "μ»΄ν¬λ„ŒνŠΈ 쑰립"이라고 ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ»΄ν¬λ„ŒνŠΈλ₯Ό μž¬μ‚¬μš©ν•˜κ³ , μ½”λ“œλ₯Ό λͺ¨λ“ˆν™”ν•˜μ—¬ μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄, 메인 μ»΄ν¬λ„ŒνŠΈ μ•ˆμ— λ‹€μ–‘ν•œ μ„ΈλΆ€ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‘°ν•©ν•˜μ—¬ νŽ˜μ΄μ§€λ₯Ό κ΅¬μ„±ν•˜λŠ” 것이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ»΄ν¬λ„ŒνŠΈ μ •μ˜

Reactμ—μ„œ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ •μ˜ν•˜λŠ” 방법은 크게 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ 클래슀 μ»΄ν¬λ„ŒνŠΈ 두 κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.
1.
ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ
2.
클래슀 μ»΄ν¬λ„ŒνŠΈ

ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ

function ν‚€μ›Œλ“œλ‚˜ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜ν•˜λ©°, propsλ₯Ό 인자둜 λ°›μ•„ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
JSX 문법을 μ‚¬μš©ν•˜λŠ” 경우 ν™•μž₯자λ₯Ό .jsx둜 μ‚¬μš©ν•˜λŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ JSX 문법을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  일반 JavaScript 파일둜 κ΅¬ν˜„ν•˜λ €λ©΄ .js ν™•μž₯자λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
일반적으둜 Reactμ—μ„œλŠ” μ»΄ν¬λ„ŒνŠΈ νŒŒμΌμ— JSXλ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ .jsx ν™•μž₯자λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ μ½”λ“œ μ—λ””ν„°λ‚˜ λ‹€λ₯Έ λ„κ΅¬μ—μ„œ ν•΄λ‹Ή 파일이 React μ»΄ν¬λ„ŒνŠΈλ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŒμ„ μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

선언적 ν•¨μˆ˜λ‘œ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ μ„ μ–Έ

import React from 'react'; // 선언적 ν•¨μˆ˜ - ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ μ„ μ–Έ function FunctionalComponent() { return ( <div> <h1>Hello, Functional Component!</h1> <p>This is a simple functional component.</p> </div> ); } export default FunctionalComponent;
JavaScript
볡사

읡λͺ… ν•¨μˆ˜(ν™”μ‚΄ν‘œ ν•¨μˆ˜)둜 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ μ„ μ–Έ

import React from 'react'; // 읡λͺ… ν•¨μˆ˜(ν™”μ‚΄ν‘œ ν•¨μˆ˜) - ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ μ •μ˜ const FunctionalComponent = (props) => { return ( <div> <h1>Hello, Functional Component!</h1> <p>This is a simple functional component.</p> </div> ); }; export default FunctionalComponent;
JavaScript
볡사

Hooksλ₯Ό μ‚¬μš©ν•œ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ

import React, { useState, useEffect } from 'react'; const ExampleComponent = () => { // useState: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒνƒœλ₯Ό 관리할 수 있게 ν•΄μ£ΌλŠ” Hook const [count, setCount] = useState(0); // useEffect: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ λΆ€μˆ˜ 효과(μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ)λ₯Ό μˆ˜ν–‰ν•  수 있게 ν•΄μ£ΌλŠ” Hook useEffect(() => { document.title = `Count: ${count}`; // μ»΄ν¬λ„ŒνŠΈκ°€ λ§ˆμš΄νŠΈλ˜κ±°λ‚˜ count 값이 변경될 λ•Œλ§ˆλ‹€ μ‹€ν–‰λ˜λŠ” λΆ€μˆ˜ 효과 // μ—¬κΈ°μ„œλŠ” λ¬Έμ„œμ˜ 제λͺ©μ„ μ—…λ°μ΄νŠΈν•˜λŠ” μ˜ˆμ‹œλ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€. // μ΄λ ‡κ²Œ useEffectλ₯Ό μ‚¬μš©ν•˜λ©΄ λ Œλ”λ§ 직후 λ˜λŠ” 값이 변경될 λ•Œ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. // useEffect의 두 번째 λ§€κ°œλ³€μˆ˜λ‘œ 배열을 μ „λ‹¬ν•˜λ©΄ ν•΄λ‹Ή 값이 변경될 λ•Œλ§Œ μ‹€ν–‰λ©λ‹ˆλ‹€. // λ§Œμ•½ 빈 배열을 μ „λ‹¬ν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈκ°€ 처음 마운트될 λ•Œλ§Œ μ‹€ν–‰λ©λ‹ˆλ‹€. }, [count]); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); }; export default ExampleComponent;
JavaScript
볡사
β€’
useState, useEffect, λ“±μ˜ Hook ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒνƒœμ™€ 라이프사이클 κΈ°λŠ₯을 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.
β€’
useState : ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μƒνƒœλ₯Ό μΆ”κ°€ν•˜κ³  관리할 수 있게 ν•˜λŠ” Hookμž…λ‹ˆλ‹€. useState ν•¨μˆ˜λŠ” ν˜„μž¬ μƒνƒœμ™€ μƒνƒœλ₯Ό κ°±μ‹ ν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
β€’
useEffect : ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ λΆ€μˆ˜ 효과(μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ)λ₯Ό μˆ˜ν–‰ν•  수 있게 ν•˜λŠ” Hookμž…λ‹ˆλ‹€. μ»΄ν¬λ„ŒνŠΈμ˜ λ Œλ”λ§ μ§ν›„λ‚˜ νŠΉμ • μƒνƒœλ‚˜ ν”„λ‘­μŠ€κ°€ 변경될 λ•Œ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” κ°„κ²°ν•˜κ³  가독성이 μ’‹μœΌλ©°, Hooks의 λ„μž…μœΌλ‘œ κΈ°λŠ₯적으둜 ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ μœ μ‚¬ν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΅œμ‹ μ˜ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ Hooksλ₯Ό 주둜 μ‚¬μš©ν•˜λŠ” μΆ”μ„Έμž…λ‹ˆλ‹€.

클래슀 μ»΄ν¬λ„ŒνŠΈ

클래슀 μ»΄ν¬λ„ŒνŠΈλŠ” React.Component 클래슀λ₯Ό μƒμ†ν•˜μ—¬ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
import React from 'react'; class ClassComponent extends React.Component { render() { return ( <div> <h1>Hello, Class Component!</h1> <p>This is a simple class component.</p> </div> ); } } export default ClassComponent;
JavaScript
볡사
클래슀 μ»΄ν¬λ„ŒνŠΈλŠ” React.Component λ₯Ό μƒμ†ν•˜μ—¬ κ΅¬ν˜„ν•˜κΈ° λ•Œλ¬Έμ—, React.Component κ°€ κ°€μ§€κ³  μžˆλŠ” μ»΄ν¬λ„ŒνŠΈ 생λͺ…μ£ΌκΈ°(라이프사이클) λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
import React, { Component } from 'react'; class LifecycleExample extends Component { // 이 λ©”μ†Œλ“œλŠ” μ»΄ν¬λ„ŒνŠΈκ°€ DOM에 μΆ”κ°€λœ 후에 μžλ™μœΌλ‘œ ν˜ΈμΆœλ©λ‹ˆλ‹€. componentDidMount() { console.log('μ»΄ν¬λ„ŒνŠΈκ°€ λ§ˆμš΄νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.'); } // 이 λ©”μ†Œλ“œλŠ” μ»΄ν¬λ„ŒνŠΈκ°€ DOMμ—μ„œ 제거되기 전에 μžλ™μœΌλ‘œ ν˜ΈμΆœλ©λ‹ˆλ‹€. componentWillUnmount() { console.log('μ»΄ν¬λ„ŒνŠΈκ°€ μ–Έλ§ˆμš΄νŠΈλ  μ˜ˆμ •μž…λ‹ˆλ‹€.'); } // render λ©”μ†Œλ“œλŠ” λͺ¨λ“  React μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•„μˆ˜μ μœΌλ‘œ μ‘΄μž¬ν•΄μ•Ό ν•©λ‹ˆλ‹€. render() { return <div>μ»΄ν¬λ„ŒνŠΈ 라이프사이클 예제</div>; } }
JavaScript
볡사
μœ„μ˜ ν΄λž˜μŠ€λŠ” LifecycleExampleμ΄λΌλŠ” React μ»΄ν¬λ„ŒνŠΈλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. React λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” Component 클래슀λ₯Ό ν™•μž₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
componentDidMount λ©”μ†Œλ“œλŠ” μ»΄ν¬λ„ŒνŠΈκ°€ DOM에 μΆ”κ°€λœ ν›„ μžλ™μœΌλ‘œ 호좜되며, 주둜 데이터λ₯Ό κ°€μ Έμ˜€λŠ” λ“± μ»΄ν¬λ„ŒνŠΈκ°€ DOM에 μΆ”κ°€λœ 후에 μˆ˜ν–‰ν•΄μ•Ό ν•  μž‘μ—…μ— μ‚¬μš©λ©λ‹ˆλ‹€.
componentWillUnmount λ©”μ†Œλ“œλŠ” μ»΄ν¬λ„ŒνŠΈκ°€ DOMμ—μ„œ 제거되기 전에 μžλ™μœΌλ‘œ 호좜되며, λ¦¬μ†ŒμŠ€ μ •λ¦¬λ‚˜ λ„€νŠΈμ›Œν¬ μš”μ²­ λ“± μ–Έλ§ˆμš΄νŠΈλ˜κΈ° 전에 μ²˜λ¦¬ν•΄μ•Ό ν•  μž‘μ—…μ— μ‚¬μš©λ©λ‹ˆλ‹€.
render λ©”μ†Œλ“œλŠ” λͺ¨λ“  React μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•„μˆ˜μ μœΌλ‘œ μ‘΄μž¬ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 λ©”μ†Œλ“œμ—μ„œλŠ” μ»΄ν¬λ„ŒνŠΈμ˜ UI ꡬ쑰λ₯Ό μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
μ°Έκ³ : ν˜„λŒ€μ μΈ React κ°œλ°œμ—μ„œλŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ Hooksκ°€ 점차 더 많이 μ‚¬μš©λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ vs 클래슀 μ»΄ν¬λ„ŒνŠΈ

React 16.8 Hooks 의 λ„μž…μœΌλ‘œ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ„ μƒνƒœκ΄€λ¦¬ 및 라이프사이클 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 있게 됨으둜써, μ΅œμ‹  React μ—μ„œλŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ+Hooks κ°€ νŠΈλžœλ“œκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
클래슀 μ»΄ν¬λ„ŒνŠΈλŠ” React.Component λ₯Ό μƒμ†ν•˜μ—¬ κ΅¬ν˜„ν•˜κΈ° λ•Œλ¬Έμ—, React.Component κ°€ κ°€μ§€κ³  μžˆλŠ” μ»΄ν¬λ„ŒνŠΈ 생λͺ…μ£ΌκΈ°(라이프사이클) λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ»΄ν¬λ„ŒνŠΈμ˜ state(μƒνƒœ)λ₯Ό 관리 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ΄ˆκΈ°μ—λŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” μƒνƒœκ΄€λ¦¬, 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
ν•˜μ§€λ§Œ, React 16.8 버전뢀터 Hooks λΌλŠ” κ°œλ…μ΄ λ„μž…λ˜λ©΄μ„œ, ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ„ μƒνƒœ 관리와 라이프사이클 κΈ°λŠ₯을 μ‚¬μš©ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ„ μƒνƒœλ₯Ό μ‚¬μš©ν•˜κ³ , λΆ€μˆ˜ 효과λ₯Ό μ²˜λ¦¬ν•  수 있게 λ˜μ–΄ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ μ‚¬μš©μ„±κ³Ό μž¬μ‚¬μš©μ„±μ΄ ν–₯μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€. HooksλŠ” ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ œκ³΅λ˜λŠ” κΈ°λŠ₯을 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ„ μ‚¬μš©ν•  수 있게 ν•΄μ£ΌλŠ” 것이 μ£Όμš” λͺ©μ  쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.
ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” κ°„κ²°ν•˜κ³  가독성이 μ’‹μœΌλ©°, Hooks의 λ„μž…μœΌλ‘œ κΈ°λŠ₯적으둜 ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ μœ μ‚¬ν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΅œμ‹ μ˜ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ Hooksλ₯Ό 주둜 μ‚¬μš©ν•˜λŠ” μΆ”μ„Έμž…λ‹ˆλ‹€.

μ»΄ν¬λ„ŒνŠΈ κ΅¬μ„±μš”μ†Œ

β€’
State (μƒνƒœ)
β€’
Props (속성)
β€’
Render Method (λ Œλ” λ©”μ„œλ“œ)
β€’
Lifecycle Methods (생λͺ…μ£ΌκΈ° λ©”μ„œλ“œ)
β€’
Event Handling (이벀트 처리)

State (μƒνƒœ)

μ»΄ν¬λ„ŒνŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” 둜컬(λ‚΄λΆ€) 데이터
React μ»΄ν¬λ„ŒνŠΈμ˜ μƒνƒœ(State)λŠ” μ»΄ν¬λ„ŒνŠΈκ°€ κ΄€λ¦¬ν•˜λŠ” 둜컬 λ°μ΄ν„°μž…λ‹ˆλ‹€. μƒνƒœλ₯Ό μ‚¬μš©ν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈκ°€ 동적인 데이터λ₯Ό μ €μž₯ν•˜κ³  ν‘œμ‹œν•  수 있으며, μƒνƒœκ°€ 변경될 λ•Œλ§ˆλ‹€ ReactλŠ” μžλ™μœΌλ‘œ 화면을 λ‹€μ‹œ λ Œλ”λ§ν•©λ‹ˆλ‹€.

State 의 νŠΉμ§•

1.
μƒνƒœ μ΄ˆκΈ°ν™” : μ»΄ν¬λ„ŒνŠΈκ°€ 생성될 λ•Œ useState ν›…μ΄λ‚˜ 클래슀 μ»΄ν¬λ„ŒνŠΈμ˜ constructor λ©”μ„œλ“œμ—μ„œ 초기 μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
2.
μƒνƒœ μ—…λ°μ΄νŠΈ : setCountλ‚˜ this.setStateλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€. μ΄λ•Œ 이전 μƒνƒœλ₯Ό μ°Έμ‘°ν•˜μ—¬ 변경을 μ§„ν–‰ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.
3.
μ»΄ν¬λ„ŒνŠΈλ³„λ‘œ κ³ μœ ν•œ μƒνƒœ : 각각의 μΈμŠ€ν„΄μŠ€λŠ” 자체 μƒνƒœλ₯Ό μœ μ§€ν•˜λ―€λ‘œ, λ™μΌν•œ μ»΄ν¬λ„ŒνŠΈμ˜ μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€ κ°„μ—λŠ” 각각 독립적인 μƒνƒœκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.

μ‹€μŠ΅ μ½”λ“œ

1.
λ¦¬μ•‘νŠΈ ν”„λ‘œμ νŠΈ 생성
2.
Component/ClassComponent.jsx
3.
Component/FunctionComponent.jsx
4.
App.js
5.
μ„œλ²„ μ‹€ν–‰

λ¦¬μ•‘νŠΈ ν”„λ‘œμ νŠΈ 생성

npx create-react-app state-app
Shell
볡사

Component/ClassComponent.jsx

import React from 'react' class ClassComponent extends React.Component { constructor(props) { super(props); // μƒνƒœ μ •μ˜ this.state = { name: "Aloha", }; // this 바인딩 this.handleClickAloha = this.handleClickAloha.bind(this); this.handleClickJoeun = this.handleClickJoeun.bind(this); } handleClickAloha() { console.log('Aloha Click!'); // μƒνƒœ μ„€μ • this.setState({ name: 'Aloha' }); } handleClickJoeun() { console.log('Joeun Click!'); // μƒνƒœ μ„€μ • this.setState({ name : 'Joeun' }); } render() { const { name } = this.state; return ( <div> <h1>클래슀 μ»΄ν¬λ„ŒνŠΈ</h1> <h2>Hello I'm {name}</h2> <button onClick={this.handleClickAloha}>Aloha</button> <button onClick={this.handleClickJoeun}>Joeun</button> </div> ) } } export default ClassComponent
JavaScript
볡사
클래슀 μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ”, μƒμ„±μžμ—μ„œ this.state = {}; ν˜•νƒœλ‘œ μƒνƒœ(state) λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. this.setState(); λ§€μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μƒνƒœ(state)λ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

Component/FunctionComponent.jsx

import React, { useState } from 'react'; const FunctionComponent = () => { // useStateλ₯Ό μ‚¬μš©ν•˜μ—¬ nameμ΄λΌλŠ” μƒνƒœμ™€ 이λ₯Ό κ°±μ‹ ν•  수 μžˆλŠ” setName ν•¨μˆ˜λ₯Ό μ„ μ–Έ const [name, setName] = useState('Aloha'); // handleClick ν•¨μˆ˜ μ •μ˜ const handleClick = (newName) => { console.log(`${newName} Click!`); // setName ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ name μƒνƒœλ₯Ό κ°±μ‹  setName(newName); }; return ( <div> <h1>ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ</h1> <h2>Hello I'm {name}</h2> {/* λ²„νŠΌ 클릭 μ‹œ handleClick ν•¨μˆ˜ 호좜 */} <button onClick={() => handleClick('Aloha')}>Aloha</button> <button onClick={() => handleClick('Joeun')}>Joeun</button> </div> ); }; export default FunctionComponent;
JavaScript
볡사
ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ”, this.setStateκ°€ μ•„λ‹Œ useState 훅을 μ΄μš©ν•˜μ—¬ μƒνƒœλ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€. useState 훅은 배열을 λ°˜ν™˜ν•˜λŠ”λ°, 첫 번째 μš”μ†ŒλŠ” ν˜„μž¬ μƒνƒœκ°’μ΄κ³ , 두 번째 μš”μ†ŒλŠ” μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
const [name, setName] = useState('Aloha');
JavaScript
볡사
1.
useState('Aloha') ν•¨μˆ˜κ°€ 배열을 λ°˜ν™˜
a.
[0] β€˜Aloha’ (μ΄ˆκΈ°κ°’)
b.
[1] μƒνƒœκ°’μ„ μ—…λ°μ΄νŠΈν•˜λŠ” ν•¨μˆ˜
2.
name = β€˜Aloha’
3.
setName = (μ—…λ°μ΄νŠΈ ν•¨μˆ˜)

"μ„Έν„° ν•¨μˆ˜(setter function)”

β€’
ex) name - setName
일반적으둜 Reactμ—μ„œλŠ” μƒνƒœ λ³€μˆ˜μ™€ ν•΄λ‹Ή μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ, μƒνƒœ λ³€μˆ˜μ˜ μ΄λ¦„μ—λŠ” ν•΄λ‹Ή μƒνƒœμ˜ 값이, 그리고 μ—…λ°μ΄νŠΈ ν•¨μˆ˜μ˜ μ΄λ¦„μ—λŠ” 'set'을 μ ‘λ‘μ–΄λ‘œ 두고 κ·Έ 뒀에 μƒνƒœ λ³€μˆ˜μ˜ 이름을 CamelCase둜 μž‘μ„±ν•˜λŠ” 것이 κ΄€λ‘€μž…λ‹ˆλ‹€.

App.js

import logo from './logo.svg'; import './App.css'; import ClassComponent from './component/ClassComponent'; import FunctionComponent from './component/FunctionComponent'; function App() { return ( <> <ClassComponent /> <hr></hr> <FunctionComponent /> </> ); } export default App;
JavaScript
볡사

μ„œλ²„ μ‹€ν–‰

npm start
Shell
볡사

μ‹€ν–‰ κ²°κ³Ό - Aloha 클릭 μ‹œ

μ‹€ν–‰ κ²°κ³Ό - Joeun 클릭 μ‹œ

Props (속성)

λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μžμ‹ μ»΄ν¬λ„ŒνŠΈλ‘œ μ „λ‹¬ν•˜κΈ° μœ„ν•œ 데이터 properties 의 μ€„μž„λ§
μ™ΈλΆ€μ—μ„œ μ „λ‹¬λ˜λŠ” λ§€κ°œλ³€μˆ˜. λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μžμ‹ μ»΄ν¬λ„ŒνŠΈλ‘œ 데이터λ₯Ό 전달할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
이것이 React μ»΄ν¬λ„ŒνŠΈ 간에 정보λ₯Ό μ£Όκ³ λ°›λŠ” μ£Όμš” λ©”μ»€λ‹ˆμ¦˜ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈλŠ” μžμ‹ μ»΄ν¬λ„ŒνŠΈμ—κ²Œ propsλ₯Ό 톡해 데이터λ₯Ό μ „λ‹¬ν•˜κ³ , μžμ‹ μ»΄ν¬λ„ŒνŠΈλŠ” 이λ₯Ό ν™œμš©ν•˜μ—¬ 화면에 정보λ₯Ό ν‘œμ‹œν•˜κ±°λ‚˜ νŠΉμ • λ™μž‘μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
Reactμ—μ„œλŠ” propsλ₯Ό ν†΅ν•œ 단방ν–₯ 데이터 전달이 μ£Όμš”ν•œ νŒ¨ν„΄μž…λ‹ˆλ‹€.
단, μƒνƒœ 관리 라이브러리인 Redux, Context API 등을 μ‚¬μš©ν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈ κ°„μ˜ 데이터 흐름을 쑰금 더 μœ μ—°ν•˜κ²Œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹€μŠ΅ μ½”λ“œ

1.
λ¦¬μ•‘νŠΈ ν”„λ‘œμ νŠΈ 생성
2.
App.css
3.
Component/Card.jsx
4.
Component/CardList.jsx
5.
App.js
6.
μ„œλ²„ μ‹€ν–‰

λ¦¬μ•‘νŠΈ ν”„λ‘œμ νŠΈ 생성

npx create-react-app props-app
Shell
볡사

App.css

.card { border: 1px solid #ccc; padding: 10px; margin: 10px; }
CSS
볡사
일반적으둜 App.cssλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ— 걸쳐 μ μš©λ˜λŠ” μŠ€νƒ€μΌμ„ κ΄€λ¦¬ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. index.cssλŠ” 주둜 μ „μ—­ μŠ€νƒ€μΌ μ„€μ •μ΄λ‚˜ μ΄ˆκΈ°ν™” μŠ€νƒ€μΌμ— μ‚¬μš©λ©λ‹ˆλ‹€. 각각의 μ»΄ν¬λ„ŒνŠΈμ— ν•΄λ‹Ήν•˜λŠ” μŠ€νƒ€μΌμ„ λͺ¨λ“ˆν™”ν•˜κ³  App.css에 importν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 방식도 ν”νžˆ μ‚¬μš©λ©λ‹ˆλ‹€.
μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈμ— κ³΅ν†΅μœΌλ‘œ μ μš©λ˜λŠ” μŠ€νƒ€μΌμ€ App.css에 λͺ¨μ•„두고, 각 μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•„μš”ν•œ κ²½μš°μ—λŠ” ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ˜ 파일 μ•ˆμ—μ„œ λͺ¨λ“ˆν™”λœ μŠ€νƒ€μΌμ„ μ •μ˜ν•˜λŠ” 것이 일반적인 κ΄€λ‘€μž…λ‹ˆλ‹€.

Component/Card.jsx

import React from 'react'; const Card = (props) => { return ( <div className='card'> <h3>{props.title}</h3> <p>{props.content}</p> </div> ); }; export default Card;
JavaScript
볡사

Component/CardList.jsx

import React from 'react'; import Card from './Card'; const CardList = () => { // Card μ»΄ν¬λ„ŒνŠΈμ— 전달할 데이터 λ°°μ—΄ const cardData = [ { no: 1, title: 'Card 1', content: 'Content for Card 1' }, { no: 2, title: 'Card 2', content: 'Content for Card 2' }, { no: 3, title: 'Card 3', content: 'Content for Card 3' }, ]; return ( <div> <h1>Card List</h1> {/* <Card key={0} title={cardData[0].title} content={cardData[0].content} ></Card> */} {/* <Card key={1} title={cardData[1].title} content={cardData[1].content} ></Card> */} {/* <Card key={2} title={cardData[2].title} content={cardData[2].content} ></Card> */} {cardData.map((card, index) => { return <Card key={card.no} title={card.title} content={card.content} /> })} </div> ); }; export default CardList;
JavaScript
볡사

App.js

import './App.css'; import CardList from './Component/CardList'; function App() { return ( <> <h1>Props μ‹€μŠ΅</h1> <CardList /> </> ); } export default App;
JavaScript
볡사

μ„œλ²„ μ‹€ν–‰

npm start
Shell
볡사

μ‹€ν–‰ κ²°κ³Ό

Render Method (λ Œλ” λ©”μ„œλ“œ)

μ»΄ν¬λ„ŒνŠΈκ°€ 화면에 μ–΄λ–»κ²Œ ν‘œμ‹œλ μ§€λ₯Ό μ •μ˜ν•˜λŠ” λ©”μ„œλ“œ
render λ©”μ„œλ“œλŠ” React 클래슀 μ»΄ν¬λ„ŒνŠΈμ—μ„œ κ°€μž₯ μ€‘μš”ν•œ λ©”μ„œλ“œ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. 이 λ©”μ„œλ“œλŠ” μ»΄ν¬λ„ŒνŠΈμ˜ UIλ₯Ό μ •μ˜ν•˜κ³  λ°˜ν™˜ν•©λ‹ˆλ‹€. render λ©”μ„œλ“œλŠ” 클래슀 μ»΄ν¬λ„ŒνŠΈκ°€ 화면에 ν‘œμ‹œλ  λ•Œλ§ˆλ‹€ μžλ™μœΌλ‘œ 호좜되며, React 엔진은 이λ₯Ό 톡해 λ°˜ν™˜λœ UIλ₯Ό μ‹€μ œ DOM에 λ Œλ”λ§ν•©λ‹ˆλ‹€.

기본ꡬ쑰

import React, { Component } from 'react'; class MyComponent extends Component { render() { // UIλ₯Ό λ°˜ν™˜ν•˜λŠ” λΆ€λΆ„ return ( <div> <h1>Hello, World!</h1> </div> ); } } export default MyComponent;
JavaScript
볡사

ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ λ Œλ” λ©”μ„œλ“œ

ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” render() λ©”μ„œλ“œμ—†μ΄, return 으둜 λ Œλ”λ§μ„ λŒ€μ‹ ν•©λ‹ˆλ‹€.
ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” 클래슀 μ»΄ν¬λ„ŒνŠΈμ²˜λŸΌ λͺ…μ‹œμ μΈ render λ©”μ„œλ“œκ°€ μ—†μŠ΅λ‹ˆλ‹€. λŒ€μ‹ , ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ μžμ²΄κ°€ λ Œλ”λ§μ„ λ‹΄λ‹Ήν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ UIλ₯Ό μ •μ˜ν•˜λ €λ©΄ λ‹¨μˆœνžˆ ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ JSXλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
import React from 'react'; const MyComponent = () => { // UIλ₯Ό λ°˜ν™˜ν•˜λŠ” λΆ€λΆ„ return ( <div> <h1>Hello, World!</h1> </div> ); }; export default MyComponent;
JavaScript
볡사

Event Handling (이벀트 처리)

μ‚¬μš©μžμ˜ μƒν˜Έμž‘μš©μ— λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ λ°œμƒν•˜λŠ” 이벀트λ₯Ό μ²˜λ¦¬ν•˜λŠ” κΈ°λŠ₯

μ‹€μŠ΅ μ½”λ“œ

1.
λ¦¬μ•‘νŠΈ ν”„λ‘œμ νŠΈ 생성
2.
Component/Product.jsx
3.
App.js
4.
μ„œλ²„ μ‹€ν–‰

λ¦¬μ•‘νŠΈ ν”„λ‘œμ νŠΈ 생성

npx create-react-app event-app
Shell
볡사

Component/Product.jsx

import React, { useState } from 'react' const Product = () => { // μƒνƒœ const [quantity, setQuantity] = useState(1); const price = 1000; // μƒν’ˆ 단가 // μˆ˜λŸ‰ 증가 ν•¨μˆ˜ const increaseQuantity = () => { setQuantity(quantity + 1); }; // μˆ˜λŸ‰ κ°μ†Œ ν•¨μˆ˜ const decreaseQuantity = () => { if( quantity > 1 ) { setQuantity(quantity - 1); } }; // 총 가격 계산 const totalPrice = price * quantity; return ( <div> <h2>μƒν’ˆ 정보</h2> <ul> <li>가격 : {price}</li> <li>μˆ˜λŸ‰ : {quantity}</li> <li>총 가격 : {totalPrice}</li> </ul> <button onClick={increaseQuantity}>+</button> <button onClick={decreaseQuantity}>-</button> </div> ) } export default Product
JavaScript
볡사

App.js

import logo from './logo.svg'; import './App.css'; import ClassComponent from './component/ClassComponent'; import FunctionComponent from './component/FunctionComponent'; function App() { return ( <> <Product /> </> ); } export default App;
JavaScript
볡사

μ„œλ²„ μ‹€ν–‰

npm start
Shell
볡사