React ๋™์‹œ์„ฑ ๋ชจ๋“œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ: ๋ณต์›๋ ฅ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์ถ•ํ•˜๊ธฐ | MLOG | MLOG}> ); }

๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ํด๋ฐฑ UI๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Suspense ์ปดํฌ๋„ŒํŠธ๋Š” React๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋™์•ˆ "์ปดํฌ๋„ŒํŠธ ๋กœ๋”ฉ ์ค‘..." ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

2. ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ค‘ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ

๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ(์˜ˆ: ์—…๋ฐ์ดํŠธ, ์ƒ์„ฑ, ์‚ญ์ œ)์€ ์ข…์ข… ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ์ž‘์—…์˜ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๊ฐ€์ƒ์˜ `updateData` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:


import React, { useState } from 'react';

function MyComponent() {
  const [isUpdating, setIsUpdating] = useState(false);
  const [updateError, setUpdateError] = useState(null);

  const handleUpdate = async () => {
    setIsUpdating(true);
    setUpdateError(null);
    try {
      await updateData(someData);
      // ์—…๋ฐ์ดํŠธ ์„ฑ๊ณต
      console.log("์—…๋ฐ์ดํŠธ ์„ฑ๊ณต!");
    } catch (error) {
      // ์—…๋ฐ์ดํŠธ ์‹คํŒจ
      console.error("์—…๋ฐ์ดํŠธ ์‹คํŒจ:", error);
      setUpdateError(error.message || "์—…๋ฐ์ดํŠธ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.");
    } finally {
      setIsUpdating(false);
    }
  };

  return (
    
{updateError &&
์˜ค๋ฅ˜: {updateError}
}
); }

์ด ์˜ˆ์‹œ์—์„œ:

3. ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ React ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ „๋žต๊ณผ ์–ด๋–ป๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ฝœ๋ฐฑ, ํ”„๋ผ๋ฏธ์Šค ๋˜๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์™€ ๊ฐ™์€ ์ž์ฒด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ฐจํŠธ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ํด๋ฐฑ UI๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ์›๊ฒฉ ์„œ๋น„์Šค์— ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฌธ์„œ์—์„œ ๊ถŒ์žฅํ•˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

React ๋™์‹œ์„ฑ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€

React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

๊ณ ๊ธ‰ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ์ˆ 

1. ์‚ฌ์šฉ์ž ์ •์˜ ์˜ค๋ฅ˜ ๋ณด๊ณ  ์„œ๋น„์Šค

Sentry๋‚˜ Rollbar์™€ ๊ฐ™์€ ์„œ๋น„์Šค๋Š” ์˜ค๋ฅ˜ ์ถ”์ ์— ํ›Œ๋ฅญํ•œ ์„ ํƒ์ด์ง€๋งŒ, ์‚ฌ์šฉ์ž ์ •์˜ ์˜ค๋ฅ˜ ๋ณด๊ณ  ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ•˜๋Š” ํŠน์ • ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‚ด๋ถ€ ๋กœ๊น… ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ตํ•ฉ์ด๋‚˜ ํŠน์ • ๋ณด์•ˆ ์ •์ฑ… ์ค€์ˆ˜๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ์˜ค๋ฅ˜ ๋ณด๊ณ  ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์„ธ์š”:

2. ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด

์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค(Circuit Breaker) ํŒจํ„ด์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ์ž‘์—…์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

React ์ปจํ…์ŠคํŠธ์—์„œ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” API ์—”๋“œํฌ์ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ์‹œ๋„๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋Š” ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC)๋‚˜ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์„ธ ๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

3. `useErrorBoundary` ์ปค์Šคํ…€ ํ›… ์‚ฌ์šฉํ•˜๊ธฐ

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ, ๊ฐ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ์ „์šฉ ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `useErrorBoundary`๋ผ๋Š” ์ปค์Šคํ…€ ํ›… ๋‚ด์— ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์บก์Аํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


import { useState, useCallback } from 'react';

function useErrorBoundary() {
  const [error, setError] = useState(null);

  const resetError = useCallback(() => {
    setError(null);
  }, []);

  const captureError = useCallback((e) => {
    setError(e);
  }, []);

  return {
    error,
    captureError,
    resetError,
  };
}

export default useErrorBoundary;

์ด์ œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด ํ›…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:


import useErrorBoundary from './useErrorBoundary';

function MyComponent() {
  const { error, captureError, resetError } = useErrorBoundary();

  if (error) {
    return (
      

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค!

{error.message}

); } try { // ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ๋กœ์ง const result = performDangerousOperation(); return
{result}
; } catch (e) { captureError(e); return null; // ๋˜๋Š” ๋‹ค๋ฅธ ํด๋ฐฑ } }

์ด ํŒจํ„ด์€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ›… ๋‚ด์— ์ƒํƒœ์™€ ๋กœ์ง์„ ์บก์Аํ™”ํ•˜์—ฌ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” ๊ฒฌ๊ณ ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์žˆ์–ด, ํŠนํžˆ ๋™์‹œ์„ฑ ๋ชจ๋“œ ์ปจํ…์ŠคํŠธ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ์ธก๋ฉด์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด try/catch ๋ธ”๋ก์˜ ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ , ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ์™€ Suspense๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ, ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋ฉด ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๋ณต์›๋ ฅ์ด ๋›ฐ์–ด๋‚˜๊ณ  ์›ํ™œํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ์š”๊ตฌ์— ๋งž๊ฒŒ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ „๋žต์„ ์กฐ์ •ํ•˜๊ณ , ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”. ํฌ๊ด„์ ์ธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ํˆฌ์žํ•จ์œผ๋กœ์จ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋ฉฐ ์ „ ์„ธ๊ณ„ ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ๊ฒ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฐฐ๊ฒฝ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„์›€์ด ๋˜๋Š” ๋ช…ํ™•ํ•˜๊ณ  ์œ ์ตํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ์ค‘์š”์„ฑ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์„ค๊ณ„ ๊ณผ์ •์—์„œ ๊ตญ์ œํ™” ๋ฐ ํ˜„์ง€ํ™”๋ฅผ ๊ณ ๋ คํ•จ์œผ๋กœ์จ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ธ€๋กœ๋ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋”์šฑ ํฌ์šฉ์ ์ด๊ณ  ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.