@@ -13,37 +13,37 @@ React๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ต์ ํํ๊ธฐ ์ํด ํ์ํ ๋๋ง๋ค ์ปดํฌ
1313## ์ปดํฌ๋ํธ ํจ์๋ฅผ ์ง์ ํธ์ถํ์ง ๋ง์ธ์ {/* never-call-component-functions-directly* /}
1414์ปดํฌ๋ํธ๋ JSX์์๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ผ๋ฐ ํจ์์ฒ๋ผ ํธ์ถํ์ง ๋ง์ธ์. React๊ฐ ํธ์ถํด์ผ ํฉ๋๋ค.
1515
16- React๋ [ ๋ ๋๋งํ๋ ๋์] ( /reference/rules/components-and-hooks-must-be-pure#how-does-react-run-your-code ) ์ปดํฌ๋ํธ ํจ์๊ฐ ์ธ์ ํธ์ถ๋ ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. React์์๋ ์ด๋ฅผ JSX๋ก ์ํํฉ๋๋ค.
16+ React๋ [ ๋ ๋๋งํ๋ ๋์] ( /reference/rules/components-and-hooks-must-be-pure#how-does-react-run-your-code ) ์ปดํฌ๋ํธ ํจ์๊ฐ ์ธ์ ํธ์ถ๋ ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. React๋ ์ด๋ฅผ JSX๋ก ์ํํฉ๋๋ค.
1717
1818``` js {2}
1919function BlogPost () {
20- return < Layout>< Article / >< / Layout> ; // โ
์ปดํฌ๋ํธ๋ฅผ JSX์์๋ง ์ฌ์ฉํฉ๋๋ค
20+ return < Layout>< Article / >< / Layout> ; // โ
Good: ์ปดํฌ๋ํธ๋ฅผ JSX์์๋ง ์ฌ์ฉํฉ๋๋ค.
2121}
2222```
2323
2424``` js {2}
2525function BlogPost () {
26- return < Layout> {Article ()}< / Layout> ; // ๐ด ์ปดํฌ๋ํธ ํจ์๋ฅผ ์ง์ ํธ์ถํ์ง ๋ง์ธ์
26+ return < Layout> {Article ()}< / Layout> ; // ๐ด Bad: ์ปดํฌ๋ํธ ํจ์๋ฅผ ์ง์ ํธ์ถํ์ง ๋ง์ธ์.
2727}
2828```
2929
3030์ปดํฌ๋ํธ๊ฐ Hook์ ํฌํจํ๊ณ ์๋ค๋ฉด, ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ณต๋ฌธ์ด๋ ์กฐ๊ฑด๋ฌธ์์ ์ง์ ํธ์ถํ ๋ [ Hook์ ๊ท์น] ( /reference/rules/rules-of-hooks ) ์ ์๋ฐํ๊ธฐ ์ฝ์ต๋๋ค.
3131
3232React๊ฐ ๋ ๋๋ง์ ์กฐ์ ํ๋๋ก ํ๋ฉด ์ฌ๋ฌ ์ด์ ์ด ์์ต๋๋ค.
3333
34- * ** ์ปดํฌ๋ํธ๊ฐ ํจ์ ์ด์์ ์ญํ ์ ํ๊ฒ ๋ฉ๋๋ค.** React๋ Hook์ ์ฌ์ฉํด ์ปดํฌ๋ํธ์ _ ๋ก์ปฌ ์ํ _ ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ, ์ปดํฌ๋ํธ๊ฐ ํธ๋ฆฌ ๋ด์์ ๊ณ ์ ํ ์ ์ฒด์ฑ์ ๊ฐ๋๋ก ํ ์ ์์ต๋๋ค.
34+ * ** ์ปดํฌ๋ํธ๊ฐ ํจ์ ์ด์์ ์ญํ ์ ํ๊ฒ ๋ฉ๋๋ค.** React๋ Hook์ ์ฌ์ฉํด ์ปดํฌ๋ํธ์ < em >์ง์ญ State</ em > ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ, ์ปดํฌ๋ํธ๊ฐ ํธ๋ฆฌ ๋ด์์ ๊ณ ์ ํ ์ ์ฒด์ฑ์ ๊ฐ๋๋ก ํ ์ ์์ต๋๋ค.
3535* ** ์ปดํฌ๋ํธ ํ์
์ด ์ฌ์กฐ์ ๊ณผ์ ์ ์ฐธ์ฌํฉ๋๋ค.** React๊ฐ ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๋๋ก ํ๋ฉด ํธ๋ฆฌ์ ๊ฐ๋
์ ๊ตฌ์กฐ์ ๋ํด ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ฒ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ` <Feed> ` ์์ ` <Profile> ` ํ์ด์ง๋ก ์ ํ๋ ๋ React๋ ์ด๋ฅผ ์ฌ์ฌ์ฉํ๋ ค๊ณ ํ์ง ์์ต๋๋ค.
3636* ** React๊ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์ํ ์ ์์ต๋๋ค.** ์๋ฅผ ๋ค์ด React๋ ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๋ ์ฌ์ด์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ผ๋ถ ์์
์ ์ํํ ์ ์๋๋ก ํ์ฌ, ํฐ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๋ค์ ๋ ๋๋งํ๋ ๊ฒ์ด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
3737* ** ๋ ๋์ ๋๋ฒ๊น
๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.** ์ปดํฌ๋ํธ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ผ๊ธ ๊ฐ์ฒด๋ก ์ทจ๊ธ๋๋ฉด, ๊ฐ๋ฐ ์ค์ ๋ถ์ํ ์ ์๋ ํ๋ถํ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
3838* ** ์ฌ์กฐ์ ๊ณผ์ ์ด ๋ ํจ์จ์ ์
๋๋ค.** React๋ ํธ๋ฆฌ์์ ์ ํํ ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง์ด ํ์ํ์ง ๊ฒฐ์ ํ๊ณ , ํ์ ์๋ ์ปดํฌ๋ํธ๋ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ์ด๋ ์ฑ์ ๋ ๋น ๋ฅด๊ณ ๋ฏผ์ฒฉํ๊ฒ ๋ง๋ญ๋๋ค.
3939
4040---
4141
42- ## Hook์ ์ผ๋ฐ ๊ฐ์ผ๋ก ์ ๋ฌํ์ง ๋ง์ธ์ {/* never-pass-around-hooks-as-regular-values* /}
42+ ## Hook์ ์ผ๋ฐ ๊ฐ์ฒ๋ผ ์ ๋ฌํ์ง ๋ง์ธ์ {/* never-pass-around-hooks-as-regular-values* /}
4343
4444Hook์ ์ปดํฌ๋ํธ๋ Hook ๋ด๋ถ์์๋ง ํธ์ถ๋์ด์ผ ํฉ๋๋ค. Hook์ ์ผ๋ฐ ๊ฐ์ฒ๋ผ ์ ๋ฌํ์ง ๋ง์ธ์.
4545
46- Hook์ ์ปดํฌ๋ํธ์ React ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๊ฒ ํฉ๋๋ค. Hook์ ํญ์ ํจ์๋ก ํธ์ถ๋์ด์ผ ํ๋ฉฐ ์ผ๋ฐ ๊ฐ์ฒ๋ผ ์ ๋ฌํ๋ฉด ์ ๋ฉ๋๋ค. Hook์ ํจ์๋ก ํธ์ถํด์ผ, ๊ฐ๋ฐ์๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์ดํดํ ์ ์๋ _ ๋ก์ปฌ ์ถ๋ก _ ์ด ๊ฐ๋ฅํฉ๋๋ค.
46+ Hook์ ์ปดํฌ๋ํธ์ React ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๊ฒ ํฉ๋๋ค. Hook์ ํญ์ ํจ์๋ก ํธ์ถ๋์ด์ผ ํ๋ฉฐ ์ผ๋ฐ ๊ฐ์ฒ๋ผ ์ ๋ฌํ๋ฉด ์ ๋ฉ๋๋ค. Hook์ ํจ์๋ก ํธ์ถํด์ผ, ๊ฐ๋ฐ์๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์ดํดํ ์ ์๋ _ ์ง์ญ ์ถ๋ก _ ์ด ๊ฐ๋ฅํฉ๋๋ค.
4747
4848์ด ๊ท์น์ ์ด๊ธฐ๋ฉด React๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์๋์ผ๋ก ์ต์ ํํ์ง ๋ชปํฉ๋๋ค.
4949
@@ -53,7 +53,7 @@ Hook์ ๊ฐ๋ฅํ ํ "์ ์ "์ผ๋ก ์ ์ง๋์ด์ผ ํฉ๋๋ค. ์ด๋ Hook์
5353
5454``` js {2}
5555function ChatInput () {
56- const useDataWithLogging = withLogging (useData); // ๐ด ๊ณ ์ฐจ Hook์ ์์ฑํ์ง ๋ง์ธ์
56+ const useDataWithLogging = withLogging (useData); // ๐ด Bad: ๊ณ ์ฐจ Hook์ ์์ฑํ์ง ๋ง์ธ์.
5757 const data = useDataWithLogging ();
5858}
5959```
@@ -62,7 +62,7 @@ Hook์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํด์ผ ํ๋ฉฐ ์์ ๋์ง ์์์ผ ํฉ๋๋ค. Hook์
6262
6363``` js {2,6}
6464function ChatInput () {
65- const data = useDataWithLogging (); // โ
Hook์ ์๋ก ์์ฑํ์ธ์
65+ const data = useDataWithLogging (); // โ
Good: Hook์ ์๋ก ์์ฑํ์ธ์.
6666}
6767
6868function useDataWithLogging () {
@@ -76,7 +76,7 @@ Hook์ ๋์ ์ผ๋ก ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด Hook์ ๊ฐ์ผ
7676
7777``` js {2}
7878function ChatInput () {
79- return < Button useData= {useDataWithLogging} / > // ๐ด Hook์ props๋ก ์ ๋ฌํ์ง ๋ง์ธ์
79+ return < Button useData= {useDataWithLogging} / > // ๐ด Bad: Hook์ Props๋ก ์ ๋ฌํ์ง ๋ง์ธ์.
8080}
8181```
8282
@@ -88,12 +88,12 @@ function ChatInput() {
8888}
8989
9090function Button () {
91- const data = useDataWithLogging (); // โ
Hook์ ์ง์ ์ฌ์ฉํ์ธ์
91+ const data = useDataWithLogging (); // โ
Good: Hook์ ์ง์ ์ฌ์ฉํ์ธ์.
9292}
9393
9494function useDataWithLogging () {
9595 // Hook์ ๋์์ ๋ณ๊ฒฝํ๋ ์กฐ๊ฑด๋ถ ๋ก์ง์ด ์๋ค๋ฉด, ์ด๋ Hook ๋ด๋ถ์ ํฌํจํด์ผ ํฉ๋๋ค.
9696}
9797```
9898
99- ์ด๋ ๊ฒ ํ๋ฉด ` <Button /> ` ์ปดํฌ๋ํธ๊ฐ ํจ์ฌ ์ดํดํ๊ธฐ ์ฝ๊ณ ๋๋ฒ๊น
ํ๊ธฐ๋ ์ฌ์์ง๋๋ค. Hook์ ๋์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ฑ์ ๋ณต์ก์ฑ์ด ํฌ๊ฒ ์ฆ๊ฐํ๊ณ , ๋ก์ปฌ ์ถ๋ก ์ ๋ฐฉํดํ์ฌ ์ฅ๊ธฐ์ ์ผ๋ก ํ์ ์์ฐ์ฑ์ ์ ํ์ํต๋๋ค. ๋ํ Hook์ ์กฐ๊ฑด๋ถ๋ก ํธ์ถํ๋ฉด ์๋๋ค๋ [ Hook์ ๊ท์น] ( /reference/rules/rules-of-hooks ) ์ ์ค์๋ก ์ด๊ธฐ๊ธฐ ์ฝ์ต๋๋ค. ํ
์คํธ๋ฅผ ์ํด ์ปดํฌ๋ํธ๋ฅผ ๋ชจํนํด์ผ ํ๋ค๋ฉด, ๋์ ์๋ฒ๋ฅผ ๋ชจํนํ์ฌ ๋ฏธ๋ฆฌ ์ค๋น๋ ๋ฐ์ดํฐ์ ์๋ตํ๋๋ก ํ๋ ๊ฒ์ด ๋ซ์ต๋๋ค. ๊ฐ๋ฅํ๋ค๋ฉด ์ฑ์ end-to-end ํ
์คํธํ๋ ๊ฒ์ด ๋ ํจ๊ณผ์ ์
๋๋ค.
99+ ์ด๋ ๊ฒ ํ๋ฉด ` <Button /> ` ์ปดํฌ๋ํธ๊ฐ ํจ์ฌ ์ดํดํ๊ธฐ ์ฝ๊ณ ๋๋ฒ๊น
ํ๊ธฐ๋ ์ฌ์์ง๋๋ค. Hook์ ๋์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ฑ์ ๋ณต์ก์ฑ์ด ํฌ๊ฒ ์ฆ๊ฐํ๊ณ , ์ง์ญ ์ถ๋ก ์ ๋ฐฉํดํ์ฌ ์ฅ๊ธฐ์ ์ผ๋ก ํ์ ์์ฐ์ฑ์ ์ ํ์ํต๋๋ค. ๋ํ Hook์ ์กฐ๊ฑด๋ถ๋ก ํธ์ถํ๋ฉด ์๋๋ค๋ [ Hook์ ๊ท์น] ( /reference/rules/rules-of-hooks ) ์ ์ค์๋ก ์ด๊ธฐ๊ธฐ ์ฝ์ต๋๋ค. ํ
์คํธ๋ฅผ ์ํด ์ปดํฌ๋ํธ๋ฅผ ๋ชจํน< sup >Mocking</ sup >ํด์ผ ํ๋ค๋ฉด, ๋์ ์๋ฒ๋ฅผ ๋ชจํน< sup >Mocking</ sup >ํ์ฌ ๋ฏธ๋ฆฌ ์ค๋น๋ ๋ฐ์ดํฐ์ ์๋ตํ๋๋ก ํ๋ ๊ฒ์ด ๋ซ์ต๋๋ค. ๊ฐ๋ฅํ๋ค๋ฉด ์ฑ์ end-to-end ํ
์คํธํ๋ ๊ฒ์ด ๋ ํจ๊ณผ์ ์
๋๋ค.
0 commit comments