๋ฌธ์
Nextjs ๋น๋๋ฅผ ํ๋ค๊ฐ ํ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ์ ์๋ฌ๋ก cd๊ฐ ์ ๋๋ก ๋์๊ฐ์ง ์์๋ค.

#11 167.9 Creating an optimized production build ...
#11 228.7 <w> [webpack.cache.PackFileCacheStrategy] Serializing big strings (253kiB) impacts deserialization performance (consider using Buffer instead and decode when needed)
#11 305.0
#11 305.0 <--- Last few GCs --->
#11 305.0
#11 305.0 [26:0x773a1be6a000] 301008 ms: Mark-Compact (reduce) 457.7 (484.1) -> 447.8 (473.1) MB, pooled: 0 MB, 671.97 / 0.00 ms (+ 0.0 ms in 0 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 690 ms) (average mu = 0.270, curren
#11 305.0
#11 305.0 <--- JS stacktrace --->
#11 305.0
#11 305.0 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
#11 305.0 ----- Native stack trace -----
#11 305.0
#11 ERROR: process "/bin/sh -c yarn build" did not complete successfully: exit code: 129
๋ฌธ์ ๋ถ์ํ๊ธฐ
๋ก๊ทธ๋ฅผ ํ๋ฒ์ฉ ๋ฏ์ด๋ณด์
Serializing big strings (253kiB) impacts deserialization performance- Webpack ์บ์๊ฐ ๋ด๋ถ์ ์ผ๋ก โ253 KiB์ง๋ฆฌ ํฐ ๋ฌธ์์ดโ์ ์ง๋ ฌํํ๋ค๋ ๊ฒฝ๊ณ ์ ๋๋ค.
- ์ด๋ฐ ํฐ ๋ฌธ์์ด์ ๊ณ์ ์ฒ๋ฆฌํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ํฌ๊ฒ ๋๋ค
- ์ด๊ฒ๋ ์์ผ๋ก ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ์ด์ง ์์๊น ์ถ๋ค
- ๋ง์ง๋ง GC ๋ก๊ทธ
Mark-Compact (reduce) 457.7 MB โ 447.8 MB โฆ Ineffective mark-compacts near heap limit- V8(=Node.js ์์ง)์ด โMark-Compactโ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ฐ๋ณตํ์ง๋ง, ํ ์ํ ๊ทผ์ฒ๋ผ์ ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ ๋ชปํ์
- FATAL ERROR: โฆ JavaScript heap out of memory
- Node.js ํ๋ก์ธ์ค๊ฐ ๋ ์ด์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฆด ์ ์์ด์ ๊ฐ์ ์ข ๋ฃ
- Node.js์ ๊ธฐ๋ณธ ํ ํ๋๋ ๋์ฒด๋ก
500MB์ ๋๋ผ์ Webpack์ด ๊ทธ ์ด์์ ์๊ตฌํ๋ฉด ํฐ์ง๋คnode -e 'console.log(v8.getHeapStatistics().heap_size_limit/(1024*1024))'๋ช ๋ น์ด๋ก ํ์ฌ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ํ์ ๋ณผ ์ ์๋ค. (MB๋จ์)
์ด ๋ฌธ์ ๋ ๋จผ์ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ผ๋ง๋ ์ฐ์ด๋ ์ง๋ฅผ ์์์ผ ํ๋ค. ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ์ ํ๊ธฐ๊ฐ ์ฝ์ง ์์ง๋ง, ๋คํํ next 15๋ฒ์ ๋ถํฐ๋ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ผ๋ง๋ ์ฐ์๋์ง ์ถ์ ํ ์ ์๋ ์ปค๋งจ๋ ์ต์ ์ ์ ๊ณตํ๋ค.
next build --experimental-debug-memory-usage
***************************************
Memory usage report at "Finished build":
- RSS: 1640.28 MB
- Heap Used: 659.31 MB
- Heap Total Allocated: 917.22 MB
- Heap Max: 4144.00 MB
- Percentage Heap Used: 15.91%
***************************************
โ Collecting page data
***************************************
Memory usage report at "Finished collecting page data":
- RSS: 54.77 MB
- Heap Used: 652.05 MB
- Heap Total Allocated: 917.22 MB
- Heap Max: 4144.00 MB
- Percentage Heap Used: 15.73%
***************************************
Memory usage report:
- Total time spent in GC: 792.17ms
- Peak heap usage: 659.31 MB
- Peak RSS usage: 1749.19 MB
์คํ ์ํค๋ฉด ์ด๋ฐ ์์ผ๋ก ์ฌ์ฉ๋์ ๋ณผ ์ ์๋ค. ๋ก์ปฌ ๋ด ํ๊ฒฝ์์๋ heap์ ์ด๋ฏธ 4gb์ ๋๋ก ์ค์ ํด๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋จ์ง ์๊ณ ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์์ง๋ง, ๋ด๊ฐ ๋์๋์ ec2 t2.micro์์๋ ์ด๋ฅผ ์ค์ ํด๋์ง ์์ ๋ฌธ์ ๊ฐ ๋์๋ค.
ํน์๋ ์ํธ ์ฐธ์กฐ๊ฐ ์๋์ง๋ ๋ค์ ํ๋์ฉ ํ์ด๋ณด๋ฉด์ ์ฐพ์๋ดค๋๋ฐ, ์ํธ์ฐธ์กฐ๋ ์์๊ธฐ ๋๋ฌธ์ ์ต์ ํ๋ณด๋ค๋ ๋น ๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ง ํด๊ฒฐํ๋ ๊ฒ์ด ์ฐ์ ์ด๊ฒ ๋ค๊ณ ํ๋จํ๋ค.
๋น ๋ฅด๊ฒ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง ์ ๋๊ฐ ์๋ค.
- Node.js ํ๋ฉ๋ชจ๋ฆฌ์ ์ ํ์ ๋๋ฆฌ๊ธฐ
- ๋น๋ ๊ณผ์ ์์ next.js์
experimental๊ธฐ๋ฅ ์ฌ์ฉํ๊ธฐ
1. Node.js ํ๋ฉ๋ชจ๋ฆฌ์ ์ ํ ๋๋ฆฌ๊ธฐ
"scripts": {
"build": "NODE_OPTIONS='--max-old-space-size=4096' next build"
}์ด๋ฐ ์์ผ๋ก ์คํฌ๋ฆฝํธ์ ์ต์ ์ ๋ฌ์๋์ผ๋ฉด Nodejs์ ํ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๋๋ฆด ์ ์๋ค.
Next.js์ experimental ๊ธฐ๋ฅ ์ฌ์ฉํ๊ธฐ
Next.js ๋ํ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ธ์งํ๊ณ ์์๊ณ , ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ด์ฆ๊ฐ ๋์ด๋ ์๋ก ํ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ด์ฆ๊ฐ ์ปค์ง๋ฉด์ ์ด๋ฐ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๋ค.
๋ ์์ธํ ์ค๋ช ์ ์ฌ๊ธฐ ์ ๋ณผ ์ ์๋ค.
WebpackMemoryOptimizations
๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ next.config.ts์์ experimental ์์ฑ ์ค 15๋ฒ์ ๋ถํฐ webpackMemoryOptimizations ์์ฑ์ด ์ถ๊ฐ๋๋ค๋ ๋ถ๋ถ์ด๋ค.
experimental ๊ธฐ๋ฅ์ด๊ธด ํ์ง๋ง, ๋ฐ๋ก low-risk ํ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์ถ๊ฐ๋ก ๋ง๋ถ์ฌ๋์๊ฒ์ ๋ณด๋ฉด ํฌ๊ฒ ๋ฌธ์ ๋ ๋ถ๋ถ์ ๋ง์ด ์๋ ๊ฒ ๊ฐ๋ค.
์ต์
์ ํ์ฑํํ๊ณ ๋น๋ํด๋ณด๋ ์ ๋ง ํฌ๊ฒ ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ค์ด๋ค์ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋๋ถ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ํ์ ๋ฐ๊พธ์ง ์๊ณ ์์ฑ ํ๋ ๋ฐ๊ฟ์ ๋ฌธ์ ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ์กฐ๊ธ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์กฐ๊ธ์ฉ ์ฐ๊ธฐ ์ํด ๋ ์์ ๋จ์๋ก ๋ถํ ํด์ ๋น๋ ์์ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋๋ฐ, ๊ทธ๋งํผ ๋น๋ ์๊ฐ์ ์์นํ๋ค. trade-off๊ฐ ์ฌํ ๊ฒ ๊ฐ์ ์ฌ๋งํ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ง ๊ณณ์ด๋ผ๋ฉด ์ต์ ํ์ ํจ๊ป node.js์ ํ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๋๋ฆฌ๋๊ฒ ์ต์ ์ด์ง ์์๊น..
Webpack Build worker
์นํฉ ๋น๋ ์์ปค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๋์ Node.js ์์ปค ๋ด์์ Webpack ์ปดํ์ผ์ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น๋ ์ค ์ ํ๋ฆฌ์ผ์ด์ ์์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ค์ด๋ค๊ฒ ๋๋ค.
์ ์ ๋ถ์ ์คํตํ๊ธฐ
//next.config.ts
eslint: {
ignoreDuringBuilds: true,
},
typescript: {
ignoreBuildErrors: true,
},๊ฒฐ๊ตญ ์ ์ ๋ถ์ ๋๊ตฌ๋ค๋ ๋ฆฌ์์ค๋ฅผ ์ก์๋จน๋ ์ผ์ด๊ณ , ๋ชจ๋ ํ์ผ๋ค์ ๋ณด๋ฉด์ ๊ท์น์ ์ด๊ธ๋๋์ง ํ๋ํ๋ ํ์ฑํ๊ณ ๋ถ์ํด์ผ ํ๋ค. ์ด๋ฌํ ์ ์ ๋ถ์๋ค์ ๊ฐ๋ฐ ๋ฐ CI ๋จ์์ ๋๋์ผ ํ๋ ๊ฒ์ด๋ผ๊ณ ํ๋จํ์ฌ ๋๋ CI์์ ๋๋ฆฐ ๋ค์์ ๋น๋์์๋ ๋ณ๋์ runner์์ ์คํํ๋๋ก ํด๋จ๋ค.
serverSourceMaps
{
experimental: {
serverSourceMaps:false
}
}์ด๊ฒ๋ experimental ๊ธฐ๋ฅ ์ค ํ๋์ด๋ค.
์์ค ๋งต์ ๋ฒ๋ค๋ JS โ ์๋ณธ ์ฝ๋ ๊ฐ์ ๋งคํ ํ์ผ๋ก, ๋ฒ๋ค๋ js๋ ์ด๋ฆ์ด ๋ฐ๋๋๋ฐ ์ด์ ๋ฐ๋ผ์ ์์ค์ฝ๋๋ฅผ ์ถ์ ํ ์ ์๋ ๋งํผ, ๊ฐ๋ฐ ๊ณผ์ ์์ ์ฐ์ธ๋ค.
ํ์ง๋ง ์ด๋ฌํ ์์ค ๋งต์ ๊ฒฝ์ฐ ํ๋ก๋์
๋น๋๊ฐ ์์ค๋งต์ด ๋์ค๊ฒ ๋๋ค๋ฉด, ๋ณด์์๋ ์ข์ง ์๊ธฐ๋ ํ๊ณ ์ถ๊ฐ์ ์ผ๋ก ๋ฆฌ์์ค ์๋ชจํ๋ ์์
์ด๊ธฐ ๋๋ฌธ์ false ์ฒ๋ฆฌํด๋ ๋น๋ ์ฑ๋ฅ์ ์กฐ๊ธ ์ข์์ง๋ค.
๊ฒฐ๋ก
- ์ฌ๋งํผ ๋ฆฌ์์ค๊ฐ ์ฌ์ฉํ ์ ์๋ ์ ๋๊ฐ ์๋ค๋ฉด Nodejs์ ํ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๋๋ฆฌ์
- ์ด์ง ๋น ๋ฏํ๋ค๋ฉด ์ฐจ๋ผ๋ฆฌ ๋น๋ ์๊ฐ์ ๋๋ฆฌ๋ ๋์
WebpackMemoryOptimizations๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด์ ๋น๋๋ฅผ ์ต์ ํํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ๋ค์ ๋ง์ด ์ฐพ์๋๊ฐ์