SSR ํ๊ฒฝ(Node.js) ๋ฉ๋ชจ๋ฆฌ ๋์ ๋๋ฒ๊น ๊ฐ์ด๋ (1)
SSR ํ๊ฒฝ(Node.js) ๋ฉ๋ชจ๋ฆฌ ๋์ ๋๋ฒ๊น ๊ฐ์ด๋ (1) ๊ด๋ จ
[FEConf2023์์ ๋ฐํํ SSR ํ๊ฒฝ(Node.js) ๋ฉ๋ชจ๋ฆฌ ๋์ ๋๋ฒ๊น ๊ฐ์ด๋][1]๋ฅผ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๋ฐํ ๋ด์ฉ์ 2ํ๋ก ๋๋์ด ๋ฐํํฉ๋๋ค. 1ํ์์๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ํด ์์๋ณด๊ณ , ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ํตํด ํ์ธํด๋ณด๊ฒ ์ต๋๋ค. 2ํ์์๋ ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์์ ์ง์ ๋๋ฒ๊น ํด๋ณด๊ณ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค. ๋ณธ๋ฌธ์ ์ฝ์ ๋ ์ด๋ฏธ์ง์ ์ถ์ฒ๋ ๋ชจ๋ ์ด ์ฝํ ์ธ ์ ๊ฐ์ ์ ๋ชฉ์ ๋ฐํ ์๋ฃ๋ก, ๋ฐ๋ก ์ถ์ฒ๋ฅผ ํ๊ธฐํ์ง ์์์ต๋๋ค. ๋ฐํ ์๋ฃ๋ FEConf2023 ํํ์ด์ง์์ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
์๋ ํ์ธ์. ์ ๋ ํ ์ค ํ๋ ์ด์ค์ ๋ฐ์งํ๋ผ๊ณ ํฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ Node.js๋ก ์คํํ SSR ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์ ๋ ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์๊ฐํ๊ฒ ์ต๋๋ค.
์ฌ๋ฌ๋ถ์ โSSR ํ๊ฒฝ(Node.js) ๋ฉ๋ชจ๋ฆฌ ๋์ ๋๋ฒ๊น ๊ฐ์ด๋"๋ผ๋ ์ ๋ชฉ์์ ์ด๋ค ํค์๋๊ฐ ๊ฐ์ฅ ์ค์ํ๋ค๊ณ ์๊ฐํ์๋์? ์ ๋ 'Node.js'์ '๋ฉ๋ชจ๋ฆฌ ๋์'๋ผ๋ ํค์๋๊ฐ ์ ์ผ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ์ค์์๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ํด ์ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์๊ฐํ๊ฒ ์ต๋๋ค.
์ด๋ ๋ ๋๋ฃ ๋ฐ๋ธ์ต์ค ์์ง๋์ด๊ฐ ์ ์๊ฒ โํน์ ์๋น์ค๊ฐ OOM(out of memory)์ด ๋ฐ์ํ๋๋ฐ ํ์ธํด ์ฃผ์ธ์.โ ๋ผ๊ณ ์๊ธฐ๋ฅผ ํ์ต๋๋ค. ์ด ๋ง์ ๋ฃ๊ณ ์ ๋ ๊ฐ๋จํ๊ฒ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ํด ๊ณ ๋ฏผํ๊ณ ํด๋น ๋ถ๋ถ์ ์์ ํ๋ ค๊ณ ํ์ต๋๋ค. ๋จผ์ ์ฝ๋๋ฅผ ์ด์ด๋ณด๋ ํฐ ๋ฌธ์ ๊ฐ ์์ด ๋ณด์๋๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๊ณ์ ๋ฐ์ํ์ต๋๋ค. ๊ทธ๋ ์ ๋ ์กฐ๊ธ ๋ ๊ณต๋ถ๋ฅผ ํด์ ๋๋ฒ๊น ์ ํตํด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ๊ฒ ๋ค๊ณ ๋ง์๋จน์์ต๋๋ค.
์ด๋ฒ ๊ธ์ ํตํด ๋ ๊ฐ์ง ๋ด์ฉ์ ์ ๋ฌํ๊ณ ์ถ์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋๋ฒ๊น ํ ์ ์๋ ์์ ๊ฐ
- ๋ธ๋ผ์ฐ์ ์ Memory ํญ์ ํตํด ๋ค์ํ ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ฒ์ธ์ ์ฐพ๋ ๋ฒ
์ด๋ฒ ๊ธ์ ํตํด ๊ทธ๋ ๋น์์ ์ ์ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ ๋ถ๋ค์๊ฒ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฌด์์ด๊ณ , ๋ฌด์์ด ๋ฌธ์ ์ธ๊ฐ?
๋ฉ๋ชจ๋ฆฌ ๋์
๋ฉ๋ชจ๋ฆฌ ๋์๋ ์ค์ ๋ก ํ์ํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ์ฐจ์งํ๊ณ ์๋ ํ์์ ๋ปํฉ๋๋ค. ์๋์ ๊ฐ์ด ์๋ฆฌ๋ฒ ์ดํฐ์ ๋น์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์ ์์ด 10๋ช ์ธ ์๋ฆฌ๋ฒ ์ดํฐ๊ฐ ์๊ณ ์ฌ๋์ด 4๋ช ํ๊ณ ์์ต๋๋ค. ์ด 4๋ช ์ ๋ด๋ฆฌ์ง ์๊ณ ๊ณ์ ํ๊ณ ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ฌ๋์ด ํ๊ธฐ๋ ํ๊ณ ๋ด๋ฆฌ๊ธฐ๋ ํ ๊ฒ๋๋ค. ์ฆ, ์ด ์๋ฆฌ๋ฒ ์ดํฐ๋ ์ฌ์ค์ 6๋ช ๋ง ์ด์ฉํ ์ ์๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ ๊ธ๋ฐฉ ์ ์์ด ์ด๊ณผ๋ ๊ฒ์ ๋๋ค. ๋จ์ํ๊ฒ ํํํ๋ฉด ์๋ฆฌ๋ฒ ์ดํฐ๊ฐ ํ๋ค๊ฒ ๋๊ฒ ์ฃ . ์ ์๋ ์์ฃผ ์ด๊ณผํ๊ณ ํญ์ 4๋ช ์ด ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ, ์๋ฆฌ๋ฒ ์ดํฐ๊ฐ ํจ์จ์ ์ผ๋ก ์ดํ๋์ง ๋ชปํ๊ณ ์์ต๋๋ค. ์ด๋ฐ ์ํฉ์ ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ฌธ์ ์
๊ทธ๋ผ ์๋ฆฌ๋ฒ ์ดํฐ๊ฐ ํจ์จ์ ์ผ๋ก ์ดํ๋์ง ์๋๋ค๋ฉด ๋ฌด์์ด ๋ฌธ์ ์ผ๊น์? ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋์ํ๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค.
๋ณดํต GC๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ง๊ธฐ ์ํด ๋ง์ ํ๋์ ํ๋ฉด CPU ์ฌ์ฉ๋๋ ํ์ฐ์ ์ผ๋ก ๋์ด๋ฉ๋๋ค. ๋ํ CPU๋ฅผ ํ๋ฐํ๊ฒ ์ฌ์ฉํ๋ ์์ ์ด ๋ง์์ง๋ฉด ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ธ๋กํน๋ฉ๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฐ์ฐ์์ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ์ ์ฐจ์งํ๊ธฐ ๋๋ฌธ์ ์ด ๊ฒฝ์ฐ ์ฐ์ฐ์ด ๋๋ ค์ง๊ณ ์ฑ๋ฅ์ด ์ ํ ๋๋ ๊ฒ์ ๋๋ค. ์ด๋ก ์ธํด ์คํ ์ค์ด๋ ์๋ฒ๊ฐ ์ข ๋ฃ๋๋ ๋ฌธ์ ๋ฅผ ๊ฒช์ ์๋ ์์ต๋๋ค.
์๋ฒ๊ฐ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋์์ ๋ ๋ค์ ์คํ๋๋๋ก ํด๋์์์ง๋ผ๋, ์ด๋ ๊ฒ ์๋ฒ๊ฐ ์ฃฝ๊ฒ ๋๋ค๋ฉด ์๋ฒ๊ฐ ์ข ๋ฃ๋ ๊ทธ ์๊ฐ์๋ ์ ์์ ์ธ ์๋ฒ์ ์ญํ ์ ํ์ง ๋ชปํ๋ ์ด์๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฆ, ๊ฐ์ฉ์ฑ์ ๋ฌธ์ ๊ฐ ์๊น๋๋ค. ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋ฉด ์ฑ๋ฅ์ด ์ ์ข์์ง๊ณ , ์ดํ๋ฆฌ์ผ์ด์ ์ด ์๊พธ ์ฃฝ๊ฒ ๋ฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
์์ ์๋ฆฌ๋ฒ ์ดํฐ ๋น์ ๋ฅผ ํตํด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. ์ ์์ด 10๋ช ์ธ ์๋ฆฌ๋ฒ ์ดํฐ์ ๋ง์ ์ฌ๋์ด ํ๊ณ ์์ด์ ์๋ฆฌ๋ฒ ์ดํฐ๊ฐ ํ๋ ์ํฉ์ด์๊ธฐ ๋๋ฌธ์ ์ ์์ ๋๋ฆด ์ ์๋๋ก ๋ ํฐ ์๋ฆฌ๋ฒ ์ดํฐ๋ก ๋ฐ๊ฟ์ฃผ๊ฑฐ๋, ์๋ฆฌ๋ฅผ ํญ์ ์ฐจ์งํ๋ 4๋ช ์ ๋ฒ์ธ์ ๋ด๋ณด๋ด๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฆ, ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ ค์ฃผ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ฒ์ธ์ ๋๋ฒ๊น ์ ํตํด ์ฐพ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ
Node.js ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น์? ์๋์ ๊ฐ์ด Node.js๋ฅผ ์คํํ ํฐ๋ฏธ๋์ heap out of memory ๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋๊ณ ์ด ์๋ฌ ๋ฌธ๊ตฌ๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ๋ฐ์๋ค์ด ํญ์ ํฐ๋ฏธ๋์ ๋ณด๊ณ ์์ ์๋ ์์ต๋๋ค. ๋ณดํต ๋ณธ์ธ์ด ์คํํ ์๋ฒ์ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ๋ถ์ฌ ์ด ๋๊ตฌ๋ฅผ ํตํด ์๋ฒ๋ฅผ ๊ด์ฐฐํฉ๋๋ค. ์๋ฒ ๋ชจ๋ํฐ๋ง์ ๊ฒฝ์ฐ, ๋ชจ๋ํฐ๋ง ๋๊ตฌ์ ๊ทธ๋ํ๋ก ํํ๋ CPU ์ฌ์ฉ๋ฅ ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ํ์ ๊ฐ์ ์งํ๋ค์ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํด๋ผ์ด์ธํธ ํ๊ฒฝ์ ๊ฒฝ์ฐ ๋ชจ๋ํฐ๋ง ํด์ ๋ถ์ด๊ธฐ๋ ์ฝ์ง ์์ต๋๋ค. ์ฌ์ฉํ๋ ์ ์ ์ ๋ธ๋ผ์ฐ์ ์ข ๋ฅ๋ ํ๋์จ์ด ์ฑ๋ฅ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ ์์ฒด๋ ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๋ชจ๋ํฐ๋ง ๋๊ตฌ์์ ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์ธํ๊ธฐ
์ด๋ฒ ๋จ๋ฝ์์๋ ์ค์ ์์ค ์ฝ๋๋ฅผ ํตํด ๋ชจ๋ํฐ๋ง ๋๊ตฌ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ผ๋ถ๋ฌ ๋ฐ์์ํค๊ณ ์ด๋ฅผ ๋๋ฒ๊น ํ๋ฉฐ ํด๊ฒฐํด ๋ณผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ๊ธฐ์ตํด ์ฃผ์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
const server = http.createServer((req,res) => {
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write(`
<!DOCTYPE html>
<html lang="en">
<head>
<title>Hello World</title>
</head>
<body>
<h1>Content</h1>
</body>
</html>
`);
res.end();
});
์ ์ฝ๋๋ Node.js๋ก ์์ฑํ ๊ฐ๋จํ ์์ ์ฝ๋์ ๋๋ค. http ์์ฒญ์ ๋ฐ์ผ๋ฉด 200์ด๋ผ๋ ์ํ ์ฝ๋์ ํจ๊ป HTML์ ๋ฆฌํดํ๋ ๊ฐ๋จํ ์ฝ๋์ ๋๋ค. ์ด์ ์ด ์ฝ๋๋ฅผ ํ์ฉํด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๋ ์ฝ๋์ ์๋ ์ฝ๋๋ฅผ ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค.
const server = http.createServer((req,res) => {
if (req.url === '/normal') {
nonMemoryLeakFunction();
}
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write(`
<!DOCTYPE html>
<html lang="en">
<head>
<title>Hello World</title>
</head>
<body>
<h1>Content</h1>
</body>
</html>
`);
res.end();
});
const server = http.createServer((req,res) => {
if (req.url === '/memory-leak') {
memoryLeakFunction();
}
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write(`
<!DOCTYPE html>
<html lang="en">
<head>
<title>Hello World</title>
</head>
<body>
<h1>Content</h1>
</body>
</html>
`);
res.end();
});
If ์กฐ๊ฑด๋ฌธ์ ํ์ฉํ์ฌ ๋ ๊ฐ์ง ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค. ํ์ํ ๋ถ๋ถ ์ธ์๋ ์ฐจ์ด๊ฐ ์๋ ์ฝ๋์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ ์ ์์ฒญ์ ํตํด ์ฝ๊ฐ์ ํธ๋ํฝ์ ์ฃผ๋ ํ๊ฒฝ์ ์๋์ ๊ฐ์ด ์ ์คํฌ๋ฆฝํธ๋ก ๊ฐ๋จํ๊ฒ ๋ง๋ค์์ต๋๋ค.
#!/bin/bash
# ๋ฐ๋ณตํจ์ ์ค์
total_requests=30
# ๋์ URL
url="http://127.0.0.1:3000/normal"
# ๋ฐ๋ณตํด์ ์์ฒญ ๋ณด๋ด๊ธฐ
for ((i=1; i<=$total_requests; i++))
do
curl -s "$url" > /dev/null &
sleep 1 # 1์ด ๋๊ธฐ
done
wait
echo "๋ชจ๋ ์์ฒญ์ด ์๋ฃ๋์์ต๋๋ค."
# ์คํฌ๋ฆฝํธ ์ข
๋ฃ
exit 0
1์ด์ ํ ๋ฒ์ฉ
curl
๋ช ๋ น์ด๋ฅผ ์คํํ ๊ฑฐ์์. SSR + ํธ๋ํฝ์ด ์๊ธฐ๋ ํ๊ฒฝ์ ์์ ๊ท๋ชจ๋ก ์ฌํํ์ด์.
๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๋ ์ฝ๋์์ ํธ์ถํ๋ nonMemoryLeakFunction
์ ๋ณด๊ฒ ์ต๋๋ค. ํจ์์์์ listItems
๋ฐฐ์ด์ ์ ์ธํ๊ณ , ๋ฐ๋ณต๋ฌธ์ด 100๋ง ๋ฒ ๋ฐ๋ณต๋๋ฉด์ ๋ฐฐ์ด์ ์์ดํ
์ ๋ฃ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํจ์๊ฐ ์ฌ์ฉ ์ค์ธ ํ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ์ถ๋ ฅํ๋๋ก ํ์ต๋๋ค. ์ฌ๊ธฐ์ listItems
๋ฐฐ์ด์ด ์ ์ธ๋ ์์น๋ฅผ ์ฃผ๋ชฉํด ์ฃผ์ธ์.
const server = http.createServer((req,res) => {
if (req.url === '/normal') {
nonMemoryLeakFunction();
}
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write(`
<!DOCTYPE html>
<html lang="en">
<head>
<title>Hello World</title>
</head>
<body>
<h1>Content</h1>
</body>
</html>
`);
res.end();
});
function nonMemoryLeakFunction() {
const listItems = [];
for (let i=0; i<1_000_000; ++i) {
listItem.push(i);
}
console.log(`${process.memoryUsage().heapUsed / 1024 / 1024} MB`);
}
์ด๋ฌํ ์ซ์๋ค์ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ํ์ฉํด ํ์ธํ๋ฉด ์๋์ ๊ฐ์ ๊ทธ๋ํ๋ก ํํ๋ ๊ฒ์ ๋๋ค. ํฐ ๋ณ๋ ์์ด ๋น์ทํ ์์น์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ณด์ผ ๊ฒ์ด๊ณ , ์ค๊ฐ์ ๋ฐฐํฌ๋ฅผ ํ๋ค๋ฉด ์ ๊น ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋จ์ด์ง๊ธฐ๋ ํ ๊ฒ์ ๋๋ค. ๋ณธ์ธ์ ์๋น์ค์ ๋ถ์ฌ๋ ๋ชจ๋ํฐ๋ง ํด์ด ์๋์ ๊ฐ์ ๊ทธ๋ํ๋ฅผ ๋ํ๋ด๊ณ ์๋ค๋ฉด ์๋น์ค์ ๋ณ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํด๋ ๋ ๊ฒ์ ๋๋ค.
์ด๋ฒ์๋ ๋์๊ฐ ์๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์์ ์ค๋ช
๋๋ฆฐ listItems
๋ฐฐ์ด์ ์์น๊ฐ ํจ์ ๋ฐ์ ์ ์ธ๋์ด ์์ต๋๋ค. ์ฆ, ์ ์ญ๋ณ์๋ก ์ ์ธ๋์์ต๋๋ค. ๋์น๋ฅผ ์ฑ์
จ๊ฒ ์ง๋ง ์๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ผ์ผํค๊ฒ ๋ค๋ ์๋ฏธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ผํ๊ฒ 100๋ง ๋ฒ์ ๋ฐ๋ณต๋ฌธ์ ์คํ์ํค๊ณ ํจ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ถ๋ ฅํ๋๋ก ํ์ต๋๋ค.
const server = http.createServer((req,res) => {
if (req.url === '/memory-leak') {
memoryLeakFunction();
}
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write(`
<!DOCTYPE html>
<html lang="en">
<head>
<title>Hello World</title>
</head>
<body>
<h1>Content</h1>
</body>
</html>
`);
res.end();
});
const listItems = [];
function memoryLeakFunction() {
for (let i=0; i<1_000_000; ++i) {
listItem.push(i);
}
console.log(`${process.memoryUsage().heapUsed / 1024 / 1024} MB`);
}
๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ํฐ๋ง ํด๋ก ๋ณด๋ฉด ๊ทธ๋ํ๊ฐ ์ด๋ป๊ฒ ๊ทธ๋ ค์ง๊น์? ์ฐ์ํฅ์ ๊ทธ๋ฆฌ๋ฉฐ ์ฌ๋ผ๊ฐ๋ค๊ฐ ์๋ฒ๊ฐ ์ฃฝ์ผ๋ฉด ๊ทธ๋ํ๊ฐ ๋ ๋จ์ด์ง๋ ๋ชจ์์ด ๋ ๊ฒ์ ๋๋ค. ์๋ฒ๊ฐ ์ฃฝ์ ๋ ๋ค์ ์คํ๋๋๋ก ํด๋๋๋ผ๋ ๊ฒฐ๊ตญ์ ๋ค์ ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ์ด ์ฌ๋ผ๊ฐ๋ ํจํด์ ๋ฐ๋ณตํ ๊ฒ์ ๋๋ค.
๋ค์ ๊ธ์์๋ ์์ ํ์ธํ ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์์ ์ง์ ๋๋ฒ๊น ํ๊ณ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
FEConf2023์์ ๋ฐํ๋ 'SSR ํ๊ฒฝ(Node.js) ๋ฉ๋ชจ๋ฆฌ ๋์ ๋๋ฒ๊น ๊ฐ์ด๋'/๋ฐ์งํ ํ ์ค ํ๋ ์ด์ค ํ๋ก ํธ์๋ ์์ง๋์ด โฉ๏ธ