[React] Custom Hook

Jnary·2024년 5월 1일
0

React

목록 보기
8/10
post-thumbnail

Custom Hook

  • 반복되는 로직을 쉽게 재사용하기 위한 사용자 정의 Hook
  • use 로 시작하도록 명명
  • React 내장 Hook (useState useEffect useContext등)을 조합하여 생성

장점

  1. 재사용성
  2. 캡슐화
    • 복잡한 로직 내부에 숨기기
    • 간단한 인터페이스를 외부에 제공
    • 컴포넌트의 복잡성 줄이기
  3. 분리 및 조합
    • 서로 다른 기능을 하는 여러 Hook 조합
    • 필요에 따라 로직을 분리

사용하지 않는다면

import React, { useState, useEffect } from 'react';

function Profile() {
    const [data, setData] = useState(null);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);
    const url = 'https://api.example.com/data';

    useEffect(() => {
        async function fetchData() {
            try {
                setLoading(true);  // 로딩 상태 시작
                const response = await fetch(url);
                const result = await response.json();
                setData(result);   // 데이터 설정
            } catch (error) {
                setError(error);  // 오류 처리
            } finally {
                setLoading(false); // 로딩 상태 종료
            }
        }

        fetchData();
    }, [url]);  // url이 변경될 때마다 이펙트 실행

    if (loading) return <div>Loading...</div>;  // 로딩 중 표시
    if (error) return <div>Error: {error.message}</div>;  // 오류 표시
    return <div>{JSON.stringify(data)}</div>;  // 데이터 표시
}

export default Profile;
  • 코드 중복 : 데이터 패칭하는 로직이 필요할 때마다 이와 같은 코드 반복 -> 유지 관리 어려움
  • 컴포넌트 복잡성 : 로직이 컴포넌트에 내장 -> 컴포넌트의 주된 기능과 데이터 페칭 로직이 혼합

사용 예제

function useFetch(url) {
	const [data, setData] = useState(null);
	const [loading, setLoading] = useState(true);
	const [error, setError] = useState(null);
	
	useEffect(() => {
		async function fetchData() {
			try {
				const response = await fetch(url);
				const result = await response.json();
				setData(result);
			} catch (error) {
				setError(error);
			} finally {
				setLoading(false);
			}
		}
		fetchData();
	}, [url]);
	
	return { data, loading, error };
const { data, loading, error } = useFetch('https://api.example.com/data');

단점 (주의점)

  • 과도한 추상화
    - 복잡성 증가 : 하나의 훅이 너무 많은 기능을 수행하거나, 다른 훅들과 상호작용하는 경우 유지관리 어려움
    - 디버깅 어려움 : 오류를 추적이 복잡해짐
  • 의존성 관리
    - 사이드 이펙트 관리 : useEffect 와 같은 훅 사용시 예상치 못한 버그 더 자주 발생
  • 재사용성의 한계
    - 특정 컴포넌트나 상황에 매우 특화되어 개발 -> 다른 컴포넌트나 상황에서 재사용하기 어려울 수도 있음
    - 너무 일반화하여 만들 경우, 특정 기능을 위한 필수적인 제어 불가능할 수도
  • 테스팅의 복잡성
    - 커스텀 훅이 내부적으로 다른 훅을 사용하는 경우, 독립적인 테스트 어려움

위와 같은 부분을 염두하고 사용할 것 !

profile
숭실대학교 컴퓨터학부 21

5개의 댓글

comment-user-thumbnail
4일 전

Custom Hook의 장단점에 대해 간결하게 설명하면서, 예시도 들어주셔서 확실히 어떤 식으로 쓰이는 지 알 수 있었던 것 같아요! 특히 단점(주의점)들을 자세하게 설명해주셔서 커스텀 훅을 사용할 때 좀 더 신경 쓸 수 있을 것 같습니다. 잘 읽고 갑니다! 고생하셨어요 😊

답글 달기
comment-user-thumbnail
3일 전

커스텀 훅의 장단점에 비교해주셔서 쉽게 읽히는 아티클이였어요! 특히 주의사항 부분을 잘 알지 못하였는데, 이번 기회를 통해 배워갑니다 👍
예시 코드와 상황도 작성해주신 덕분에 잘 이해가네요 ㅎㅎ
좋은 글 감사합니다 !

답글 달기
comment-user-thumbnail
3일 전

사용하지 않는 경우와 사용하는 경우의 예제 코드를 비교해 보여주셔서 이해가 더 쉬웠던 것 같아요! 👍 중요한 내용만 쏙쏙 골라 간결하게 아티클을 이용해 주셔서 한 눈에 이해하기 너무 좋았습니다... 🫶 커스텀 훅의 장점만 항상 생각했는데, 생각보다 단점이 많다는 걸 아티클을 통해 배워갑니다!! 깔끔한 아티클 감사해요~ 🩷

답글 달기
comment-user-thumbnail
3일 전

Custom Hook 사용 전과 후로 코드 예시를 비교해주어서 Custom Hook을 왜 사용하는지 명확하게 이해할 수 있었어요! 작성해주신 주의사항 고려해서 다 Custom Hook을 사용하게 될 때 고려해서 사용해야겠어요. 깔끔, 명료한 아티클 감사합니다.

답글 달기
comment-user-thumbnail
3일 전

커스텀 훅의 장점과 사용할 때와 사용하지 않을 때의 코드를 예시로 들어주셔서 커스텀 훅을 통해 로직을 분리할 수 있다는 걸 직접 비교해서 확인할 수 있어서 좋았어요. 단점도 제시해주셔서 커스텀 훅이 오히려 복잡성을 증가시킬 수 있다는 것도 알아갑니다! 유용한 아티클 감사해요~!

답글 달기