개요
Laravel 프로젝트를 생성하면 오류와 예외 처리는 미리 설정된 상태로 준비되어 있습니다. 커스터마이징은bootstrap/app.php의 withExceptions 메서드에서 수행합니다.
예외 처리 흐름
예외가 발생하고 클라이언트에게 응답이 돌아갈 때까지의 흐름을 나타냅니다.withExceptions 클로저에 전달되는 $exceptions 객체는 Illuminate\Foundation\Configuration\Exceptions의 인스턴스로, 애플리케이션 전체의 예외 핸들링을 관리합니다.
디버그 설정
config/app.php의 debug 옵션이 오류 정보 표시량을 제어합니다.
기본적으로는 .env의 APP_DEBUG 환경 변수 값이 사용됩니다.
예외 리포팅
예외 리포팅이란 예외를 로그에 기록하거나 Laravel Nightwatch, Sentry, Flare 등의 외부 서비스에 전송하는 처리입니다. 기본적으로는config/logging.php의 설정에 기반하여 로그에 기록됩니다.
커스텀 리포트 콜백
예외 종류에 따라 다른 리포트 처리를 하고 싶다면report 메서드에 클로저를 전달합니다.
Laravel은 클로저의 타입 힌트에서 예외 종류를 판단합니다.
stop()을 호출하거나 false를 반환합니다.
report() 헬퍼
에러 페이지를 표시하지 않고 예외만 리포트하고 싶다면 report() 헬퍼를 사용합니다.
중복 리포트 방지
같은 예외 인스턴스가 여러 번report()에 전달되면 로그에 중복 엔트리가 만들어질 수 있습니다.
dontReportDuplicates()를 설정하면 같은 인스턴스는 최초 1회만 기록됩니다.
전역 로그 컨텍스트
모든 예외 로그에 공통 정보를 부여하고 싶다면context 메서드를 사용합니다.
가능하다면 현재 사용자 ID는 자동으로 부여됩니다.
예외 클래스에 context() 메서드 추가
예외 클래스 자신에 context() 메서드를 정의하면, 그 예외에 고유한 컨텍스트 정보를 로그에 포함할 수 있습니다.
로그 레벨 변경
특정 예외를 특정 로그 레벨로 기록하고 싶다면level 메서드를 사용합니다.
예외 리포트 스로틀링
대량의 예외가 발생하는 경우,throttle 메서드로 리포트 수를 제어할 수 있습니다.
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.php와 5xx.blade.php를 만들 수 있습니다.
실전 예: API 예외 핸들러
API를 제공하는 애플리케이션에서는 예외를 항상 JSON으로 반환해야 합니다. 다음은bootstrap/app.php에서 API 에러를 일원 관리하는 구현 예입니다.
커스텀 API 예외 클래스 구현
API 전용 기본 예외 클래스를 만들면, 각 엔드포인트에서 통일된 에러 응답을 반환할 수 있습니다.정리
예외 리포트 정리
예외 리포트 정리
예외 렌더링 정리
예외 렌더링 정리
HTTP 에러 페이지 정리
HTTP 에러 페이지 정리
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 에러 응답 형식 유지