Development/React.js

네트워크 에러 처리

moretz0921 2022. 3. 15. 18:11

 

네트워크 에러 처리 

: 토이 프로젝트를 만들 때 명확한 기준 없이 에러 처리를 해왔다.

다른 사람들의 코드를 보면 공통으로 빼는 부분들이 있었는데 어떻게 하는지 궁금해서 구글링을 통해 해결방안을 찾아보았다.

- 일관성 유지
- 코드 정리 

에러 처리의 중요성
1) 무엇이 중요한가?
: 에러가 발생해도 사용자가 앱을 사용하는데 최대한 지장이 없어야 한다.

2) 사용자느 에러 발생 사실을 인지할 수 있어야 한다.


에러 처리 방법
1) 에러 전파를 최대한 막기
2) 중요도에 따라 에러 종류 정의하기 
3) 에러 메세지 매핑
: 백엔드와 협의해서 

 

 

Fetch API 예시 

: 상태 코드 200 ~ 299 이상의 응답 값은 모두 에러로 간주한다.

 

class HTTPError extends Error {}
// Promise
fetch('/api/posts' /* options */)
  .then(response => {
    if (response.ok) {
      // 요청이 성공(200~299) 하면
      return response.json()
    } else {
      // 아니면 일단 에러 던지고 보자
      throw new HTTPError(`Response: ${response.statusText}`)
    }
  })
  .then(json => doSomething(json))
  .catch(error => handleError(error))
// async/await
const fetchPosts = async () => {
  try {
    const response = await fetch('/api/posts')
    if (response.ok) {
      const posts = await response.json()
      doSomething(posts)
    } else {
      throw new HTTPError(`Response: ${response.statusText}`)
    }
  } catch (e) {
    handleError(e)
  }
}

 

 

typescript 사용시 공통된 에러 객체를 만들어 처리해준다. 

 

interface HTTPResponse<T> {
  isError: boolean
  errorData?: {
    message: string
    statusCode: number
  }
  data?: T
}
// API 서버에서 ok에 해당하는 응답이 아닐 경우
// 응답값에 에러에 대한 정보를 보내주기로 했다고 가정합니다.
const fetchPosts: () => Promise<HTTPResponse<{ posts: any[] }>> = async () => {
  try {
    const response = await fetch('/api/posts')
    if (response.ok) {
      const posts = await response.json()
      return {
        isError: false,
        data: posts,
      }
    } else {
      const errorData = await response.json()
      return {
        isError: true,
        errorData: {
          message: errorData.message,
          statusCode: response.status,
        },
      }
    }
  } catch (e) {
    return {
      isError: true,
      errorData: {
        message: e.message, // 아니면 'Unknown Error' 같은 문자열을 쓸 수도
        statusCode: e.statusCode, // statusCode가 없을 수도 있겠죠
      },
    }
  }
}
// 받아 쓰는 쪽에서는
async function showPosts() {
  const fetchPostsResult = await fetchPosts()
  if (fetchPostsResult.isError) {
    // Handle Error
    handleError(fetchPostResult.errorData)
  } else {
    // Show posts
  }
}

 

 

 

출처

 

https://tecoble.techcourse.co.kr/post/2021-08-13-react-error-handling/

 

react에서의 에러 처리

tecoble.techcourse.co.kr

 

https://rinae.dev/posts/how-to-handle-errors-1

 

에러 처리를 어떻게 하면 좋을까? - 1

에러 처리를 일관된 형태로 하기 위한 고민 이야기, 첫 번째

rinae.dev

 

'Development > React.js' 카테고리의 다른 글

제어 컴포넌트와 비제어 컴포넌트  (0) 2022.03.15
리엑트 입력 폼 다루기  (0) 2022.03.15
조건부 렌더링  (0) 2022.03.15
브라우저에서 리엑트가 실행되는 과정  (0) 2022.03.14
Props 와 Children  (0) 2022.03.14