리액트(react.js) Custom Hooks이란 무엇인가?
리액트의 커스텀 훅에 대해 알아보자
리엑트에서 커스텀 훅(Custom Hooks)은 여러 컴포넌트에서 공통으로 사용되는 로직을 재사용할 수 있게 해주는 방법이다. 커스텀 훅을 사용하면 코드의 중복을 줄이고, 더 간결하고 유지보수하기 쉬운 코드를 작성할 수 있다! 커스텀 훅에 대해 자세히 알아보자.
커스텀 훅이란 무엇인가?
커스텀 훅(Custom Hook)은 리액트의 훅을 사용하여 만든 사용자 정의 함수다. use로 시작하는 이름을 가지며, 기존의 훅들을 조합하거나 새로운 로직을 추가하여 새로운 훅을 만들 수 있음.
커스텀 훅의 필요성
리액트 컴포넌트에서 동일한 로직이 반복될 때가 많음. 예를들면 데이터 페칭,폼 상태 관리, 이벤트 리스너 관리 등을 여러 컴포넌트에서 사용할 수 있는데 이때 동일한 로직을 각 컴포넌트에 반복해서 작성하는 대신, 컴스텀 훅을 만들어서 로직을 재사용할 수 있음
커스텀 훅의 사용법
3-1) 기본 사용법
커스텀 훅은 기본적으로 훅의 로직을 하나의 함수로 감싸는 것이다. 이 함수는 다른 훅들과 마찬가지로 상태를 관리하거나, 부수적인 효과(side effect)를 처리할 수 있음!
- 커스텀 훅의 함수 이름은
use로 시작하는 것이 좋다. (예: useInput, useButton) - 파일 이름은
use로 시작할 필요는 없으며, 원하는 대로 지정할 수 있음
import { useState, useEffect } from "react";
function useCustomHook() {
const [state, setState] = useState(initialValue);
useEffect(() => {
// 부수 효과 처리 로직
return () => {
// 클린업 로직
};
}, []);
// 커스텀 훅이 반환할 값
return [state, setState];
}
3-2) 예시 사용법
input 갯수만큼 늘어나는 useState, event Handler을 만들어보자.
- 아래와 같이 작성하면 input 개수가 증가할 경우 useState, 이벤트 핸들러도 증가하게됨 (코드 중복!)
import React from "react";
import { useState } from "react";
const App = () => {
// input의 갯수가 늘어날때마다 state와 handler가 같이 증가한다.
const [title, setTitle] = useState("");
const onChangeTitleHandler = (e) => {
setTitle(e.target.value);
};
// input의 갯수가 늘어날때마다 state와 handler가 같이 증가한다.
const [body, setBody] = useState("");
const onChangeBodyHandler = (e) => {
setBody(e.target.value);
};
return (
<div>
<input
type="text"
name="title"
value={title}
onChange={onChangeTitleHandler}
/>
<input
type="text"
name="title"
value={body}
onChange={onChangeBodyHandler}
/>
</div>
);
};
export default App;
3-3) 예시 사용법 개선
- hooks 폴더에 useInput 파일을 생성 후 아래의 코드를 작성
import React, { useState } from "react";
const useInput = () => {
// 2. value는 useState로 관리하고,
const [value, setValue] = useState("");
// 3. 핸들러 로직도 구현합니다.
const handler = (e) => {
setValue(e.target.value);
};
// 1. 이 훅은 [ ] 을 반환하는데, 첫번째는 value, 두번째는 핸들러를 반환합니다.
return [value, handler];
};
export default useInput;
- App.jsx 에서 커스텀 훅을 import 해서 원래 있던 훅처럼 사용함
// src/App.jsx
import React from "react";
import useInput from "./hooks/useInput";
const App = () => {
// 우리가 만든 훅을 마치 원래 있던 훅인것마냥 사용해봅니다.
const [title, onChangeTitleHandler] = useInput();
const [body, onChangeBodyHandler] = useInput();
return (
<div>
<input
type="text"
name="title"
value={title}
onChange={onChangeTitleHandler}
/>
<input
type="text"
name="title"
value={body}
onChange={onChangeBodyHandler}
/>
</div>
);
};
export default App;
커스텀 훅의 장단점
4-1) 장점
-
재사용성
- 공통 로직을 훅으로 추출하여 여러 컴포넌트에서 재사용할 수 있음
-
코드 가독성
- 복잡한 로직을 훅으로 분리하여 컴포넌트의 코드 가독성을 높일 수 있음
-
테스트
- 로직을 분리하여 개별적으로 테스트할 수 있음
4-2) 단점
- 커스텀 훅 또한 너무 많이 사용하면 관리가 어려워 질 수 있음
마무리
커스텀 훅은 자주 사용되는 공통된 로직을 재사용할 수 있게 해주는 좋은 도구인 것 같다. 과도하게 사용하면 관리가 어렵다는데, 아직 과도하게 사용을 못해봐서 중복되는 로직이 있으면 커스텀 훅을 사용해볼 수 있을까 고민해보는 것도 좋을 것 같다고 생각이 든다.