[React] ๋ฆฌ์กํธ Strict Mode ์๊ฒฉ ๋ชจ๋์ ์ฌ์ด๋ ์ดํํธ
์๊ฒฉ ๋ชจ๋์ ๊ธฐ๋ฅ
CRA๋ก ์์ฑํ React ํ๋ก์ ํธ์์ ์๊ฒฉ ๋ชจ๋(Strict Mode)๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉ๋ผ ์๋ค. ์๊ฒฉ ๋ชจ๋๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์์๋ด๊ธฐ ์ํด ๋ฆฌ์กํธ์์ ์ ๊ณตํ๋ ๋๊ตฌ๋ค. ๊ฐ๋ฐ ๋ชจ๋์์ ํจ์ ์ปดํฌ๋ํธ ๋ ๋๋ง / API ํธ์ถ ๋ฑ์ด ์ค๋ณตํด์ ๋ฐ์ํ๋ค๋ฉด ์๊ฒฉ ๋ชจ๋ ๋๋ฌธ์ ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./pages/App";
const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement,
);
root.render(<React.StrictMode>{/* ... */}</React.StrictMode>);
์๊ฒฉ ๋ชจ๋๋ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์๊ฒฉ ๋ชจ๋๋ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ์ ์ฉ๋๋ฉฐ UI์ ์ํฅ์ ์ฃผ์ง ์๋๋ค(๋ ๋๋ง X).
- ์์ ํ์ง ์์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ ๋ฐ๊ฒฌ
- ๋ ๊ฑฐ์ ๋ฌธ์์ด ref ์ฌ์ฉ์ ๋ํ ๊ฒฝ๊ณ
- ๊ถ์ฅ๋์ง ์๋ findDOMNode ์ฌ์ฉ์ ๋ํ ๊ฒฝ๊ณ
- ์์์น ๋ชปํ ๋ถ์์ฉ ๊ฒ์ฌ
- ๋ ๊ฑฐ์ context API ๊ฒ์ฌ
ํจ์ ์ปดํฌ๋ํธ ๋ฐ๋, ์ํ ์
๋ฐ์ดํธ ํจ์, useState
, useMemo
, useReducer
์ธ์์ ๋๊น ํจ์ ๋ฑ์ 2๋ฒ์ฉ ํธ์ถํ๋ ๊ฒ๋ ์๊ฒฉ ๋ชจ๋์ ๊ธฐ๋ฅ์ค ํ๋๋ค. ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ฐพ์ ์ ์๋๋ก ์๋์ ์ผ๋ก 2๋ฒ์ฉ ํธ์ถํ๋ ๊ฒ.
๐๏ธ ์๊ฒฉ๋ชจ๋๊ฐ ์๋์ ์ผ๋ก ์ค๋ณต ํธ์ถํ๋ ํจ์ ๋ชฉ๋ก
- ํด๋์ค ์ปดํฌ๋ํธ์
constructor
,render
,shouldComponentUpdate
๋ฉ์๋ - ํด๋์ค ์ปดํฌ๋ํธ์
getDerivedStateFromProps
static ๋ฉ์๋ - ํจ์ ์ปดํฌ๋ํธ ๋ฐ๋
- State updater ํจ์ (
setState
์ ์ฒซ ๋ฒ์งธ ์ธ์) useState
,useMemo
,useReducer
์ ์ ๋ฌ๋๋ ํจ์
์ฒ์์ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ฐพ๊ธฐ ์ํด ์ 2๋ฒ์ฉ ํธ์ถํด์ผ ํ๋์ง ์์ํ๋ค. ์คํ๋ ค ๋ก๊ทธ๊ฐ ๋ ๋ณต์กํด์ ธ์ ๋ถํธํ๋ค. ํ์ง๋ง ์ด ์๊ฒฉ ๋ชจ๋ ๋๋ถ์ ์๊ฐ์ง ๋ชปํ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ ๋ค๋ก ๋๋ ค ์ ์ฉํ๋ค๊ณ ์๊ฐํ๋ค. ์ ์ง์ธ ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด ๋์ผํ ์์ ์ ์ค๋ณต ์ํํ๋๋ผ๋ ์ฌ์ด๋ ์ดํํธ๊ฐ ์์ด์ผ ํ๋ค.
์ฌ์ดํธ ์ดํํธ ์ฌ๋ก
์๋ ๊ธ์ฐ๊ธฐ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ Compose.tsx ์ปดํฌ๋ํธ๊ฐ ์๋ค. ์๋ฃ ๋ฒํผ์ ๋๋ฌ ์์ฑํ ๊ธ์ ์ ์ถํ๊ฑฐ๋, ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๋ฉด Compose ์ปดํฌ๋ํธ๋ ์ธ๋ง์ดํธ๋ผ์ผ ํ๋ค. ์ปดํฌ๋ํธ๋ฅผ ์ธ๋ง์ดํธํ ๋ ์
๋ ฅ์ฐฝ์ ๋จ์์๋ ํ
์คํธ๋ฅผ ๋ชจ๋ ์ญ์ ํ๊ณ (clearDraft
) ๋ฆฌ์คํธ ํ๋ฉด์ผ๋ก ์ด๋ํ๋ ์์
์ ์ํํ๋ leavePage
ํจ์๋ฅผ ํธ์ถํ๋ค.
// Compose.tsx
const leavePage = useCallback(() => {
dispatch(clearDraft()); // ์
๋ ฅ์ฐฝ์ ๋จ์์๋ ํ
์คํธ ์ญ์
navigate(siteUrl.community.list, { replace: true }); // ๋ฆฌ์คํธ ํ์ด์ง๋ก ์ด๋
}, [dispatch, navigate]);
const submitHandler = useCallback(async () => {
try {
await dispatch(submitDraft(draft)).unwrap(); // ์์ฑํ ๊ธ ์ ์ถ
leavePage(); // ๊ธ ์์ฑ์ ๋ง์ณ์ ์ธ๋ง์ดํธํ๋ case
// ...
} catch (e) {
// ...
}
}, [dispatch, draft, navigate]);
useEffect(() => {
return () => {
leavePage(); // ๋ค๋ก๊ฐ๊ธฐ ๋ฑ ๋ผ์ฐํธ ๋ณ๊ฒฝ์ผ๋ก ์ธ๋ง์ดํธํ๋ case
};
}, [leavePage]);
ํ์ง๋ง ์๊ฒฉ ๋ชจ๋์์ Compose.tsx ์ปดํฌ๋ํธ๋ฅผ ์ ์์ ์ผ๋ก ๋ง์ดํธ ํ ์ ์๋ค. useEffect
๋ฅผ 2๋ฒ ์คํํ๊ธฐ ๋๋ฌธ์ด๋ค. 2๋ฒ์งธ ์ดํํธ๋ฅผ ์คํํ๊ธฐ ์ ํด๋ฆฐ์
ํจ์์ ์๋ leavePage
๋ฅผ ํธ์ถํด์ ๋ฆฌ์คํธ ํ์ด์ง๋ก ์ด๋ํ๋ค. ์ฆ, ๊ธ์ฐ๊ธฐ ํ์ด์ง๋ก ์ด๋ํ์๋ง์ ๋ฆฌ์คํธ ํ์ด์ง๋ก ์ด๋ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ด ๋ฌธ์ ๋ ์
๋ ฅ์ฐฝ ํ
์คํธ ์ญ์ (clearDraft
)์ ํ์ด์ง ์ด๋ ๊ธฐ๋ฅ์ leavePage
ํจ์์ ๋ชฐ์๋ฃ๋๋ฐ์ ๋น๋กฏ๋๋ค. ๊ณฐ๊ณฐ์ด ์๊ฐํด๋ณด๋ฉด leavePage
ํจ์๋ clearDraft
์ญํ ๋ง ์ํํ๋ฉด ๋๋ค. leavePage
ํจ์๋ฅผ ํธ์ถํ๋ ์ํฉ์ ๋ผ์ฐํธ ๋ณ๊ฒฝ์ผ๋ก ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธํ๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ถํ์ํ leavePage
ํจ์๋ฅผ ์์ ์์ ๋ฒ๋ฆฌ๊ณ ์๋์ฒ๋ผ ์์ ํ ์ ์๋ค.
// Compose.tsx
const submitHandler = useCallback(async () => {
try {
await dispatch(submitDraft(draft)).unwrap(); // ์์ฑํ ๊ธ ์ ์ถ
navigate(siteUrl.community.list, { replace: true }); // ๋ฆฌ์คํธ ํ์ด์ง๋ก ์ด๋
// ...
} catch (e) {
// ...
}
}, [dispatch, draft, navigate]);
useEffect(() => {
return () => {
dispatch(clearDraft()); // ์
๋ ฅ์ฐฝ์ ๋จ์์๋ ํ
์คํธ ์ญ์
};
}, [leavePage]);
์๊ฒฉ ๋ชจ๋๋ฅผ ํตํด ํจ์ ์ปดํฌ๋ํธ๋ฅผ 2๋ฒ์ฉ ํธ์ถํ์ง ์์๋ค๋ฉด ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ์ง ๋ชปํ์ ๊ฒ์ด๋ค. ์๊ฒฉ ๋ชจ๋๋ ์๊ฐ๋ณด๋ค ์ ์ฉํ๋ค.
๋ ํผ๋ฐ์ค
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[TS] ํ์ ์คํฌ๋ฆฝํธ ์ ์ฝ ์กฐ๊ฑด๊ณผ ์กฐ๊ฑด๋ถ ํ์
[TS] ํ์ ์คํฌ๋ฆฝํธ ์ ์ฝ ์กฐ๊ฑด๊ณผ ์กฐ๊ฑด๋ถ ํ์
2024.05.05 -
[HTML/CSS] select ํ๊ทธ์ ํ์ดํ ์์ด์ฝ ๋ณ๊ฒฝํ๊ธฐ
[HTML/CSS] select ํ๊ทธ์ ํ์ดํ ์์ด์ฝ ๋ณ๊ฒฝํ๊ธฐ
2024.05.05 -
[React] ํค๋ณด๋๋ก ์กฐ์ํ ์ ์๋ ๋๋กญ๋ค์ด ์๋์์ฑ ๊ฒ์์ฐฝ ๊ตฌํํ๊ธฐ
[React] ํค๋ณด๋๋ก ์กฐ์ํ ์ ์๋ ๋๋กญ๋ค์ด ์๋์์ฑ ๊ฒ์์ฐฝ ๊ตฌํํ๊ธฐ
2024.05.05 -
[HTML/CSS] Tailwind CSS ํด๋์ค ํจํด ์ฌํ์ฉ / ๊ธฐ๋ณธ ํ ๋ง ์์ &ํ์ฅ
[HTML/CSS] Tailwind CSS ํด๋์ค ํจํด ์ฌํ์ฉ / ๊ธฐ๋ณธ ํ ๋ง ์์ &ํ์ฅ
2024.05.05