Express에서 에러 처리하는 방법: 404와 500 에러 등

Express에서 에러 처리하는 방법: 404와 500 에러 등

웹 애플리케이션에서 사용자의 잘못된 요청 또는 서버 내부 오류에 대해 적절히 대응하는 것은 중요합니다. Express에서 제공하는 기능을 이용하여, 이러한 에러 상황을 처리하는 방법에 대해 알아보겠습니다.

대표적인 에러 유형

  • 404 Not Found: 사용자가 요청한 리소스가 서버에 존재하지 않을 때 발생하는 에러입니다. 이는 주로 잘못된 URL 접근으로 인해 발생합니다.
  • 500 Internal Server Error: 서버 내부에 문제가 발생하여 요청을 처리할 수 없을 때 반환되는 에러입니다. 이 에러는 서버 코드의 오류, 서버 자원의 문제 등 다양한 원인으로 발생할 수 있습니다.
  • 403 Forbidden: 사용자가 리소스에 접근할 권한이 없을 때 발생하는 에러입니다. 예를 들어, 인증되지 않은 사용자가 보호된 페이지에 접근하려 할 때 발생할 수 있습니다.
  • 401 Unauthorized: 요청이 인증을 필요로 하지만, 인증이 제공되지 않았거나 실패했을 때 발생하는 에러입니다. 이는 주로 인증 데이터가 부족하거나 잘못된 경우에 발생합니다.

에러 처리 사용 예제

에러 처리 로직은 일반적으로 애플리케이션의 마지막 부분에 위치해야 합니다. 404 에러 처리는 모든 정상적인 라우트 처리 뒤에, 500 에러 처리는 모든 미들웨어와 라우트 처리 뒤에 위치시키는 것이 일반적인 순서입니다. 이렇게 배치함으로써, 애플리케이션은 모든 가능한 에러 상황을 효과적으로 포착하고 처리할 수 있습니다.

  • 404 에러는 요청 받은 경로에 대해 서버가 어떤 내용도 찾을 수 없을 때 발생합니다. Express에서는 모든 라우트 처리 후에 404 에러 처리 미들웨어를 추가함으로써 이를 처리할 수 있습니다.
  • 500 에러는 서버 내부에 문제가 발생했을 때 발생합니다. Express에서는 에러 처리 미들웨어 함수를 정의하여 이를 처리할 수 있습니다. 에러 처리 미들웨어 함수는 4개의 매개변수를 받으며, 이들 중 첫 번째 매개변수는 에러 객체입니다.
const express = require('express');
const path = require('path'); // path 모듈을 불러옵니다. 파일 경로를 쉽게 조작하기 위함입니다.
const app = express();
const port = 3000;

// 'public' 폴더를 정적 파일을 제공하는 디렉토리로 설정합니다.
// 이렇게 설정하면, public 디렉토리 내의 파일들에 웹 브라우저를 통해 직접 접근할 수 있습니다.
app.use(express.static('public'));

app.get('/', (req, res) => {
    // 메인 페이지 접속 시 표시될 메시지입니다.
    res.send('메인 페이지');
});

// 404 Not Found 처리 미들웨어
// 이 미들웨어는 위에서 정의된 라우트들과 일치하지 않는 모든 요청에 대해 작동합니다.
app.use((req, res, next) => {
  // 404 에러 페이지 파일을 클라이언트에게 전송합니다.
  res.status(404).sendFile(path.join(__dirname, '/public/html/err/404.html'));
});

// 에러 처리 미들웨어
// 이 미들웨어는 에러를 처리하고, 적절한 에러 메시지를 클라이언트에게 전송합니다.
app.use((err, req, res, next) => {
  // 에러 로그를 콘솔에 출력합니다.
  console.error(err.stack);

  // 특정 에러 상태 코드(403, 401)에 대한 처리를 합니다.
  if (err.status === 403) {
      return res.status(403).send("403 Forbidden");
  }
  if (err.status === 401) {
      return res.status(401).send("401 Unauthorized");
  }

  // 그 외의 모든 에러에 대해 기본적으로 500 Internal Server Error로 처리합니다.
  const statusCode = err.status || 500;
  res.status(statusCode).send(`${statusCode} Error`);
});

// 서버 시작 로그
app.listen(port, () => {
    console.log(`서버가 http://localhost:${port}에서 실행중입니다.`);
});

위 예제 코드에서는 기본적인 에러 처리 방식을 보여줍니다. 먼저, 사용자가 존재하지 않는 페이지에 접근하려고 할 때 404 에러를 반환하도록 설정합니다. 이후, 서버 내부에서 발생하는 다양한 에러를 catch하여 적절한 에러 메시지를 반환합니다. 특히, 403 Forbidden과 401 Unauthorized와 같은 특정 에러 상황에 대해서는 개별적으로 처리합니다. 그 외의 모든 에러는 500 Internal Server Error로 간주하여 처리합니다.

▼ 잘못된 URL 접근한 경우 404 에러 페이지를 보여줍니다.

잘못된 URL 접근한 경우 404 에러 페이지 화면

이 방식을 통해 Express 애플리케이션에서 발생할 수 있는 다양한 에러 상황에 대해 유연하게 대응할 수 있습니다.

자세한 정보는 Express 공식 문서의 정적 파일 제공에러 처리 섹션에서 확인할 수 있습니다.

관련 이전 게시글

이 글이 도움이 되셨다면 공유 부탁 드립니다.

위로 스크롤