Node.js에서 API 호출에 대한 오류 처리를 어떻게 하나요?
_____A: Node.js에서 API 호출 시 오류 처리는 주로 다음과 같은 방법으로 수행합니다.
1. 콜백 패턴에서의 오류 처리
- 전통적인 비동기 함수들은 콜백 함수의 첫 번째 인자로 오류 객체를 전달합니다.
- 호출 예:
```js
apiCall(params, (err, result) => {
if (err) {
// 오류 처리
console.error('API 호출 오류:', err);
return;
}
// 정상 처리
console.log('API 결과:', result);
});
```
2. Promise 사용 시 `.catch()`로 오류 처리
- API 호출이 Promise를 반환하는 경우, `.catch()`를 이용해 오류를 잡습니다.
```js
apiCall(params)
.then(result => {
console.log('API 결과:', result);
})
.catch(err => {
console.error('API 호출 오류:', err);
});
```
3. async/await와 try/catch 구문으로 처리
- ES2017부터 도입된 async/await 문법을 사용할 때는 `try/catch`문으로 오류를 처리할 수 있습니다.
```js
async function fetchData() {
try {
const result = await apiCall(params);
console.log('API 결과:', result);
} catch (err) {
console.error('API 호출 오류:', err);
}
}
```
4. HTTP 상태 코드 및 응답 자체의 오류 처리
- API 호출에 성공해도 HTTP 상태 코드가 200이 아닐 때를 오류로 간주할 수 있습니다.
```js
const fetch = require('node-fetch');
async function getData(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (err) {
console.error('Fetch 오류:', err);
}
}
```
5. 네트워크 오류 및 타임아웃 처리
- 네트워크 불안정, 서버 미응답 등 비동기 호출 중 발생할 수 있는 다양한 오류에 대해 타임아웃 설정 및 예외 처리를 합니다.
- 예: `axios`에서 타임아웃 설정과 오류 처리
```js
const axios = require('axios');
axios.get('https://api.example.com/data', { timeout: 5000 })
.then(response => {
console.log(response.data);
})
.catch(error => {
if (error.code === 'ECONNABORTED') {
console.error('요청 시간이 초과되었습니다.');
} else {
console.error('API 호출 오류:', error.message);
}
});
```
6. 전역 예외 처리
- 예상치 못한 오류에 대비해 `process.on('uncaughtException')` 또는 `process.on('unhandledRejection')` 이벤트를 활용해 로그 기록 및 서버 정상 동작 유지에 도움을 줍니다.
```js
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
// 서버 종료 또는 복구 로직
});
```
요약하자면, Node.js에서 API 호출 오류 처리는 호출 방식에 맞게 콜백의 첫 번째 인자, Promise의 `.catch()`, async/await의 `try/catch`를 이용하여 처리하며, HTTP 상태 코드 확인, 네트워크 오류 대비, 전역 예외 처리를 함께 구현하는 것이 안정적인 애플리케이션을 만드는 핵심입니다.
API 호출은 외부 서비스와의 통신을 포함하므로, 다양한 이유로 오류가 발생할 수 있습니다.
이러한 오류를 적절히 처리하지 않으면 애플리케이션의 안정성에 큰 영향을 미칠 수 있습니다.
이 글에서는 Node.js에서 API 호출 시 오류를 처리하는 방법에 대해 자세히 설명하겠습니다.
1. API 호출 방법 Node.js에서 API를 호출하는 방법에는 여러 가지가 있지만, 가장 일반적으로 사용되는 방법은 `axios`, `node-fetch`, 또는 기본 `http`/`https` 모듈을 사용하는 것입니다.
여기서는 `axios`를 예로 들어 설명하겠습니다.
```javascript const axios = require('axios'); async function fetchData(url) { try { const response = await axios.get(url); return response.data; } catch (error) { handleError(error); } } ```
2. 오류 처리의 중요성 API 호출 시 발생할 수 있는 오류는 다음과 같습니다: - 네트워크 오류 : 서버가 다운되었거나 인터넷 연결이 끊어졌을 때 발생합니다.
- HTTP 오류 : 404(찾을 수 없음), 500(서버 오류) 등의 상태 코드가 반환될 수 있습니다.
- 타임아웃 : 서버가 요청을 처리하는 데 너무 오랜 시간이 걸릴 경우 발생합니다.
- 데이터 형식 오류 : 응답 데이터가 예상한 형식이 아닐 때 발생합니다.
이러한 오류를 적절히 처리하지 않으면 애플리케이션이 예기치 않게 종료되거나 사용자에게 불완전한 정보를 제공할 수 있습니다.
3. 오류 처리 방법
3.1. 기본적인 오류 처리 가장 기본적인 오류 처리 방법은 `try-catch` 블록을 사용하는 것입니다.
위의 예제에서 보았듯이, `axios`의 호출을 `try` 블록에 넣고, 오류가 발생하면 `catch` 블록에서 처리합니다.
3.2. 오류 로그 기록 오류가 발생했을 때, 이를 로그로 기록하는 것이 중요합니다.
이를 통해 나중에 문제를 진단하고 해결하는 데 도움이 됩니다.
```javascript function handleError(error) { if (axios.isAxiosError(error)) { console.error('Axios error:', error.message); if (error.response) { // 요청이 이루어졌고, 서버가 상태 코드로 응답했지만 // 요청이 실패했을 경우 console.error('Response data:', error.response.data); console.error('Response status:', error.response.status); } else if (error.request) { // 요청이 이루어졌지만 응답을 받지 못한 경우 console.error('Request data:', error.request); } else { // 오류를 발생시킨 요청 설정 console.error('Error message:', error.message); } } else { console.error('Unexpected error:', error); } } ```
3.3. 사용자에게 오류 메시지 표시 사용자에게 친숙한 오류 메시지를 표시하는 것도 중요합니다.
예를 들어, API 호출이 실패했을 때 사용자에게 "서버와의 통신에 문제가 발생했습니다.
나중에 다시 시도해 주세요.
"와 같은 메시지를 표시할 수 있습니다.
3.4. 재시도 로직 일시적인 네트워크 오류나 서버 오류의 경우, 요청을 재시도하는 로직을 추가할 수 있습니다.
`axios-retry`와 같은 라이브러리를 사용하면 쉽게 구현할 수 있습니다.
```javascript const axiosRetry = require('axios-retry'); axiosRetry(axios, { retries: 3, retryDelay: axiosRetry.exponentialDelay, }); ```
3.5. 사용자 정의 오류 클래스 보다 세부적인 오류 처리를 위해 사용자 정의 오류 클래스를 만들 수 있습니다.
이를 통해 다양한 오류 유형을 구분하고, 각 오류에 대해 적절한 처리를 할 수 있습니다.
```javascript class ApiError extends Error { constructor(message, status) { super(message); this.status = status; } } function handleError(error) { if (axios.isAxiosError(error)) { const status = error.response ? error.response.status : 500; throw new ApiError('API 호출 중 오류 발생', status); } throw new Error('예기치 않은 오류 발생'); } ```
4. Node.js에서 API 호출에 대한 오류 처리는 애플리케이션의 안정성과 사용자 경험을 보장하는 데 매우 중요합니다.
다양한 오류 유형을 이해하고, 이를 적절히 처리하기 위한 방법을 구현함으로써, 더 나은 애플리케이션을 만들 수 있습니다.
오류 로그 기록, 사용자에게 친숙한 메시지 표시, 재시도 로직, 사용자 정의 오류 클래스 등을 활용하여 효과적인 오류 처리 전략을 구축하는 것이 좋습니다.
작성자:
김시현 [비회원]
| 작성일자: 1년 전
2024-09-13 05:21:44
조회수: 215 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 215 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.