-
NESTJS_예외처리의 중요성과 종류TIL (Today I Learned) 2023. 12. 21. 23:19
# 예외처리의 중요성
Nest.js에서는 예외를 처리하고 사용자에게 적절한 응답을 제공하는 것이 중요합니다. 이를 통해 애플리케이션의 안정성을 유지하고 클라이언트와의 통신을 원활하게 할 수 있습니다. 예외 처리는 사용자 경험뿐만 아니라 시스템의 안정성에도 직접적인 영향을 미칩니다. Nest.js에서는 이를 통해 간편하게 예외를 관리하고 사용자에게 명확한 오류 메시지를 제공할 수 있습니다. 또한 로깅을 통해 발생한 예외를 추적하여 신속하게 대응할 수 있습니다.
# NotFoundException (404 Not Found)
** 사용 시기
요청한 리소스가 서버에 존재하지 않을 때 사용합니다.
** 예시
특정 ID의 사용자 정보가 데이터베이스에 존재하지 않을 때, 시스템은 NotFoundException을 발생시킵니다. 이는 클라이언트가 존재하지 않는 데이터를 요청했을 때, 해당 데이터를 찾을 수 없다는 사실을 명확하게 알리는 데 사용됩니다.
NotFoundException을 클라이언트에게 반환함으로써, 클라이언트는 요청한 ID에 해당하는 데이터가 존재하지 않음을 신속하게 인식합니다. 이는 클라이언트에게 존재하지 않는 데이터에 대한 요청을 재검토하거나, 다른 유효한 ID를 사용하여 데이터를 요청할 수 있도록 안내합니다.
따라서 NotFoundException은 클라이언트에게 적절한 응답을 제공하여 개발자가 데이터를 찾지 못했을 때 어떻게 대응해야 하는지에 대한 정보를 전달합니다.
if (!user) { throw new NotFoundException(`유저 ID ${id}를 찾을 수 없습니다!`); }
# BadRequestException (400 Bad Request)
** 사용 시기
클라이언트가 잘못된 요청을 보낼 때 사용합니다.
** 예시
유효하지 않은 이메일 형식이 제공되었을 때, 시스템은 BadRequestException을 발생시킵니다. 이는 클라이언트가 서버에 잘못된 형식의 이메일을 제공했음을 나타냅니다.
BadRequestException을 클라이언트에게 반환함으로써, 클라이언트는 어떤 부분에서 잘못된 이메일 형식을 제공했는지에 대한 정보를 받게 됩니다. 이는 클라이언트 개발자에게 필요한 수정을 알리고, 올바른 형식의 이메일을 제공해야 한다는 규칙을 강조합니다.
따라서 BadRequestException은 클라이언트의 잘못된 요청을 검출하고, 클라이언트에게 명확한 오류 메시지를 전달하여 개발자가 쉽게 수정할 수 있도록 도와줍니다.
if (!isValidEmail(email)) { throw new BadRequestException('유효하지 않은 이메일입니다.'); }
# UnauthorizedException (401 Unauthorized)
** 사용 시기
인증되지 않은 사용자가 사용 권한이 없는 리소스에 접근하려 할 때 사용합니다.
** 예시
로그인하지 않은 사용자가 보호된 API에 접근하려고 시도할 때, 시스템은 UnauthorizedException을 발생시킵니다. 이는 사용자가 인증되지 않았고, 따라서 보호된 리소스에 접근할 권한이 없음을 나타냅니다.
UnauthorizedException을 클라이언트에게 반환함으로써, 사용자는 로그인이 필요하다는 명확한 메시지를 수신합니다. 이는 사용자에게 보호된 기능을 사용하기 위해서는 인증이 필요하다는 인식을 제공하며, 시스템의 보안성을 유지하는 데에 큰 역할을 합니다.
따라서 UnauthorizedException은 사용자에게 적절한 권한이 부여되지 않았음을 알려주며, 인증되지 않은 사용자가 보호된 리소스에 접근하는 것을 방지하는 데 사용됩니다.
if (!user) { throw new UnauthorizedException('로그인을 해주세요!'); }
# ForbiddenException (403 Forbidden)
** 사용 시기
사용자가 리소스에 접근할 권한이 없을 때 사용합니다.
** 예시
어드민 권한이 없는 사용자가 어드민 기능에 접근하려고 시도할 때, 시스템은 ForbiddenException을 발생시킵니다. 이 예외는 사용자의 권한 부족을 명확하게 알리는 데 사용됩니다. 어드민 기능은 일반적으로 특정 권한이 있는 사용자에게만 허용되므로, 해당 권한이 없는 사용자가 접근하는 것은 허용되지 않습니다.
ForbiddenException을 클라이언트에게 반환함으로써, 클라이언트는 어드민 권한이 필요한 기능에 접근할 때 필요한 권한이 없다는 메시지를 수신합니다. 이는 보안적인 측면에서 중요하며, 권한 부족으로 인한 잠재적인 보안 위험을 방지하는 데 도움이 됩니다.
따라서 ForbiddenException은 사용자에게 적절한 권한이 없다는 것을 알려주며, 시스템의 보안성을 강화하는 데에 활용됩니다.
if (!user.isAdmin) { throw new ForbiddenException('해당 유저는 API 호출 권한이 없습니다!'); }
# ConflictException (409 Conflict)
** 사용 시기
요청이 서버의 현재 상태와 충돌할 때 사용합니다.
** 예시
이미 존재하는 닉네임으로 계정을 생성하려고 할 때, ConflictException을 발생시킵니다. 이 예외는 데이터 충돌을 방지하고자 할 때 주로 활용됩니다. 닉네임은 일반적으로 고유해야 하는데, 이미 사용 중인 닉네임을 다시 사용하려고 하면 데이터 일관성에 위배될 수 있습니다.
ConflictException을 던져 서버는 클라이언트에게 해당 닉네임이 이미 사용 중이라는 메시지를 전달하고, 새로운 계정을 생성하지 않도록 막습니다. 이를 통해 중복된 데이터가 생성되는 것을 방지하고, 시스템의 데이터 일관성을 유지할 수 있습니다.
if (existUser) { throw new ConflictException('이미 해당 닉네임으로 가입한 유저가 있어요!'); }
# RequestTimeoutException (408 Request Timeout)
** 사용 시기
클라이언트의 요청이 지정된 시간 내에 완료되지 않았을 때 사용합니다.
** 예시
사용자의 요청 처리 시간이 지정된 시간을 초과할 경우, RequestTimeoutException을 던집니다. 이는 주로 서버의 부하나 네트워크 지연으로 인한 문제를 나타내는 중요한 신호입니다. 클라이언트의 요청이 타임아웃되면, 서버의 부하나 성능 이슈가 발생한 것으로 간주할 수 있습니다.
RequestTimeoutException을 통해 서버 관리자는 어떤 특정 요청이 문제를 일으키고 있는지를 식별하고, 어떤 부분에서 성능 저하가 발생했는지를 파악할 수 있습니다. 이는 서버의 현재 상태를 모니터링하고, 필요한 조치를 취하여 성능을 최적화하거나 리소스를 확장하는 데에 도움이 됩니다. 따라서 RequestTimeoutException은 서버의 확장성을 높이고 사용자 경험을 향상시키는 데에 핵심적인 역할을 합니다.
if (processTime > 5000) { throw new RequestTimeoutException('응답 시간이 초과되었습니다.'); }
# InternalServerErrorException (500 Internal Server Error)
** 사용 시기
서버 내부에서 예기치 못한 오류가 발생했을 때 사용합니다.
** 예시
데이터베이스 쿼리 중 예상치 못한 오류가 발생할 경우, InternalServerErrorException을 발생시킵니다. 이 예외는 주로 클라이언트의 책임이 아닌 서버 내부의 문제를 나타내며, 신속한 조치가 필요합니다. 서버에서 처리할 수 없는 예기치 못한 오류가 발생했을 때 사용되며, 이는 주로 데이터베이스와의 상호 작용에서 발생한 문제를 가리킬 수 있습니다.
InternalServerErrorException을 통해 서버 관리자는 로그를 상세히 확인하여 어떤 부분에서 오류가 발생했는지를 식별할 수 있습니다. 이러한 로그는 예측할 수 없는 문제를 신속하게 해결하는 데에 도움이 됩니다. 클라이언트에게는 사용자 친화적이지 않은 오류 메시지를 제공하지 않도록 주의해야 합니다. 대신, 일반적인 오류 메시지나 유용한 디버깅 정보를 서버 로그에 기록하고, 사용자에게는 고객 친화적이면서도 보안적으로 안전한 메시지를 제공하는 것이 중요합니다.
try { // 데이터베이스 쿼리 실행 } catch (error) { throw new InternalServerErrorException('서버에 문제가 발생했어요!'); }
예외 처리를 통해 애플리케이션의 안정성을 높이고, 개발자 및 사용자에게 적절한 정보를 전달하여 디버깅과 유지 보수를 용이하게 만들 수 있습니다.
'TIL (Today I Learned)' 카테고리의 다른 글
NestJS_온라인 공연 예매 서비스 프로젝트 1편_기본 세팅 (1) 2023.12.23 #TIL(error)_NestJS 오류 : Delete`CR` (0) 2023.12.22 JavaScript의 한계와 TypeScript의 등장 (1) 2023.12.20 #TIL_백오피스 프로젝트 회고록(음식 배달 서비스) (1) 2023.12.18 # class 대하여!.! 간단정리 (1) 2023.12.17