๊ตฌ์กฐ๋ถํดํ ๋น(๋น๊ตฌ์กฐํํ ๋น)
์ด๋ ๋ณ์๋ฅผ ํ๋ฒ์ ๋ชจ๋ ์ ์ธํ๊ณ ํ ๋นํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ์ด๋ค.
const child = {
name: "์ฒ ์",
age: 13,
school: "๋ค๋์ฅ์ด๋ฑํ๊ต"
}
์์ ์ฝ๋๋ ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ๋ถํดํด์ ๋ณ์๋ฅผ ํ ๋นํ๋ ๊ตฌ์กฐ๋ถํดํ ๋น ๋ฐฉ์์ด๋ค.
๊ฐ์ฒด์ value ๊ฐ์ ๊ฐ๊ฐ ์๋ก์ด ๋ณ์์ ํ ๋นํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ํ๋์ฉ ์ ์ธํ๊ณ ํ ๋นํด์ผ ํ๋ค.
const name = child.name
const age = child.age
const school = child.school
ํ์ง๋ง ๋๋ฌด ๊ธธ๊ณ , ๋ฒ๊ฑฐ๋ก์ ๋ณด์ธ๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ถ์ฝ(๊ตฌ์กฐ๋ถํดํ ๋น
)ํ ์ ์๋ค.
const { name, age, school } = child
๊ฐ์ฒด์ ๊ตฌ์กฐ๋ถํด ํ ๋น์ ์ ์ธ๋ถ์ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ฐ์ฒด์ key๊ฐ์ ๋ณ์๋ช ์ผ๋ก ์ฌ์ฉํ๋ค. ๋ณ์๋ช ์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ง์ ํด์๋ ์๋๋ค.
์ฐ๋ฆฌ๋ useQuery
๋ฅผ ์ธ ๋์๋ ๊ฐ์ฒด๋ฅผ ๊ตฌ์กฐ๋ถํดํ ๋นํ๊ณ ์์๋ค!
const { data, loading } = useQuery(FETCH_BOARDS)
์์์ return ๊ฐ์ data์ loading์ด ๋๋ค. const aaa = useQuery(FETCH_BOARDS)
๋ก ๋ฐ์์ aaa.data
, aaa.loading
์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
๋ฐฐ์ด๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ตฌ์กฐ๋ถํดํ ๋น
์ด ๊ฐ๋ฅํ๋ค.
const classmates = ["์ฒ ์","์ํฌ","ํ์ด"]
์ด์ ๊น์ง๋ ๋ฐฐ์ด์ ์์๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ ๋ ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ํด์ผ๋ง ํ๋ค.
const child1 = classmates[0]
const child2 = classmates[1]
const child3 = classmates[2]
ํ์ง๋ง ๊ตฌ์กฐ๋ถํดํ ๋น
์ ์ฌ์ฉํ๋ฉด ํจ์ฌ ๊ฐ๋จํ๊ฒ ํ ์ ์๋ค.
const [child1, child2, child3] = classmates
๋ฐฐ์ด์ ๊ตฌ์กฐ๋ถํด ํ ๋น์ ์ ์ธ๋ถ์ ๋๊ดํธ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ถํดํ ๋น๊ณผ ๋ค๋ฅด๊ฒ ๋ณ์๋ช ์ ๋ง์๋๋ก ์ ํด๋ ๋๋ค. ๋ค๋ง ๋ฐฐ์ด์ ์์ ํ ๋น์ ์ธ๋ฑ์ค์ ์์๋๋ก ๋ค์ด๊ฐ๋ค.
์ฐ๋ฆฌ๋ useState๋ฅผ ์ธ ๋์๋ ๋ฐฐ์ด์ ๊ตฌ์กฐ๋ถํดํ ๋น์ ์ฌ์ฉํ๋ค.
const [state,setState] = useState("")
const qqq = useState(โโ)
์ ๋ฆฌํด๊ฐ์ด ๋ฐฐ์ด์ด๋ฏ๋ก const state = qqq[0]
, const setCounter = qqq[1]
๋ก ์ฌ์ฉํ ์ ์๋ค.
์ฐ๋ฆฌ๊ฐ ๊ฐ์ฒด์์ ์ง์ฐ๊ณ ์ถ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น? delete
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
const child = {
name: "์ฒ ์",
age: 13,
school: "๋ค๋์ฅ์ด๋ฑํ๊ต",
hobby: "์ถ๊ตฌ",
ํค: 150
}
์์์ name๊ณผ school์ ์ง์ฐ๊ณ ์ถ์ผ๋ฉด, delete child.name
, delete child.school
์ ํ๋ฉด ๋๋ค.
ํ์ง๋ง ์๋ณธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ์ญ์ ํ๋ ๊ฒ์ ์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ ์๋๋ค. ์๋ณธ์ด ์ด๋์์ ์ด๋ป๊ฒ ์ฐ์ด๊ณ ์๋์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์๋ณธ์ ๋ฐ๋ก ์์ ํ๋ค๊ฐ ์๋ฌ๊ฐ ๋ฐ์ํ ์๋ ์๋ค.
๋ฐ๋ผ์ delete๋ณด๋ค๋ rest ํ๋ผ๋ฏธํฐ
๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ข๋ค. rest ํ๋ผ๋ฏธํฐ๋ ๊ตฌ์กฐ๋ถํดํ ๋น๊ณผ ํจ๊ป ์ฌ์ฉํ๋ค.
const { name, school, ...rest} = child
์์ ๊ฐ์ด ์ ์ผ๋ฉด ...rest
์๋ name๊ณผ school์ ์ ์ธํ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
custom hook
์ด๋ ๊ฐ๋ฐ์ ์ค์ค๋ก ์ปค์คํ
ํ hook์ ๋ปํ๋ค.
custom hook๋ ํจ์์ธ๋ฐ, ์ผ๋ฐํจ์์๋ ์ด๋ค ์ฐจ์ด์ ์ด ์๊ณ , ๊ตณ์ด custom hook์ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ญ๊น?
์ฌ์ค ๋ณ ์ฐจ์ด๋ ์์ง๋ง, ๋ด๋ถ์์ useState์ ๊ฐ์ hook์ ์ฌ์ฉํ๊ฒ ๋๋ฉด custom hook
์ด๋ผ๊ณ ํ๋ค.
๊ธฐ์กด์ ๋ง๋ค์ด๋จ๋ withAuth ํ์ผ์ ๊ฐ์ ธ์์ useAuth ํจ์๋ฅผ ๋ง๋ค์ด๋ดค๋ค.
import { useAuth } from "../../../src/components/commons/hooks/useAuth";
export default function CustomHooksUseAuthPage(): JSX.Element {
useAuth();
return <div>ํ๋กํ ํ์ด์ง์
๋๋ค.</div>;
}
import { useRouter } from "next/router";
import { useEffect } from "react";
// useAuth ์ด๋ฆ ๋ณ๊ฒฝ ๊ฐ๋ฅ!
export const useAuth = (): void => {
const router = useRouter();
// useEffect hooks๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ custom hooks๋ค.
useEffect(() => {
if (localStorage.getItem("accessToken") === null) {
alert("๋ก๊ทธ์ธ ํ ์ด์ฉ ๊ฐ๋ฅํฉ๋๋ค!");
void router.push("/section23/23-05-login-check-hoc");
}
}, []);
};
ํ์ด์ง๊ฐ ์คํ๋๋ฉด, useAuth()๊ฐ ์คํ๋์ด ํ ํฐ์ ํ์ธ ํ ํ ํฐ์ด ์กด์ฌํ๋ค๋ฉด ํ๋กํ ํ์ด์ง๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ก๊ทธ์ธ ํ์ ์ด์ฉํ๋๋ก ๊ฒฝ๊ณ ์ฐฝ์ ๋์ธ ๊ฒ์ด๋ค.
const getPrimitive = (arg1: string, arg2: number, arg3: boolean): [boolean, number, string] => {
return [arg3, arg2, arg1];
};
const result1 = getPrimitive("์ฒ ์", 123, true);
any type์ ๊ทธ๋ฅ javascript์ ๊ฐ๋ค. ์ด๋ค ํ์ ์ด ์ ๋ ฅ๋๋๋ผ๋ ์ ๋ถ ํ์ฉํ๋ค.
const getAny = (arg1: any, arg2: any, arg3: any): [any, any, any] => {
console.log(arg1 * 1000);
return [arg3, arg2, arg1];
};
const result2 = getAny("์ฒ ์", 123, true);
any์ฒ๋ผ ๋ญ ๋ฃ์ด๋ ์๊ด์์ง๋ง, ๊ทธ๊ฒ์ ์คํํ ๋์๋ ์ด๋ค ํ์ ์ผ ๋ ์คํํ ์ง ์กฐ๊ฑด์ ๋ฌ์์ค์ผ ํ๋ค. ํ์ ์ด ์ง์ ๋์ง ์์์ผ๋ฏ๋ก ์ฐ์ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์์ ๊ฒฝ๊ณ ํ๋ค.
const getUnknown = (arg1: unknown, arg2: unknown, arg3: unknown): [unknown, unknown, unknown] => {
if (typeof arg1 === "number") {
console.log(arg1 * 1000);
}
return [arg3, arg2, arg1];
};
const result3 = getUnknown("์ฒ ์", 123, true);
const result33 = result3[0] * 10;
// alert! Object is of type 'unknown'.
์ธ์์ ๋ค์ด์ค๋ ๊ฐ์ ๋ฐ๋ผ ํ์ ์ด ๋ฐํ๋๋ค.
function getGeneric4<Mytype1, Mytype2, Mytype3>(arg1: Mytype1, arg2: Mytype2, arg3: Mytype3): [Mytype3, Mytype2, Mytype1] {
return [arg3, arg2, arg1];
}
const result4 = getGeneric4("์ฒ ์", 123, true);
const result44 = result4[0] * 10;
arg1์ string ํ์ ์ผ๋ก, arg2๋ number ํ์ ์ผ๋ก, arg3๋ boolean ํ์ ์ด ๋๋ค.
MyType ๋ถ๋ถ์ ํจ์์ฒ๋ผ ์ฌ์ฉ์๊ฐ ์ํ๋ ์ด๋ฆ์ ์ง์ ํด์ค ์ ์๋ค. ํต์์ ์ผ๋ก T
, U
, V
๋ฑ ๊ฐ๋จํ ์ด๋ฆ์ ์ฌ์ฉํ๋ค.
Generic ํ์ ์ useQuery, useMutation์ฒ๋ผ ๋ด๊ฐ ๋ง๋ ๊ธฐ๋ฅ์ ๋ค๋ฅธ ์ฌ๋์๊ฒ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค. ๋ค์ด์ค๋ ๊ฐ์ ํ์ ์ ๋ฐ๋ผ ๋ฐํ๋๋ ๊ฐ์ด๋ ์ปดํฌ๋ํธ์ ํ์ ์ด ๊ฒฐ์ ๋๋๋ก ํ๋ค.
import { useRouter } from "next/router";
import type { ReactElement } from "react";
import { useEffect } from "react";
export const ๋ก๊ทธ์ธ์ฒดํฌ =
(์ปดํฌ๋ํธ: () => JSX.Element) =>
<P extends Record<string, unknown>>(ํ๋กญ์ค: P): ReactElement<P> => {
// props์ ๋ฐ๋์ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ์ผ ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, extends๋ฅผ ์ฌ์ฉํด์ P๋ผ๋ Generic ํ์
์ด ๊ฐ์ฒด๋ผ๋ ์ฌ์ค์ ๋ช
์
// *JSX.Element ๋์ ReactElement๋ฅผ ์ฐ๋ ์ด์ ?
const router = useRouter();
useEffect(() => {
if (localStorage.getItem("accessToken") === null) {
alert("๋ก๊ทธ์ธ ํ ์ด์ฉ ๊ฐ๋ฅํฉ๋๋ค!");
void router.push("/section23/23-05-login-check-hoc");
}
}, []);
return <์ปดํฌ๋ํธ {...ํ๋กญ์ค} />;
};
ReactElement๋ JSX.Element์ props์ ํ์ ๊น์ง ๋ํ๋ด์ค๋ค.