๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Side project

[์‚ฝ์งˆ๋กœ๊ทธ] Next.js(Vercel) + Strapi(Heroku) 504 ์—๋Ÿฌ ๋Œ€์ฒ˜

(์ด ๊ธ€์€ 2021๋…„ 7์›” 11์ผ ๊ธฐ์ค€ ๊ธ€์ด๋‹ค.)

์‚ฝ์งˆ์š”์•ฝ๐Ÿ‘จ‍๐Ÿ”ง

์Šคํƒ: Next.js(Vercel) + Strapi - Postgres(Heroku) 
์ฆ์ƒ: ์ดˆ๊ธฐ ์ ‘๊ทผ์‹œ 504 ์—๋Ÿฌ๊ฐ€ ๋œธ. (Serverless Function Timeout)
๋Œ€์ฒ˜: ๋งค๋ฒˆ ์„œ๋ฒ„์— ์š”์ฒญํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” getServerSideProps์—์„œ getStaticProps๋กœ ๋ณ€๊ฒฝ ํ›„ revalidate ์„ค์ •. 
(์—๋Ÿฌ์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€์ฒ˜ํ•œ ๊ฒƒ์ด๊ธฐ์— ๋Œ€์ฒ˜๋ผ๊ณ  ์ผ๋‹ค.) 

 

์‚ฝ์งˆ๊ตฌ๊ตฌ์ ˆ์ ˆ

์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค๊ฐ€ ํ•œ๋™์•ˆ ๋‹ค๋ฅธ ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ์ง€์ž‘๊ฑฐ๋ฆฌ๋‹ค๋ณด๋‹ˆ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋Š” ์ €์–ด์–ด ๋ฉ€๋ฆฌ ๋ฉ€์–ด์ ธ๋ฒ„๋ ธ๊ณ  ์†๋Œ€๊ธฐ๋„ ๊ท€์ฐฎ์•„์กŒ๋‹ค. ์†”์งํžˆ ๋งํ•˜๋ฉด ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ํ•ด๊ฒฐ์ฑ…์ด ๋ณด์ด์ง€ ์•Š์•„์„œ ๋” ๊ฑด๋“ค๊ธฐ๊ฐ€ ์‹ซ์—ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋„๋ฉ”์ธ๊นŒ์ง€ ์‚ฌ์„œ ๋ถ™์—ฌ๋†จ๋Š”๋ฐ... ์ด๋ ‡๊ฒŒ ๋ฐฉ์น˜ํ•˜๊ธด ์•„๊นŒ์›Œ์„œ ๋‹ค์‹œ ๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. 

์œ„์—์„œ ๋งํ–ˆ๋˜ ๋ฌธ์ œ๋ž€ ์˜ค๋žœ๋งŒ์— ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๋ฉด ์ž๊พธ 504 ์—๋Ÿฌ๋ฅผ ๋ฑ‰์–ด๋‚ด๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์•ฑ ์ž์ฒด์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋Š”๋ฐ Serverless Function์—์„œ ํƒ€์ž„์•„์›ƒ์ด๋ผ๋Š” ์—๋Ÿฌ ๋ฌธ๊ตฌ๋ฅผ ๋ณด์—ฌ์ค€ ๊ฒƒ ๊ฐ™๋‹ค. (์บก์ณํ•ด๋†“์€ ๊ฒƒ์„ ์‚ญ์ œํ–ˆ๋‚˜๋ณด๋‹ค...)
์ฐพ์•„๋ณด๋‹ˆ Vercel Hobby ๋ฒ„์ „์€ ์‘๋‹ต์„ ๋ฐ›๋Š”๋ฐ 10์ดˆ์ด๋‚ด๋กœ ์ œํ•œ์ด ๊ฑธ๋ ค์žˆ๋‹ค. 

๊ตฌ๊ธ€๋ง์„ ์‹œ์ž‘ํ–ˆ๋‹ค. ๋‚˜์™€ ๋น„์Šทํ•œ ์ƒํ™ฉ์„ ๊ฒช๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ช‡๋ช‡ ์žˆ์—ˆ๋‹ค. ๋พฐ์กฑํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์—†์–ด๋ณด์˜€๋Š”๋ฐ.. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ Reddit์˜ ๊ธ€์„ ์ฝ๊ฒŒ ๋˜์—ˆ๋‹ค. 
๋Œ“๊ธ€์— ๋ณด๋‹ˆ heroku๊ฐ€ ์ดˆ๊ธฐ ์‹œ๋™์„ ํ•˜๋Š” ๊ฒฝ์šฐ ์‘๋‹ต์„ ๋ฐ›๊ธฐ๊นŒ์ง€ 10์ดˆ ์ด์ƒ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ค Vercel์ด ์ค‘๋‹จ๋  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๋ง์ด ์žˆ์—ˆ๋‹ค. heroku์˜ ์ดˆ๊ธฐ ์‹œ๋™ ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฌ๋Š”์ง€๋Š” ์ •ํ™•ํžˆ ๋ชจ๋ฅด์ง€๋งŒ ๊ฝค ์ผ๋ฆฌ๊ฐ€ ์žˆ์–ด๋ณด์˜€๋‹ค. ๊ทธ๋ž˜์„œ ๋งค๋ฒˆ ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ๋ฐ›์ง€ ์•Š์•„๋„ ํ™”๋ฉด์—์„œ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก getServerSideProps ๋ฉ”์†Œ๋“œ๋ฅผ getStaticProps์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์„ ๊ฒฝ์šฐ ํŽ˜์ด์ง€๋ฅผ ์žฌ์ƒ์„ฑํ•˜๋„๋ก revalidate ๊ฐ’๋„ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค. 

์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ 504์—๋Ÿฌ๊ฐ€ ๋œจ๋Š” ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ์ด ๋˜์—ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ Chrome lighthouse ์ ์ˆ˜๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ์ดˆ๊ธฐ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋ฉด ๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„์„ ํ•ด๋†“์•˜๋Š”๋ฐ ์œ„์˜ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋งŒ getStaticProps๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ๊ทธ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„์—์„œ ์š”์ฒญํ•˜์—ฌ ๋กœ๋“œํ•˜๋‹ˆ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฌ๊ฒŒ ๋˜์—ˆ๋‹ค...(์ด๋Ÿฌ๋‹ˆ ํƒ€์ž„์•„์›ƒ์ด ๋œจ์ง€...) ๊ทธ๋ž˜๋„ ์šฐ์„  504๋Š” ์•ˆ๋œฌ๋‹ค. ๊ฐœ์„ ํ•ด๋‚˜๊ฐˆ ๋ฐฉ๋ฒ•์„ ๊ณ„์† ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค.

7์›” 12์ผ ์ถ”๊ฐ€ ๋‚ด์šฉ

์ด๋Ÿฌ๋‹ˆ 504๊ฐ€ ๋“ค์ˆ˜๋ฐ–์—.... ๋˜‘๊ฐ™์ด 18๊ฐœ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ cold start์ธ ๊ฒฝ์šฐ ๋ฌด๋ ค 28.97์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค. ์ดํ›„์—๋Š” 233ms๐Ÿ™„ 
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ Strapi๋ฅผ Heroku๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ณณ์— deployํ•˜๊ฑฐ๋‚˜, getStaticProps๋กœ ๋ณ€๊ฒฝํ•ด์„œ ๋นŒ๋“œ ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค. 


๋‹ค๋ฅธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ์•„์‹œ๋Š” ๋ถ„์€ ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!โœ‹