리μ‘νΈμ νμ μ€ν¬λ¦½νΈλ₯Ό νμ©ν μμ μ μΈ μ»΄ν¬λνΈ κ°λ°
리μ‘νΈμ νμ μ€ν¬λ¦½νΈμ μ‘°ν©μ μ΅κ·Ό νλ‘ νΈμλ κ°λ°μμ κ°μ₯ μΈκΈ° μλ μ νμ§ μ€ νλλ‘ μ리μ‘μμ΅λλ€. νμ μ€ν¬λ¦½νΈλ μ μ νμ 체νΉκ³Ό κ°λ ₯ν μΈν°νμ΄μ€ κΈ°λ₯μ μ 곡νμ¬, μ»΄ν¬λνΈ κ°λ° κ³Όμ μμ λ°μν μ μλ λ²κ·Έλ₯Ό μ¬μ μ μλ°©νκ³ , μ½λμ μμ μ±κ³Ό κ°λ μ±μ λμ¬μ€λλ€.
λ³Έ ν¬μ€ν μμλ νμ μ€ν¬λ¦½νΈλ₯Ό νμ©νμ¬ λ¦¬μ‘νΈ μ»΄ν¬λνΈλ₯Ό κ°λ°ν λμ μ΄μ , μ€μ μ¬λ‘μ μ½λ μν, κ·Έλ¦¬κ³ μμ μ μΈ μ»΄ν¬λνΈ μ€κ³λ₯Ό μν λͺ¨λ² μ¬λ‘λ₯Ό ꡬ체μ μΌλ‘ μκ°νκ³ μ ν©λλ€.
νμ μ€ν¬λ¦½νΈλ₯Ό λμ ν΄μΌ νλ μ΄μ
리μ‘νΈλ μ»΄ν¬λνΈ κΈ°λ°μ UI λΌμ΄λΈλ¬λ¦¬λ‘μ μ¬μ¬μ©μ±κ³Ό νμ₯μ±μ΄ λ°μ΄λ ꡬ쑰λ₯Ό μ 곡νμ§λ§, μλ°μ€ν¬λ¦½νΈμ λμ νμ΄ν νΉμ±μΌλ‘ μΈν΄ λ°νμ μμ μμ νμ κ΄λ ¨ μλ¬κ° λ°μν κ°λ₯μ±μ΄ μμ΅λλ€. νμ μ€ν¬λ¦½νΈλ₯Ό λμ νλ©΄ λ€μκ³Ό κ°μ μ₯μ μ μ»μ μ μμ΅λλ€.
- μ μ νμ 체νΉ: μ»΄νμΌ λ¨κ³μμ νμ μ€λ₯λ₯Ό λ°κ²¬ν μ μμ΄, λ°νμ μ€λ₯λ₯Ό μλ°©νκ³ λλ²κΉ μκ°μ λ¨μΆν μ μμ΅λλ€.
- μ½λ μλ μμ±κ³Ό λ¬Έμν: νμ μ μλ₯Ό ν΅ν΄ IDEμμ μ½λ μλ μμ± κΈ°λ₯μ κ°ννκ³ , μ½λ μμ²΄κ° λ¬Έμμ μν μ νκ² λμ΄ νμ μ κ°λ μ±μ λμ λλ€.
- μΈν°νμ΄μ€μ μ λ€λ¦: 볡μ‘ν λ°μ΄ν° ꡬ쑰μ μ»΄ν¬λνΈμ props, μν λ±μ λͺ ννκ² μ μν μ μμ΄, μ½λ ꡬ쑰λ₯Ό λ³΄λ€ κ²¬κ³ νκ² λ§λλλ€.
- μ μ§λ³΄μμ± ν₯μ: νμ μ μ λλΆμ ν λ΄μμ μμ±λ μ½λλ₯Ό μ΄ν΄νκ³ μ μ§λ³΄μνκΈ° μ¬μμ§λλ€.
리μ‘νΈ μ»΄ν¬λνΈμ νμ μ€ν¬λ¦½νΈ μ μ©νκΈ°
νμ μ€ν¬λ¦½νΈλ₯Ό 리μ‘νΈ νλ‘μ νΈμ λμ νλ λ°©λ²μ μ¬λ¬ κ°μ§κ° μμ΅λλ€. Create React Appμ μ¬μ©ν κ²½μ°, κΈ°λ³Έ ν νλ¦Ώμμ νμ μ€ν¬λ¦½νΈλ₯Ό μ§μνλ μ΅μ μ μ ννκ±°λ, κΈ°μ‘΄ νλ‘μ νΈμ νμ μ€ν¬λ¦½νΈλ₯Ό μΆκ°ν μ μμ΅λλ€. μ¬κΈ°μλ κ°λ¨ν μμ μ ν¨κ» 리μ‘νΈ μ»΄ν¬λνΈμ νμ μ€ν¬λ¦½νΈλ₯Ό μ μ©νλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
κ°λ¨ν μΉ΄μ΄ν° μ»΄ν¬λνΈ μμ
μλ μ½λλ νμ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ μμ±ν κ°λ¨ν μΉ΄μ΄ν° μ»΄ν¬λνΈμ λλ€. μ»΄ν¬λνΈμ propsμ μνμ λν΄ λͺ ννκ² νμ μ μ§μ νμ¬, μ½λμ μμ μ±κ³Ό κ°λ μ±μ λμμ΅λλ€.
// Counter.tsx
import React, { useState } from 'react';
// μ»΄ν¬λνΈμ props νμ
μ μ
interface CounterProps {
initialCount?: number;
}
const Counter: React.FC<CounterProps> = ({ initialCount = 0 }) => {
// μνμ νμ
μ μλμΌλ‘ numberλ‘ μΆλ‘ λ©λλ€.
const [count, setCount] = useState<number>(initialCount);
const increment = (): void => setCount(prevCount => prevCount + 1);
const decrement = (): void => setCount(prevCount => prevCount - 1);
return (
<div style={{ textAlign: 'center', margin: '20px' }}>
<h2>νμ¬ μΉ΄μ΄νΈ: {count}</h2>
<button onClick={decrement} style={{ marginRight: '10px' }}>κ°μ</button>
<button onClick={increment}>μ¦κ°</button>
</div>
);
};
export default Counter;
μ΄ μμ μμλ CounterProps μΈν°νμ΄μ€λ₯Ό μ μνμ¬ μ»΄ν¬λνΈμ propsλ₯Ό λͺ μμ μΌλ‘ μ§μ νμμ΅λλ€. μ΄κΈ° μΉ΄μ΄νΈ κ°μ μ νμ μμ±μΌλ‘ μ²λ¦¬λλ©°, κΈ°λ³Έκ°μ μ€μ νμ¬ μμ μ μΈ λμμ 보μ₯ν©λλ€. λν, μν κ΄λ¦¬ μ νμ μ€ν¬λ¦½νΈμ μ λ€λ¦μ νμ©ν΄ μν λ³μμ νμ μ numberλ‘ μ§μ νμμ΅λλ€.
볡μ‘ν μΈν°νμ΄μ€μ μ»΄ν¬λνΈ μ€κ³
μ€μ μ ν리μΌμ΄μ μμλ λ€μν λ°μ΄ν° ꡬ쑰μ 볡μ‘ν μΈν°λμ μ΄ νμν μ μμ΅λλ€. μ΄λ΄ λλ μΈν°νμ΄μ€μ μ λ€λ¦μ μ κ·Ή νμ©νμ¬ μ»΄ν¬λνΈμ μμ μ±μ λμΌ μ μμ΅λλ€. μλ μμ λ μ¬μ©μ λͺ©λ‘μ λ λλ§νλ μ»΄ν¬λνΈλ₯Ό νμ μ€ν¬λ¦½νΈλ‘ ꡬνν μ¬λ‘μ λλ€.
// UserList.tsx
import React from 'react';
// μ¬μ©μ λ°μ΄ν° νμ
μ μ
interface User {
id: number;
name: string;
email: string;
}
// μ»΄ν¬λνΈμ props νμ
μ μ
interface UserListProps {
users: User[];
onUserClick: (user: User) => void;
}
const UserList: React.FC<UserListProps> = ({ users, onUserClick }) => {
return (
<ul>
{users.map((user) => (
<li key={user.id} style={{ margin: '10px 0', cursor: 'pointer' }} onClick={() => onUserClick(user)}>
<strong>{user.name}</strong> - {user.email}
</li>
))}
</ul>
);
};
export default UserList;
μ μμ λ μ¬μ©μ λ°μ΄ν°λ₯Ό λ΄μ λ°°μ΄μ propsλ‘ μ λ¬λ°μ, κ° μ¬μ©μλ₯Ό 리μ€νΈ ννλ‘ μΆλ ₯ν©λλ€. onUserClick ν¨μμ νμ λ λͺ μνμ¬, μ¬μ©μκ° ν΄λ¦ν λ μ νν νμ μ λ°μ΄ν°κ° μ λ¬λλλ‘ ν©λλ€. μ΄λ κ² νλ©΄ νμ κ°μ νμ μ λ°μ΄ν° ꡬ쑰μ λν νΌλμ μ€μ΄κ³ , μ»΄ν¬λνΈ κ° μΈν°νμ΄μ€λ₯Ό λͺ ννκ² ν μ μμ΅λλ€.
컀μ€ν ν κ³Ό νμ μ€ν¬λ¦½νΈμ κ²°ν©
νμ μ€ν¬λ¦½νΈλ 컀μ€ν ν μ μμ±ν λλ ν° λμμ΄ λ©λλ€. 컀μ€ν ν μ μμ±νλ©΄ μ¬μ¬μ© κ°λ₯ν λ‘μ§μ μμ½κ² λΆλ¦¬ν μ μλλ°, μ΄λ λ°ν κ°μ νμ μ λͺ ννκ² μ§μ νλ©΄ ν μ μ¬μ©νλ μ»΄ν¬λνΈμμλ μμ μ μΈ νμ 체ν¬κ° κ°λ₯ν©λλ€.
μλλ μλμ° ν¬κΈ°λ₯Ό μΆμ νλ 컀μ€ν ν μ νμ μ€ν¬λ¦½νΈλ‘ μμ±ν μμ μ λλ€.
// useWindowSize.ts
import { useState, useEffect } from 'react';
// μλμ° ν¬κΈ°λ₯Ό λνλ΄λ νμ
μ μ
interface WindowSize {
width: number;
height: number;
}
const useWindowSize = (): WindowSize => {
const [windowSize, setWindowSize] = useState<WindowSize>({
width: window.innerWidth,
height: window.innerHeight,
});
useEffect(() => {
const handleResize = (): void => {
setWindowSize({
width: window.innerWidth,
height: window.innerHeight,
});
};
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return windowSize;
};
export default useWindowSize;
μ΄ μ»€μ€ν ν μ WindowSize μΈν°νμ΄μ€λ₯Ό νμ©νμ¬ λ°ν κ°μ νμ μ μ§μ ν©λλ€. μ΄λ₯Ό ν΅ν΄ ν μ μ¬μ©νλ μ»΄ν¬λνΈμμ μλ μμ± λ° νμ μ€λ₯λ₯Ό μ½κ² νμΈν μ μμΌλ©°, μ½λμ μμ μ±μ λμ¬μ€λλ€.
νμ μ€ν¬λ¦½νΈ κΈ°λ°μ μμ μ μΈ μ»΄ν¬λνΈ κ°λ° μ λ΅
νμ μ€ν¬λ¦½νΈλ₯Ό νμ©νμ¬ λ¦¬μ‘νΈ μ»΄ν¬λνΈλ₯Ό κ°λ°ν λ κ³ λ €ν΄μΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€.
- λͺ
μμ νμ
μ§μ
κ°λ₯νλ©΄ λͺ¨λ props, μν, ν¨μμ λ°ν κ°μ λν΄ λͺ μμ μΌλ‘ νμ μ μ§μ ν©λλ€. μ΄λ₯Ό ν΅ν΄ μλμΉ μμ νμ μ€λ₯λ₯Ό μ¬μ μ μλ°©ν μ μμ΅λλ€. - μΈν°νμ΄μ€μ νμ
λ³μΉ νμ©
볡μ‘ν λ°μ΄ν° ꡬ쑰λ μΈν°νμ΄μ€λ νμ λ³μΉ(type alias)μ νμ©νμ¬ μ μΈν©λλ€. μ΄λ₯Ό ν΅ν΄ μ½λμ κ°λ μ±μ λμ΄κ³ , μ¬λ¬ μ»΄ν¬λνΈμμ μΌκ΄λ λ°μ΄ν° ꡬ쑰λ₯Ό μ μ§ν μ μμ΅λλ€. - μ λ€λ¦(Generic) νμ©
μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈλ ν μμλ μ λ€λ¦μ νμ©νμ¬ λ€μν λ°μ΄ν° νμ μ μ²λ¦¬ν μ μλλ‘ μ€κ³ν©λλ€. μλ₯Ό λ€μ΄, 리μ€νΈ μ»΄ν¬λνΈλ νΌ μ»΄ν¬λνΈμμλ μ λ€λ¦μ μ¬μ©νλ©΄ λμ± μ μ°ν μ½λ μμ±μ΄ κ°λ₯ν©λλ€. - νμ
μ€ν¬λ¦½νΈ μ»΄νμΌ μ΅μ
νμ©
tsconfig.json νμΌμμ strict μ΅μ λ±μ νμ±ννμ¬, λμ± μ격ν νμ 체ν¬λ₯Ό μννλλ‘ μ€μ ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ μ¬μ μΈ λ²κ·Έλ₯Ό μ‘°κΈ°μ λ°κ²¬ν μ μμ΅λλ€. - μλνλ ν
μ€νΈμ μ μ λΆμ λꡬ λμ
νμ μ€ν¬λ¦½νΈλ₯Ό νμ©νλ©΄ ESLint, Prettier, κ·Έλ¦¬κ³ Jestμ κ°μ λꡬλ₯Ό μ°λνμ¬ μ½λμ νμ§κ³Ό μμ μ±μ λμΌ μ μμ΅λλ€. μ μ λΆμ λꡬλ₯Ό ν΅ν΄ μ½λ κ·μΉμ κ°μ νλ©΄, νμ μ μΌκ΄λ μ½λ μ€νμΌμ μ μ§ν μ μμ΅λλ€.
κ²°λ‘
리μ‘νΈμ νμ μ€ν¬λ¦½νΈλ₯Ό κ²°ν©ν κ°λ° νκ²½μ μ½λμ μμ μ±κ³Ό μ μ§λ³΄μμ±μ ν¬κ² ν₯μμν΅λλ€. μ μ νμ 체νΉ, λͺ μμ μΈν°νμ΄μ€ μ μ, μ λ€λ¦ νμ© λ±μ ν΅ν΄ μ»΄ν¬λνΈμ λ²κ·Έλ₯Ό μ¬μ μ μλ°©νκ³ , ν λ΄ νμ μμ λ°μν μ μλ νΌλμ μ€μΌ μ μμ΅λλ€. μ€μ μ¬λ‘μ μ½λ μνμ ν΅ν΄ μ΄ν΄λ³Έ κ²μ²λΌ, νμ μ€ν¬λ¦½νΈλ₯Ό λμ ν 리μ‘νΈ μ»΄ν¬λνΈλ λμ± κ²¬κ³ νκ³ μμΈ‘ κ°λ₯ν λ°©μμΌλ‘ λμνλ©°, ν₯ν νμ₯μ± μλ νλ‘μ νΈ κ°λ°μ μμ΄ ν° κ²½μλ ₯μ μ 곡ν©λλ€.
μμΌλ‘ 리μ‘νΈ κΈ°λ° μ ν리μΌμ΄μ κ°λ° μ νμ μ€ν¬λ¦½νΈλ₯Ό μ κ·Ή νμ©νμ¬, μ½λμ μμ μ±κ³Ό μμ°μ±μ λμ΄κ³ , μ¬μ©μ κ²½νκ³Ό κ°λ°μ κ²½ν λͺ¨λμμ μ°μν κ²°κ³Όλ₯Ό λ§λ€μ΄λ΄μκΈΈ λ°λλλ€.
λκΈ