redux 글 쓰면서 리덕스 공부해야지 하고 구상해 놓은 코드 작성하다가 우연히 만들게 된 custom hook
참고
react hooks를 사용해 직접 만든 hook
쉽게 말하면 여러 컴포넌트에서 반복적으로 사용되는 hooks를 재사용 하기 위해 함수로 만든 것
custom hook 형태
function useCustomHook (매개변수) {
// hooks...
return {
// 반환할 상태 값, 변수, 함수 ...
}
}
custom hook 사용
function Component () {
const {반환한_상태값, 변수, 함수} = useCustomHook(인수)
}
훅 생성 시 유의 사항

useModal을 getModal로 변경해서 일반 함수인 척 하니까 에러로 알려준다.eslint-plugin-react-hooks 설치된 eslint 플러그인에서 알려준 거였다.모달 컴포넌트 코드
import Button from "./Button";
interface ModalProps {
open: boolean;
message: string;
onClose: () => void;
}
function Modal({ open, onClose, message }: ModalProps) {
return (
<div
className={`${
open ? "visible" : "hidden"
} flex justify-center items-center fixed z-10 top-0 left-0 bottom-0 right-0 backdrop-blur-xl`}
onClick={onClose}
>
<div role="alertdialog" className="bg-white p-5 rounded-sm flex flex-col gap-3 m-2 w-full max-w-96 shadow-2xl">
<span className="font-semibold text-lg text-gray-700">{message}</span>
<div role="group">
<Button label="확인" onClick={onClose} />
</div>
</div>
</div>
);
}
export default Modal;
const [open, setOpen] = useState(false);
const closeModal = () => {
setOpen(false);
};
return (
<main className="min-h-screen flex justify-center items-center">
//...
<Modal open={open} onClose={closeModal} message={"가입 완료"} />
</main>
);
const [open, setOpen] = useState(false);
const [message, setMessage] = useState(""); // 추가
const openModal =({message}:{message:string})=>{
setOpen(true);
setMessage(message); // 추가
}
const closeModal = () => {
setOpen(false);
};
// 에러가 나면 모달로 사용자에게 보여줘야 하는 async 통신 함수
const handleSignIn = async () => {
// ...
if (!email || !password) {
openModal({ message: "이메일 인증을 해 주세요" });
return;
}
//....
if (response.error.code === "email_not_confirmed") {
openModal({ message: "아이디 또는 비밀번호를 확인해 주세요" });
return;
}
};
import { useState } from "react";
export default function useModal() {
const [open, setOpen] = useState(false);
const [message, setMessage] = useState("");
const openModal = ({ message }: { message: string }) => {
setMessage(message);
setOpen(true);
};
const closeModal = () => {
setOpen(false);
};
return {
open,
message,
openModal,
closeModal,
};
}
function SignIn() {
const { open, message, openModal, closeModal } = useModal();
const handleSubmit = async () => {
try {
// 생략
if (!email || !password) {
openModal({ message: "아이디와 비밀번호를 모두 작성해 주세요" });
return;
}
if (response.error.code === "email_not_confirmed") {
openModal({ message: "이메일 인증을 해 주세요" });
} else {
openModal({ message: "아이디 또는 비밀번호를 확인해 주세요" });
}
// 생략
} catch (error) {
console.error("[error]", error);
}
};
return (
<main className="min-h-screen flex justify-center items-center">
// ...
<Modal open={open} onClose={closeModal} message={message} />
</main>
);
}
export default SignIn;


퇴사 이 후에 딱히 커스텀 훅을 만들어 본 적이 없었는데 어쩌다 보니 만들게 되었다!
회사에서는 누가 만들어 놓은 커스텀 훅 가져다 쓰거나 일 시키시는 분 요청 사항에 이거 커스텀 훅으로 만들어 주세요~ 해서 만들었던 것 같은데 뭔가 내 필요에 의해 만드니 코드가 간결해지고 컴포넌트를 사용하기 편해져 작은 뿌듯함이 생겼다 ㅎㅎ