Skip to main content

개요

Laravel 프로젝트를 생성하면 오류와 예외 처리는 미리 설정된 상태로 준비되어 있습니다. 커스터마이징은 bootstrap/app.phpwithExceptions 메서드에서 수행합니다.

예외 처리 흐름

예외가 발생하고 클라이언트에게 응답이 돌아갈 때까지의 흐름을 나타냅니다.
withExceptions 클로저에 전달되는 $exceptions 객체는 Illuminate\Foundation\Configuration\Exceptions의 인스턴스로, 애플리케이션 전체의 예외 핸들링을 관리합니다.

디버그 설정

config/app.phpdebug 옵션이 오류 정보 표시량을 제어합니다. 기본적으로는 .envAPP_DEBUG 환경 변수 값이 사용됩니다.
프로덕션 환경에서는 APP_DEBUG를 반드시 false로 설정하세요. true 상태로 두면 기밀 정보가 최종 사용자에게 노출될 위험이 있습니다.

예외 리포팅

예외 리포팅이란 예외를 로그에 기록하거나 Laravel Nightwatch, Sentry, Flare 등의 외부 서비스에 전송하는 처리입니다. 기본적으로는 config/logging.php의 설정에 기반하여 로그에 기록됩니다.

커스텀 리포트 콜백

예외 종류에 따라 다른 리포트 처리를 하고 싶다면 report 메서드에 클로저를 전달합니다. Laravel은 클로저의 타입 힌트에서 예외 종류를 판단합니다.
커스텀 콜백을 등록해도 기본 로그 기록은 계속됩니다. 기본으로의 전파를 멈추려면 stop()을 호출하거나 false를 반환합니다.

report() 헬퍼

에러 페이지를 표시하지 않고 예외만 리포트하고 싶다면 report() 헬퍼를 사용합니다.
report() 헬퍼는 사용자에 대한 응답을 중단하지 않고 오류를 기록할 수 있습니다. 백그라운드 잡이나 중요하지 않은 처리의 예외 처리에 편리합니다.

중복 리포트 방지

같은 예외 인스턴스가 여러 번 report()에 전달되면 로그에 중복 엔트리가 만들어질 수 있습니다. dontReportDuplicates()를 설정하면 같은 인스턴스는 최초 1회만 기록됩니다.

전역 로그 컨텍스트

모든 예외 로그에 공통 정보를 부여하고 싶다면 context 메서드를 사용합니다. 가능하다면 현재 사용자 ID는 자동으로 부여됩니다.

예외 클래스에 context() 메서드 추가

예외 클래스 자신에 context() 메서드를 정의하면, 그 예외에 고유한 컨텍스트 정보를 로그에 포함할 수 있습니다.

로그 레벨 변경

특정 예외를 특정 로그 레벨로 기록하고 싶다면 level 메서드를 사용합니다.

예외 리포트 스로틀링

대량의 예외가 발생하는 경우, throttle 메서드로 리포트 수를 제어할 수 있습니다.
1분당 건수로 제한하고 싶다면 Limit을 사용합니다.

예외 렌더링

렌더링이란 예외를 HTTP 응답으로 변환하는 처리입니다. 기본적으로는 Laravel이 자동으로 적절한 응답을 생성하지만, 커스터마이징도 가능합니다.

커스텀 렌더링 콜백

render 메서드에 클로저를 전달하여 예외를 응답으로 변환합니다.
내장된 예외(NotFoundHttpException 등)의 렌더링도 덮어쓸 수 있습니다. 클로저가 값을 반환하지 않는 경우 기본 렌더링이 사용됩니다.

JSON / HTML 자동 판정

Laravel은 요청의 Accept 헤더에 기반하여 HTML과 JSON 중 어느 것으로 반환할지 자동 판정합니다. 이 판정 로직을 커스터마이징하고 싶다면 shouldRenderJsonWhen을 사용합니다.

응답 전체 커스터마이징

respond 메서드를 사용하면 생성된 응답을 추가로 가공할 수 있습니다.

