์์ ๋ง์ Hook ๋ง๋ค๊ธฐ
These docs are old and wonโt be updated. Go to react.dev for the new React docs.
These new documentation pages teach modern React and include live examples:
Hook์ React 16.8 ๋ฒ์ ์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค. Hook์ ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ง ์์๋ state์ ๊ฐ์ ํน์ง๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ๋ง์ Hook์ ๋ง๋ค๋ฉด ์ปดํฌ๋ํธ ๋ก์ง์ ํจ์๋ก ๋ฝ์๋ด์ด ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
Effect Hook ์ฌ์ฉํ๊ธฐ๋ฅผ ๋ฐฐ์ธ ๋, ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์น๊ตฌ๊ฐ ์จ๋ผ์ธ ์ํ์ธ์ง ์๋์ง์ ๋ํ ๋ฉ์์ง๋ฅผ ํ์ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์์ ๊ฒ์ ๋๋ค.
import React, { useState, useEffect } from 'react';
function FriendStatus(props) {
const [isOnline, setIsOnline] = useState(null); useEffect(() => { function handleStatusChange(status) { setIsOnline(status.isOnline); } ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange); return () => { ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange); }; });
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
์ด์ ์ฑํ
์ ํ๋ฆฌ์ผ์ด์
์ ์ฐ๋ฝ์ฒ ๋ชฉ๋ก์ด ์์ผ๋ฉฐ ๊ทธ์ค์์ ์จ๋ผ์ธ ์ํ์ธ ์ฌ์ฉ์๋ค์ ์ด๋ฆ์ ์ด๋ก์์ผ๋ก ํ์ํ๋ ์ํฉ์ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์์ ์ฝ๋์ ๋น์ทํ ๋ก์ง์ ๋ณต์ฌํ์ฌ FriendListItem
์ปดํฌ๋ํธ ์์ ๋ถ์ฌ๋ฃ์ ์๋ ์์ง๋ง, ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ ์๋ ์์ต๋๋ค.
import React, { useState, useEffect } from 'react';
function FriendListItem(props) {
const [isOnline, setIsOnline] = useState(null); useEffect(() => { function handleStatusChange(status) { setIsOnline(status.isOnline); } ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange); return () => { ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange); }; });
return (
<li style={{ color: isOnline ? 'green' : 'black' }}>
{props.friend.name}
</li>
);
}
๊ทธ ๋์ ์ด ๋ก์ง์ FriendStatus
์ FriendListItem
์์ ๊ณต์ ํ๋๋ก ํ๊ณ ์ถ์ต๋๋ค.
React์๋ ์ํ ๊ด๋ จ ๋ก์ง์ ์ปดํฌ๋ํธ์์ ๊ณต์ ํ๋ ๋ ๊ฐ์ง ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ด ์๋๋ฐ render props์ ๊ณ ์ฐจ ์ปดํฌ๋ํธ์ ๋๋ค. Hook์ ์ฌ์ฉํ์ฌ ํธ๋ฆฌ์ ์ปดํฌ๋ํธ๋ฅผ ๋ํ์ง ์๊ณ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฌ์ฉ์ ์ ์ Hook ์ถ์ถํ๊ธฐ
๋ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์์ ๊ฐ์ ๋ก์ง์ ๊ณต์ ํ๊ณ ์ ํ ๋๋ ๋ ๋ค๋ฅธ ํจ์๋ก ๋ถ๋ฆฌํฉ๋๋ค. ์ปดํฌ๋ํธ์ Hook ๋ํ ํจ์์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค!
์ฌ์ฉ์ ์ ์ Hook์ ์ด๋ฆ์ด use
๋ก ์์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์
๋๋ค. ์ฌ์ฉ์ Hook์ ๋ค๋ฅธ Hook์ ํธ์ถํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์๋ฉด, ์๋์ useFriendStatus
๊ฐ ์ฐ๋ฆฌ์ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์ ์ ์ Hook์
๋๋ค.
import { useState, useEffect } from 'react';
function useFriendStatus(friendID) { const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
};
});
return isOnline;
}
๋ฑํ ์๋ก์ด ๊ฒ์ ์์ต๋๋ค. ๋ก์ง์ ์์ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋ณต์ฌํด์์ต๋๋ค. ๋ค๋ง ์ปดํฌ๋ํธ์์์ฒ๋ผ ๋ค๋ฅธ Hook๋ค์ ์ฌ์ฉ์ Hook์ ์๋ก ๋์ฌ์ผ ํ๋ฉฐ ์ฌ์ฉ์ ์ ์ Hook์ ์กฐ๊ฑด๋ถ ํจ์๊ฐ ์๋์ด์ผ ํฉ๋๋ค.
React ์ปดํฌ๋ํธ์๋ ๋ค๋ฅด๊ฒ ์ฌ์ฉ์ ์ ์ Hook์ ํน์ ํ ์๊ทธ๋์ฒ๊ฐ ํ์ ์์ต๋๋ค. ๋ฌด์์ ์ธ์๋ก ๋ฐ์์ผ ํ๋ฉฐ ํ์ํ๋ค๋ฉด ๋ฌด์์ ๋ฐํํด์ผ ํ๋ ์ง๋ฅผ ์ฌ์ฉ์๊ฐ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง, ๋ณดํต์ ํจ์์ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ด๋ฆ์ ๋ฐ๋์ use
๋ก ์์ํด์ผ ํ๋๋ฐ ๊ทธ๋์ผ๋ง ํ๋์ ๋ณด์๋ Hook ๊ท์น์ด ์ ์ฉ๋๋์ง๋ฅผ ํ์
ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
useFriendStatus
Hook์ ๋ชฉํ๋ ์น๊ตฌ์ ์ํ๋ฅผ ๊ตฌ๋
ํ๊ธฐ ์ํจ์
๋๋ค. ์ด๋ฅผ ์ํ์ฌ friendID
๋ฅผ ์ธ์๋ก ๋ฐ๊ณ ์จ๋ผ์ธ ์ํ์ ์ฌ๋ถ๋ฅผ ๋ฐํํฉ๋๋ค.
function useFriendStatus(friendID) {
const [isOnline, setIsOnline] = useState(null);
// ...
return isOnline;
}
์ด์ ์ฌ์ฉ์ ์ ์ Hook์ ์ด๋ป๊ฒ ์ด์ฉํ๋์ง ๋ณด๊ฒ ์ต๋๋ค.
์ฌ์ฉ์ ์ ์ Hook ์ด์ฉํ๊ธฐ
์ฒ์ ์ฐ๋ฆฌ์ ๋ชฉํ๋ FriendStatus
์ FriendListItem
์ปดํฌ๋ํธ์ ์ค๋ณต๋์ด์๋ ๋ก์ง์ ์ ๊ฑฐํ๋ ๊ฒ์ด์์ต๋๋ค. ๋ ์ปดํฌ๋ํธ ๋ชจ๋ ์น๊ตฌ์ ์จ๋ผ์ธ ์ํ ์ฌ๋ถ๋ฅผ ์์์ผ ํ์ฃ .
์ด์ ์ด ๋ก์ง์ useFriendStatus
hook์ผ๋ก ๋ฝ์๋ด์์ผ๋, ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
function FriendStatus(props) {
const isOnline = useFriendStatus(props.friend.id);
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
function FriendListItem(props) {
const isOnline = useFriendStatus(props.friend.id);
return (
<li style={{ color: isOnline ? 'green' : 'black' }}>
{props.friend.name}
</li>
);
}
๋ณธ๋์ ์์์ ๋์ผํ ์ฝ๋์ธ๊ฐ์? ๋ค ์ ํํ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์์ธํ ๋ณด๋ฉด ์๋๋ฐฉ์์ ์ด๋ค ๋ณํ๋ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ฐ๋ ๊ฒ์ ์ค๋ก์ง ๊ณตํต์ ์ฝ๋๋ฅผ ๋ฝ์๋ด ์๋ก์ด ํจ์๋ก ๋ง๋ ๊ฒ๋ฟ์ ๋๋ค. ์ฌ์ฉ์ ์ ์ Hook์ React์ ํน๋ณํ ๊ธฐ๋ฅ์ด๋ผ๊ธฐ๋ณด๋ค ๊ธฐ๋ณธ์ ์ผ๋ก Hook์ ๋์์ธ์ ๋ฐ๋ฅด๋ ๊ด์ต์ ๋๋ค.
์ฌ์ฉ์ ์ ์ Hook์ ์ด๋ฆ์ โuse
โ๋ก ์์๋์ด์ผ ํ๋์? ๋ค ๊ทธ๋ ์ต๋๋ค. ์ด ๊ด์ต์ ์์ฃผ ์ค์ํฉ๋๋ค. ์ด๋ฅผ ๋ฐ๋ฅด์ง ์์ผ๋ฉด ํน์ ํ ํจ์๊ฐ ๊ทธ ์์์ Hook์ ํธ์ถํ๋์ง๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ์ Hook ๊ท์น์ ์๋ฐ ์ฌ๋ถ๋ฅผ ์๋์ผ๋ก ์ฒดํฌํ ์ ์์ต๋๋ค.
๊ฐ์ Hook์ ์ฌ์ฉํ๋ ๋ ๊ฐ์ ์ปดํฌ๋ํธ๋ state๋ฅผ ๊ณต์ ํ๋์? ์๋์. ์ฌ์ฉ์ ์ ์ Hook์ ์ํ ๊ด๋ จ ๋ก์ง(๊ตฌ๋ ์ ์ค์ ํ๊ณ ํ์ฌ ๋ณ์ซ๊ฐ์ ๊ธฐ์ตํ๋ ๊ฒ)์ ์ฌ์ฌ์ฉํ๋ ๋ฉ์ปค๋์ฆ์ด์ง๋ง ์ฌ์ฉ์ Hook์ ์ฌ์ฉํ ๋๋ง๋ค ๊ทธ ์์ state์ effect๋ ์์ ํ ๋ ๋ฆฝ์ ์ ๋๋ค.
์ฌ์ฉ์ ์ ์ Hook์ ์ด๋ป๊ฒ ๋
๋ฆฝ๋ state๋ฅผ ์ป๋ ๊ฑด๊ฐ์? ๊ฐ๊ฐ์ Hook์ ๋ํ ํธ์ถ์ ์๋ก ๋
๋ฆฝ๋ state๋ฅผ ๋ฐ์ต๋๋ค. useFriendStatus
๋ฅผ ์ง์ ์ ์ผ๋ก ํธ์ถํ๊ธฐ ๋๋ฌธ์ React์ ๊ด์ ์์ ์ด ์ปดํฌ๋ํธ๋ useState
์ useEffect
๋ฅผ ํธ์ถํ ๊ฒ๊ณผ ๋ค๋ฆ์์ต๋๋ค. ๋ํ ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ๋ฐฐ์ ๋ฏ์ด, ํ๋์ ์ปดํฌ๋ํธ ์์์ useState
์ useEffect
๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ถ๋ฅผ ์ ์๊ณ ์ด๋ค์ ๋ชจ๋ ์์ ํ ๋
๋ฆฝ์ ์
๋๋ค.
ํ: Hook์์ Hook์ผ๋ก ์ ๋ณด ์ ๋ฌํ๊ธฐ
Hook์ ํจ์์ด๊ธฐ ๋๋ฌธ์ Hook ์ฌ์ด์์๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
์ํฉ์ค๋ช ์ ์ํด ์ฑํ ์์์ ์๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ํ์ฌ ์ ํ๋ ์น๊ตฌ๊ฐ ์จ๋ผ์ธ ์ํ์ธ์ง๋ฅผ ํ์ํ๋ ์ฑํ ์์ ์ ์ ํ๊ธฐ์ ๋๋ค.
const friendList = [
{ id: 1, name: 'Phoebe' },
{ id: 2, name: 'Rachel' },
{ id: 3, name: 'Ross' },
];
function ChatRecipientPicker() {
const [recipientID, setRecipientID] = useState(1); const isRecipientOnline = useFriendStatus(recipientID);
return (
<>
<Circle color={isRecipientOnline ? 'green' : 'red'} /> <select
value={recipientID}
onChange={e => setRecipientID(Number(e.target.value))}
>
{friendList.map(friend => (
<option key={friend.id} value={friend.id}>
{friend.name}
</option>
))}
</select>
</>
);
}
ํ์ฌ ์ ํ๋ ์น๊ตฌ์ ID๋ฅผ recipientID
state ๋ณ์์ ์ ์ฅํ๊ณ ์ฌ์ฉ์๊ฐ <select>
์ ํ๊ธฐ์ ์๋ ๋ค๋ฅธ ์น๊ตฌ๋ฅผ ์ ํํ๋ฉด ์ด๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
useState
Hook ํธ์ถ์ recipientID
state ๋ณ์์ ์ต์ ๊ฐ์ ๋๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ useFriendStatus
Hook์ ์ธ์๋ก ๋ณด๋ผ ์ ์์ต๋๋ค.
const [recipientID, setRecipientID] = useState(1);
const isRecipientOnline = useFriendStatus(recipientID);
์ด๋ฅผ ํตํด ์ง๊ธ ์ ํ๋์ด์๋ ์น๊ตฌ์ ์จ๋ผ์ธ ์ํ ์ฌ๋ถ๋ฅผ ์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์น๊ตฌ๋ฅผ ์ ํํ๊ณ recipientID
state ๋ณ์๋ฅผ ์
๋ฐ์ดํธํ๋ฉด useFriendStatus
Hook์ ์ด๋ฏธ ์ ํ๋์ด์๋ ์น๊ตฌ์ ๊ตฌ๋
์ ํด์งํ๊ณ ์๋ก์ด ์ ํ๋ ์น๊ตฌ์ ์ํ๋ฅผ ๊ตฌ๋
ํ ๊ฒ์
๋๋ค.
useYourImagination()
์ฌ์ฉ์ ์ ์ Hook์ ์ด์ React ์ปดํฌ๋ํธ์์๋ ๋ถ๊ฐ๋ฅํ๋ ๋ก์ง๊ณต์ ์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉ์ ์ ์ Hook์ ๋ง๋ค์ด ํผ ๋ค๋ฃจ๊ธฐ, ์ ๋๋ฉ์ด์ , ์ ์ธํ ๊ตฌ๋ , ํ์ด๋จธ, ๊ทธ ์ธ์ ์๊ฐํ์ง ์์ ๋ถ๋ถ๊น์ง ํจ์ฌ ๋ค์ํ ์ฐ์์์ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ํ React์ ๋ด์ฅ๋ ๊ธฐ๋ฅ๋งํผ์ด๋ ์ฌ์ฉํ๊ธฐ ์ฌ์ด Hook์ ๋ง๋ค ์๋ ์์ต๋๋ค.
๋๋ฌด ์ด๋ฅธ ๋จ๊ณ์์ ๋ก์ง์ ๋ฝ์๋ด๋ ค๊ณ ํ์ง๋ ์๋ ๊ฒ ์ข์ต๋๋ค. ํจ์ ์ปดํฌ๋ํธ๊ฐ ํ ์ ์๋ ์ผ์ด ๋ ๋ค์ํด์ก๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ถ์ ์ฝ๋์ ์๋ ํจ์ ์ปดํฌ๋ํธ์ ๊ธธ์ด๋ ๊ธธ์ด์ก์ ๊ฒ์ ๋๋ค. ์ด๋ ์ง๊ทนํ ํ๋ฒํ ์ผ์ด๋ฉฐ ์ง๊ธ ๋ฐ๋ก Hook์ผ๋ก ๋ถ๋ฆฌํด์ผ๋ง ํ๋ค๊ณ ๋๋ ํ์๋ ์์ต๋๋ค. ํ์ง๋ง ๋์์ ์ฌ์ฉ์ ์ ์ Hook์ด ๋ณต์กํ ๋ก์ง์ ๋จ์ํ ์ธํฐํ์ด์ค ์์ ์จ๊ธธ ์ ์๋๋ก ํ๊ฑฐ๋ ๋ณต์กํ๊ฒ ๋ค์ํจ ์ปดํฌ๋ํธ๋ฅผ ํ์ด๋ด๋๋ก ๋๋ ๊ฒฝ์ฐ๋ค์ ์ฐพ์๋ด๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
์๋ฅผ ๋ค์๋ฉด, ๋ด๋ถ์ ๋ง์ state๋ฅผ ์ง๋๊ณ ์์ง๋ง, ์ด๊ฒ๋ค์ด ์ ์ ํ๊ฒ ๊ด๋ฆฌ๋์ง ์๋ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. useState
๋ ์
๋ฐ์ดํธ ๋ก์ง์ ๋ชจ์์ฃผ๋ ๋ฐ์๋ ๋์์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋์ Redux reducer์ ์ด์ฉ์ ์ ํธํ ์๋ ์๊ฒ ์ง์.
function todosReducer(state, action) {
switch (action.type) {
case 'add':
return [...state, {
text: action.text,
completed: false
}];
// ... other actions ...
default:
return state;
}
}
reducer๋ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ๊ธฐ์ ํธ๋ฆฌํ๋ฉฐ ๋ณต์กํ ์ ๋ฐ์ดํธ ๋ก์ง์ ํํ์ด ๋์ด๋๋ ๊ฒฝ์ฐ์๋ ์ ๋ง์ต๋๋ค. ํ์ํ๋ค๋ฉด ๋ ์์ reducer๋ก ๋๋๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง React state์ ์ฅ์ ์ ๋๋ฆฌ๋ ๊ฒ์ ์ ํ์ผ ๋ฟ, ์ด ๋๋ฌธ์ ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ณ ์ถ์ง ์์ ์๋ ์์ต๋๋ค.
์ปดํฌ๋ํธ์ ์์ state๋ฅผ reducer๋ก ๊ด๋ฆฌํ๋ useReducer
Hook์ ์์ฑํ๋ค๋ฉด ์ด๋จ๊น์? ์ด Hook์ ๊ฐ๋จํ ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
function useReducer(reducer, initialState) {
const [state, setState] = useState(initialState);
function dispatch(action) {
const nextState = reducer(state, action);
setState(nextState);
}
return [state, dispatch];
}
์ปดํฌ๋ํธ ์์์ ์ด Hook์ ์ฌ์ฉํ์ฌ reducer๊ฐ state ๊ด๋ฆฌ๋ฅผ ํฉ๋๋ค.
function Todos() {
const [todos, dispatch] = useReducer(todosReducer, []);
function handleAddClick(text) {
dispatch({ type: 'add', text });
}
// ...
}
๋ณต์กํ ์ปดํฌ๋ํธ์์ ๋ด์์ state๋ฅผ reducer๋ก ๊ด๋ฆฌํด์ผ ํ๋ ๋ณดํธ์ ํ์์ฑ์ ๊ณ ๋ คํ์ฌ React์๋ useReducer
๊ฐ ๋ด์ฅ๋์ด ์์ต๋๋ค. ์ด๋ Hook API ์ฐธ๊ณ ์์์ ๋ค๋ฅธ ๋ด์ฅ Hook๊ณผ ํจ๊ป ์ฐพ์๋ณผ ์ ์์ต๋๋ค.