[Next.js] 프로덕션 환경에서 런타임 에러로 인한 무한루프(해결)
2021. 7. 18. 14:43ㆍ공부내용 공유하기
특정 페이지 진입시 무한루프 도는 현상 발생
SWR 에러 아님
Request 결과도 정상
local dev 환경에서는 무한루프 발생하지 않음. build 후 production 에서만 발생
원인 : 채널톡 객체 참조 불가 (채널톡 객체 검증 예외처리 미흡)
기존 채널톡 스크립트 로드를 전역 script에서 특정 페이지 내부로 옮기면서 문제 발생.
-> 예외처리 미흡.
공통 Page 컴포넌트에는 예외처리 되어있었으나, 해당 페이지는 Page컴포넌트를 사용하지 않고 독자적으로 로직 구현되어 있었음.
그로 인해
런타임 환경에서 에러 발생 (스크린샷은 local dev 환경)
GitHub Next.js Issue : _error 페이지가 렌더되지 않고 무한루프에 빠진 케이스
에러 발생 프로세스
- 클라이언트 런타임 에러 발생
- next/client/index.js에 error catch됨
- componentDidCatch 메소드는 renderError function를 호출하는 AppContatiner props.fn 실행
(이 때 걸리는 error boundary component가 있으면 해당 컴포넌트에서 처리. 없으면 상위로 타고 올라감) - dev_mode 에서는 최종적으로 이 renderError function를 Next에 있는 HMR이 핸들링해줌
- production 에서는 _error 페이지를 로드하고 즉시 리렌더링
- 사용자 정의 error 페이지(_error)에서 에러가 발생하면 다시 _error 페이지 렌더링 → 무한루프 진입
결론 : 무한루프 원인은 _error 페이지에 있음
_error page에서 사용되는 toString
status 코드가 undefined. (400, 500처럼 SERVER ERROR HTTP STATUS가 있는게 아닌, 런타임 에러이기 때문)
따라서 undefined에서 toString 호출하며 에러 발생 - > error페이지 무한 리다이렉트 발생.
해결책 : toString 메소드 제거(리터럴 처리) 및 statusCode검증 후 렌더링 로직으로 변경