커스텀 예외 클래스

app/Exceptions/ 디렉터리에 자체 예외 클래스를 만들 수 있습니다. report() 메서드와 render() 메서드를 정의하면 bootstrap/app.php에 설정을 작성하지 않아도 자동으로 호출됩니다.

예외 클래스 작성

1

예외 클래스 작성

2

report()와 render() 구현

report() 메서드에는 타입 힌트로 의존성 주입을 사용할 수 있습니다. Laravel의 서비스 컨테이너가 자동으로 해결합니다.

ShouldntReport 인터페이스

리포트가 필요 없는 예외에는 ShouldntReport 인터페이스를 구현합니다. 이 인터페이스를 구현한 예외는 일절 리포트되지 않습니다.

예외 던지기

abort() 헬퍼

애플리케이션의 어디에서든 HTTP 에러 응답을 발생시킬 수 있습니다.

abort_if() / abort_unless()

조건부로 예외를 던지는 헬퍼입니다.
컨트롤러나 미들웨어에서 권한 검사를 할 때 편리합니다. 게이트나 정책과 조합하여 사용되는 경우도 많습니다.

예외의 전역 제어

특정 예외 무시하기

리포트하지 않을 예외를 dontReport로 지정합니다. 렌더링의 커스텀 로직은 계속 기능합니다.
조건부로 무시하고 싶다면 dontReportWhen에 클로저를 전달합니다.
Laravel은 기본적으로 404 오류나 CSRF 토큰 부정(419), 오리진 불일치(403) 등 일부 예외를 자동으로 무시하고 있습니다.

Laravel이 무시하고 있는 예외 활성화

기본으로 무시되는 예외를 리포트 대상으로 되돌리려면 stopIgnoring을 사용합니다.

HTTP 에러 페이지

Laravel에서는 HTTP 상태 코드별로 커스텀 에러 뷰를 정의할 수 있습니다.

커스텀 에러 뷰 작성

resources/views/errors/ 디렉터리에 상태 코드를 파일명으로 한 Blade 템플릿을 작성합니다.
뷰 안에서는 $exception 변수를 사용하여 에러 정보에 접근할 수 있습니다.

기본 에러 템플릿 배포

Laravel 표준 에러 페이지를 커스터마이징의 출발점으로 사용하고 싶다면 vendor:publish로 가져옵니다.

폴백 에러 페이지

특정 상태 코드에 대응하는 뷰가 없을 경우의 폴백으로, 4xx.blade.php5xx.blade.php를 만들 수 있습니다.
404, 500, 503에 대해서는 Laravel이 기본 에러 페이지를 준비합니다. 이것들을 커스터마이징하려면 폴백이 아니라 개별 파일(404.blade.php 등)을 만드세요.

실전 예: API 예외 핸들러

API를 제공하는 애플리케이션에서는 예외를 항상 JSON으로 반환해야 합니다. 다음은 bootstrap/app.php에서 API 에러를 일원 관리하는 구현 예입니다.

커스텀 API 예외 클래스 구현

API 전용 기본 예외 클래스를 만들면, 각 엔드포인트에서 통일된 에러 응답을 반환할 수 있습니다.
컨트롤러에서의 사용 예입니다.

정리

  • resources/views/errors/404.blade.php 등의 파일을 만드는 것만으로 자동으로 사용됨
  • $exception 변수로 에러의 상세에 접근 가능
  • php artisan vendor:publish --tag=laravel-errors로 기본 템플릿 취득 가능
  • 4xx.blade.php / 5xx.blade.php로 폴백 페이지 정의 가능
  • APP_DEBUG=false를 반드시 설정하고 스택 트레이스를 사용자에게 보이지 않기
  • Sentry나 Flare 등의 외부 에러 추적 서비스와 연동하여 에러를 일원 관리
  • throttle()을 사용하여 대량의 예외가 발생했을 때의 로그 넘침 방지
  • API 엔드포인트에서는 일관된 JSON 에러 응답 형식 유지
마지막 수정일 2026년 8월 2일