개발자
안녕하세요. RESTAPI를 설계하면서 궁금한 점이 있습니다. 서버에서 유저의 인풋이나 서버 자체의 문제로 Response status가 404 혹은 500 등 여러가지 값으로 설정 됩니다. 이때, 에러메시지는 다들 어떻게 작성하시나요? 가끔 타 API를 보면 ``` { "code": "001", "message": "USER_INPUT_INVALID", } ``` 와 같은 형태 입니다. 에러 메시지를 표준화 하고 싶은데 다들 어떤 기준으로 에러 메시지를 작성하시는지 궁금합니다. 또 React와 같은 프론트 엔드에서 이러한 형태의 에러는 어떻게 처리 하시는지 궁금합니다.
1{
2 "code": "001",
3 "message": "USER_INPUT_INVALID",
4}
답변 2
저도 오류 처리는 코드랑 메세지 정도만 담아주는 편입니다. 프론트에서 더 필요하다고 하는거 있으면 그때가서 도입하는 정도..? 1. 에러 코드 규격 결정 (상태코드, 에러코드, 에러메세지) 2. 에러 코드 규격을 interface로, 구현은 enum으로 헤서 모든 개발자가 똑같은 에러 내용을 보내 줄 수 있도록 하기 3. “예외 발생 시 응답”이라는 관심사를 중앙 집중으로 처리할 수 있는 ExceptionHandler 만들기 (프론트) 3-1. Axios API Interceptor로 에러 핸들링해서, 필요한 로직 적기 (ex: jwt 토큰이 만료되면 로그인 페이지로 라우팅) (서버) 3-2. Controller, Service 등의 layer에서는 에러가 필요할 때, 예외 발생시키고 예외 안에다가 에러 코드만 잘 담아주기
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2023년 09월 13일
REST API 에러 메시지를 작성하는 방법은 다양하며 팀이나 프로젝트의 규칙에 따라 달라집니다. 일반적인 원칙은 일관성, 명확성 및 유용성입니다. 1. **일관성**: 모든 에러 메시지는 비슷한 포맷을 가져야 합니다. 예를 들어, 모든 메시지가 `code`와 `message` 필드를 가지고 있어야 합니다. 2. **명확성**: `code`는 절대로 변하지 않아야 하며 특정 오류에 공유되어서는 안됩니다. 또한 `message`는 사람이 이해할 수 있는 형식이어야 하며, 가능한 경우 충분한 정보를 제공해 문제 해결에 도움이 되어야 합니다. 3. **유용성**: 사용자가 문제를 해결하기 위해 충분한 정보가 담겨있어야 합니다. 프론트엔드에서의 REST API 에러 처리는 요청 상태 코드(status code)와 응답 본문(response body)을 보고 결정합니다. 일반적으로 HTTP 상태 코드 400 범위는 클라이언트 오류를 나타내므로 잘못된 입력 또는 요청 수정을 알립니다. 500 범위의 상태 코드는 서버 쪽 오류를 나타냅니다. React에서는 HTTP 요청 라이브러리인 axios를 많이 사용합니다. axios의 catch 블록에서 error.response를 통해 응답 상태 코드 및 에러 메시지에 접근할 수 있습니다. 이를 기반으로 사용자에게 명확한 오류 메시지를 표시하거나 필요한 조치를 취할 수 있습니다. ```javascript axios.get('/api/some-data-endpoint') .then(response => { /* handle the response */ }) .catch(error => { if (error.response) { console.log(error.response.data); console.log(error.response.status); } else if (error.request) { console.log(error.request); } else { console.log('Error', error.message); } }); ``` 위의 예처럼 특정 에러 코드에 대해 커스텀화된 처리를 추가할 수 있습니다. 대체적으로 프론트엔드에서 REST API 에러를 처리하는 방법은 서버의 응답과 애플리케이션의 UX 요구사항에 따라 달라질 것입니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!