NextJS로 작업하고 빌드하면 Server Side Rendering을 구현할 수 있다.
요청이 있을 때마다 node가 돌아가는 서버에서 html 파일을 마련해 전달한다.
그러나 빌드시 next export라는 명령어를 쓰면
Server Side Rendering이 필요 없는 정적인(static) html 파일로 뽑아낼 수도 있다.
물론 이 때에는 Server Side Rendering과 관련된 option을 사용하지 못한다.
이 파일을 배포하는 가장 쉬운 방법으로는 vercel에 remote repository를 등록해서 올리는 방법이지만
회사 등에서 AWS를 이용해 배포해야 하는 경우도 있다.
이런 때에는 route 때문에 좀 고생을 하게 되어 기록으로 남긴다.
미리 알고 있어야 할 것들
S3, Route 53, Cloudfront를 이용해서 배포하는 방법은 설명하지 않겠다.
문제 해결 방법
NextJS 프로젝트에서 npm run build && npm run export를 하면 각 route에 해당하는 html 파일들이 생성된다.
https://nextjs.org/docs/advanced-features/static-html-export
이를 S3에 올리고 Cloudfront와 연결하면 잘 접근이 되는 것을 확인할 수 있다.
그러나 주소창을 이용해서 root가 아닌 다른 route로 접근을 하면 잘 안 된다.
만약 error 페이지를 index.html로 설정했다면 주소창 입력으로 다른 route로 접근시 루트로 다 빠지는 모습을 볼 수 있다.
pages/login.jsx를 빌드해서 생긴 login.html 파일을 S3에 올려도
주소창에 /login을 입력시 /login.html을 S3에서 불러오지 못하기 때문에 오류가 발생한다.
stack overflow를 검색해 보니
https://stackoverflow.com/questions/57438566/next-js-export-static-s3-routing-fails-on-page-reload
.html을 떼어 내서 저장하라는 다소 괴상한 해결책을 제시했고
S3에서 .html를 지우고 메타 데이터가 text/html일 때 Cloudfront에서 잘 작동하는 것을 확인했다.
예를 들어 login.html이라면 login 파일이 되고 메타 데이터는 text/html이어야 한다.
S3 상에서 파일의 속성을 보면 확인할 수 있다.
'React > NextJS' 카테고리의 다른 글
NextJS Image 사용 방법 (0) | 2022.09.28 |
---|---|
NextJS에서 SVG 불러오는 방법 (0) | 2021.12.28 |
Netlify를 이용해서 NextJS 앱을 배포할 때 발생하는 문제 해결 방법 (0) | 2021.03.05 |
NextJS의 프리 렌더링(Pre-rendering)에 대해서 (1) | 2021.02.28 |