์ต์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋น๋๊ธฐ ์์ ์ ๋ฐ์ ์ํ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฒ์ ํ๊ตฌํ๋ฉฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์ปจํ ์คํธ์ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ์ฌ์ธต ๋ถ์ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ปจํ ์คํธ: ์์ฒญ ๋ฒ์ ๋ณ์ ์ฌ์ธต ๋ถ์
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ด์์ด๋ฉฐ, ํนํ ๋์ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ๊ฐ์ฅ ์ค์ํ Node.js์ ๊ฐ์ ํ๊ฒฝ์์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ํ์ง๋ง ๋น๋๊ธฐ ์์ ์ ๋ฐ์ ๊ฑธ์ณ ์ํ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๊ธ๋ฐฉ ๋ณต์กํด์ง ์ ์์ต๋๋ค. ๋จ์ผ ์์ฒญ์ ์๋ช ์ฃผ๊ธฐ ๋์ ์ ๊ทผ ๊ฐ๋ฅํ ์์ฒญ ๋ฒ์ ๋ณ์(request-scoped variables)๋ ๊ฐ๋ ฅํ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์ปจํ ์คํธ ๊ฐ๋ ์ ๊น์ด ํ๊ณ ๋ค์ด, ์์ฒญ ๋ฒ์ ๋ณ์์ ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ธฐ๋ฒ์ ์ด์ ์ ๋ง์ถฅ๋๋ค. ๋ค์ดํฐ๋ธ ๋ชจ๋๋ถํฐ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊น์ง ๋ค์ํ ์ ๊ทผ๋ฒ์ ํ์ํ๊ณ , ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ด ๋ ์ค์ฉ์ ์ธ ์์ ์ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์ปจํ ์คํธ ์ดํดํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ์ ๋จ์ผ ์ค๋ ๋ ํน์ฑ์ ์ด๋ฒคํธ ๋ฃจํ์ ๊ฒฐํฉํ์ฌ ๋ ผ๋ธ๋กํน(non-blocking) ์์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ฌํ ๋น๋๊ธฐ์ฑ์ ๋ฐ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ํ์ง๋ง ์ด๋ ์ปจํ ์คํธ ๊ด๋ฆฌ์ ์ด๋ ค์์ ์ผ๊ธฐํ๊ธฐ๋ ํฉ๋๋ค. ๋๊ธฐ ํ๊ฒฝ์์๋ ๋ณ์๊ฐ ์์ฐ์ค๋ฝ๊ฒ ํจ์์ ๋ธ๋ก ๋ด์ ๋ฒ์๊ฐ ์ง์ ๋ฉ๋๋ค. ๋ฐ๋ฉด, ๋น๋๊ธฐ ์์ ์ ์ฌ๋ฌ ํจ์์ ์ด๋ฒคํธ ๋ฃจํ ๋ฐ๋ณต์ ๊ฑธ์ณ ํฉ์ด์ง ์ ์์ด ์ผ๊ด๋ ์คํ ์ปจํ ์คํธ๋ฅผ ์ ์งํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
์ฌ๋ฌ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ๋ ์น ์๋ฒ๋ฅผ ์๊ฐํด๋ณด์ญ์์ค. ๊ฐ ์์ฒญ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด, ๋ก๊น ์ ์ํ ์์ฒญ ID, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ๊ณผ ๊ฐ์ ์์ฒด ๋ฐ์ดํฐ ์ธํธ๊ฐ ํ์ํฉ๋๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฒฉ๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ด ์๋ค๋ฉด ๋ฐ์ดํฐ ์์๊ณผ ์๊ธฐ์น ์์ ๋์์ ์ํ์ด ์์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ์์ฒญ ๋ฒ์ ๋ณ์๊ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
์์ฒญ ๋ฒ์ ๋ณ์๋ ๋ฌด์์ธ๊ฐ?
์์ฒญ ๋ฒ์ ๋ณ์๋ ๋น๋๊ธฐ ์์คํ ๋ด์์ ๋จ์ผ ์์ฒญ ๋๋ ํธ๋์ญ์ ์ ํนํ๋ ๋ณ์์ ๋๋ค. ์ด๋ฅผ ํตํด ํ์ฌ ์์ฒญ์๋ง ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ ๊ทผํ ์ ์์ด ๋์ ์์ ๊ฐ์ ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๊ฐ ๋ค์ด์ค๋ ์์ฒญ์ ๋ถ์ฐฉ๋ ์ ์ฉ ์ ์ฅ ๊ณต๊ฐ์ผ๋ก ์๊ฐํ ์ ์์ผ๋ฉฐ, ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋์ ๋ฐ์ํ๋ ๋น๋๊ธฐ ํธ์ถ ์ ๋ฐ์ ๊ฑธ์ณ ์ ์ง๋ฉ๋๋ค. ์ด๋ ๋น๋๊ธฐ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ์ ์ ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฌ์ฉ์ ์ธ์ฆ: ์ธ์ฆ ํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ์ฌ ์์ฒญ ์๋ช ์ฃผ๊ธฐ ๋ด์ ๋ชจ๋ ํ์ ์์ ์์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
- ๋ก๊น ๋ฐ ํธ๋ ์ด์ฑ์ ์ํ ์์ฒญ ID: ๊ฐ ์์ฒญ์ ๊ณ ์ ID๋ฅผ ํ ๋นํ๊ณ ์์คํ ์ ์ฒด์ ์ ํํ์ฌ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ํธ ์ฐ๊ด์ํค๊ณ ์คํ ๊ฒฝ๋ก๋ฅผ ์ถ์ ํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ: ์์ฒญ๋ณ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ์ฌ ์ ์ ํ ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์ฅํ๊ณ ์ฐ๊ฒฐ ๋์๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ๊ตฌ์ฑ ์ค์ : ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ถ๋ถ์์ ์ ๊ทผํ ์ ์๋ ์์ฒญ๋ณ ๊ตฌ์ฑ ๋๋ ์ค์ ์ ์ ์ฅํฉ๋๋ค.
- ํธ๋์ญ์ ๊ด๋ฆฌ: ๋จ์ผ ์์ฒญ ๋ด์์ ํธ๋์ญ์ ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
์์ฒญ ๋ฒ์ ๋ณ์ ๊ตฌํ ์ ๊ทผ๋ฒ
์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ๊ตฌํํ๋ ๋ฐ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ ๊ทผ๋ฒ์ด ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ฐ ์ ๊ทผ๋ฒ์ ๋ณต์ก์ฑ, ์ฑ๋ฅ, ํธํ์ฑ ์ธก๋ฉด์์ ๊ณ ์ ํ ์ฅ๋จ์ ์ ๊ฐ์ง๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ช ๊ฐ์ง ๊ธฐ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ์๋ ์ปจํ ์คํธ ์ ํ
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ๊ทผ๋ฒ์ ๊ฐ ๋น๋๊ธฐ ํจ์์ ์ปจํ ์คํธ ์ ๋ณด๋ฅผ ์ธ์๋ก ์๋์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. ์ดํดํ๊ธฐ๋ ๊ฐ๋จํ์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ํนํ ๊น๊ฒ ์ค์ฒฉ๋ ๋น๋๊ธฐ ํธ์ถ์์ ๊ธ๋ฐฉ ๋ฒ๊ฑฐ๋กญ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์์ง ์ ์์ต๋๋ค.
์์ :
function handleRequest(req, res) {
const userId = authenticateUser(req);
processData(userId, req, res);
}
function processData(userId, req, res) {
fetchDataFromDatabase(userId, (err, data) => {
if (err) {
return handleError(err, req, res);
}
renderResponse(data, userId, req, res);
});
}
function renderResponse(data, userId, req, res) {
// userId๋ฅผ ์ฌ์ฉํ์ฌ ์๋ต์ ๊ฐ์ธํํฉ๋๋ค
res.end(`Hello, user ${userId}! Data: ${JSON.stringify(data)}`);
}
๋ณด์๋ค์ํผ, `userId`, `req`, `res`๋ฅผ ๊ฐ ํจ์์ ์๋์ผ๋ก ์ ๋ฌํ๊ณ ์์ต๋๋ค. ์ด๋ ๋ ๋ณต์กํ ๋น๋๊ธฐ ํ๋ฆ์์๋ ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ ์ ๋ ์ด๋ ค์์ง๋๋ค.
๋จ์ :
- ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋: ๋ชจ๋ ํจ์์ ์ปจํ ์คํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ๋ฌํ๋ฉด ๋ง์ ์ค๋ณต ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค.
- ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ: ์ปจํ ์คํธ ์ ๋ฌ์ ์๊ธฐ ์ฌ์ ๋ฒ๊ทธ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋ฆฌํฉํ ๋ง์ ์ด๋ ค์: ์ปจํ ์คํธ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ชจ๋ ํจ์ ์๊ทธ๋์ฒ๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
- ๊ฐํ ๊ฒฐํฉ๋: ํจ์๋ค์ด ๋ฐ๋ ํน์ ์ปจํ ์คํธ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋ฉ๋๋ค.
2. AsyncLocalStorage (Node.js v14.5.0 ์ด์)
Node.js๋ ๋น๋๊ธฐ ์์ ์ ๋ฐ์ ๊ฑธ์ณ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ด์ฅ ๋ฉ์ปค๋์ฆ์ผ๋ก `AsyncLocalStorage`๋ฅผ ๋์ ํ์ต๋๋ค. ์ด๋ ๋น๋๊ธฐ ์์ ์ ์๋ช ์ฃผ๊ธฐ ๋์ ์ ๊ทผํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ์ต์ Node.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ถ์ฅ๋๋ ์ ๊ทผ๋ฒ์ ๋๋ค. `AsyncLocalStorage`๋ `run` ๋ฐ `enterWith` ๋ฉ์๋๋ฅผ ํตํด ์๋ํ์ฌ ์ปจํ ์คํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์ :
const { AsyncLocalStorage } = require('async_hooks');
const asyncLocalStorage = new AsyncLocalStorage();
function handleRequest(req, res) {
const requestId = generateRequestId();
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('requestId', requestId);
asyncLocalStorage.getStore().set('request', req);
processData(res);
});
}
function processData(res) {
fetchDataFromDatabase((err, data) => {
if (err) {
return handleError(err, res);
}
renderResponse(data, res);
});
}
function fetchDataFromDatabase(callback) {
const requestId = asyncLocalStorage.getStore().get('requestId');
// ... ๋ก๊น
/ํธ๋ ์ด์ฑ์ ์ํด ์์ฒญ ID๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
setTimeout(() => {
callback(null, { message: 'Data from database' });
}, 100);
}
function renderResponse(data, res) {
const requestId = asyncLocalStorage.getStore().get('requestId');
res.end(`Request ID: ${requestId}, Data: ${JSON.stringify(data)}`);
}
์ด ์์ ์์ `asyncLocalStorage.run`์ ์๋ก์ด ์ปจํ ์คํธ(`Map`์ผ๋ก ํํ๋จ)๋ฅผ ์์ฑํ๊ณ ์ ๊ณต๋ ์ฝ๋ฐฑ์ ํด๋น ์ปจํ ์คํธ ๋ด์์ ์คํํฉ๋๋ค. `requestId`๋ ์ปจํ ์คํธ์ ์ ์ฅ๋๊ณ , `fetchDataFromDatabase`์ `renderResponse`์์ `asyncLocalStorage.getStore().get('requestId')`๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ ์ ์์ต๋๋ค. `req`๋ ๋น์ทํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ต๋ช ํจ์๋ ์ฃผ์ ๋ก์ง์ ๊ฐ์๋๋ค. ์ด ํจ์ ๋ด์ ๋ชจ๋ ๋น๋๊ธฐ ์์ ์ ์๋์ผ๋ก ์ปจํ ์คํธ๋ฅผ ์์๋ฐ๊ฒ ๋ฉ๋๋ค.
์ฅ์ :
- ๋ด์ฅ ๊ธฐ๋ฅ: ์ต์ Node.js ๋ฒ์ ์์๋ ์ธ๋ถ ์์กด์ฑ์ด ํ์ ์์ต๋๋ค.
- ์๋ ์ปจํ ์คํธ ์ ํ: ๋น๋๊ธฐ ์์ ์ ๋ฐ์ ๊ฑธ์ณ ์ปจํ ์คํธ๊ฐ ์๋์ผ๋ก ์ ํ๋ฉ๋๋ค.
- ํ์ ์์ ์ฑ: TypeScript๋ฅผ ์ฌ์ฉํ๋ฉด ์ปจํ ์คํธ ๋ณ์์ ์ ๊ทผํ ๋ ํ์ ์์ ์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ๋ช ํํ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ: ํจ์๊ฐ ์ปจํ ์คํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ธ์ํ ํ์๊ฐ ์์ต๋๋ค.
๋จ์ :
- Node.js v14.5.0 ์ด์ ํ์: ์ด์ ๋ฒ์ ์ Node.js๋ ์ง์๋์ง ์์ต๋๋ค.
- ์ฝ๊ฐ์ ์ฑ๋ฅ ์ค๋ฒํค๋: ์ปจํ ์คํธ ์ค์์นญ๊ณผ ๊ด๋ จ๋ ์ฝ๊ฐ์ ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค.
- ์คํ ๋ฆฌ์ง์ ์๋ ๊ด๋ฆฌ: `run` ๋ฉ์๋๋ ์คํ ๋ฆฌ์ง ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ผ ํ๋ฏ๋ก ๊ฐ ์์ฒญ์ ๋ํด Map ๋๋ ์ ์ฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
3. cls-hooked (์ฐ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง)
`cls-hooked`๋ ์ฐ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง(CLS)๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํ์ฌ ์คํ ์ปจํ ์คํธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ด์ํฌ ์ ์์ต๋๋ค. ์ด๋ ๋ค์ดํฐ๋ธ `AsyncLocalStorage`๊ฐ ๋์ค๊ธฐ ์ ๋ถํฐ ์๋ ๊ฐ Node.js์์ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋์ด ์จ ์ ํ์ง์์ต๋๋ค. ํ์ฌ๋ `AsyncLocalStorage`๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ ํธ๋์ง๋ง, `cls-hooked`๋ ํนํ ๋ ๊ฑฐ์ ์ฝ๋๋ฒ ์ด์ค๋ ์ด์ Node.js ๋ฒ์ ์ ์ง์ํด์ผ ํ ๋ ์ฌ์ ํ ์คํ ๊ฐ๋ฅํ ์ต์ ์ ๋๋ค. ํ์ง๋ง ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค๋ ์ ์ ๋ช ์ฌํด์ผ ํฉ๋๋ค.
์์ :
const cls = require('cls-hooked');
const namespace = cls.createNamespace('my-app');
const { v4: uuidv4 } = require('uuid');
cls.getNamespace = () => namespace;
const express = require('express');
const app = express();
app.use((req, res, next) => {
namespace.run(() => {
const requestId = uuidv4();
namespace.set('requestId', requestId);
namespace.set('request', req);
next();
});
});
app.get('/', (req, res) => {
const requestId = namespace.get('requestId');
console.log(`Request ID: ${requestId}`);
res.send(`Hello, Request ID: ${requestId}`);
});
app.get('/data', (req, res) => {
const requestId = namespace.get('requestId');
setTimeout(() => {
// ๋น๋๊ธฐ ์์
์๋ฎฌ๋ ์ด์
console.log(`Asynchronous operation - Request ID: ${requestId}`);
res.send(`Data, Request ID: ${requestId}`);
}, 500);
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
์ด ์์ ์์ `cls.createNamespace`๋ ์์ฒญ ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ค์์คํ์ด์ค๋ฅผ ์์ฑํฉ๋๋ค. ๋ฏธ๋ค์จ์ด๋ ๊ฐ ์์ฒญ์ `namespace.run`์ผ๋ก ๊ฐ์ธ๊ณ , ์ด๋ ์์ฒญ์ ๋ํ ์ปจํ ์คํธ๋ฅผ ์ค์ ํฉ๋๋ค. `namespace.set`์ ์ปจํ ์คํธ์ `requestId`๋ฅผ ์ ์ฅํ๊ณ , `namespace.get`์ ๋์ค์ ์์ฒญ ํธ๋ค๋ฌ์ ์๋ฎฌ๋ ์ด์ ๋ ๋น๋๊ธฐ ์์ ์ค์ ์ด๋ฅผ ๊ฒ์ํฉ๋๋ค. UUID๋ ๊ณ ์ ํ ์์ฒญ ID๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ฅ์ :
- ๋๋ฆฌ ์ฌ์ฉ๋จ: `cls-hooked`๋ ์๋ ๊ฐ ์ธ๊ธฐ ์๋ ์ ํ์ง์์ผ๋ฉฐ ํฐ ์ปค๋ฎค๋ํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ๊ฐ๋จํ API: API๊ฐ ๋น๊ต์ ์ฌ์ฉํ๊ณ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
- ์ด์ Node.js ๋ฒ์ ์ง์: ์ด์ ๋ฒ์ ์ Node.js์ ํธํ๋ฉ๋๋ค.
๋จ์ :
- ์ฑ๋ฅ ์ค๋ฒํค๋: `cls-hooked`๋ ๋ชฝํค ํจ์นญ(monkey-patching)์ ์์กดํ๋ฏ๋ก ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ด๋ ์ฒ๋ฆฌ๋์ด ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋นํ ์ ์์ต๋๋ค.
- ์ถฉ๋ ๊ฐ๋ฅ์ฑ: ๋ชฝํค ํจ์นญ์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถฉ๋ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
- ์ ์ง๋ณด์ ์ฐ๋ ค: `AsyncLocalStorage`๊ฐ ๋ค์ดํฐ๋ธ ์๋ฃจ์ ์ด๋ฏ๋ก ํฅํ ๊ฐ๋ฐ ๋ฐ ์ ์ง๋ณด์ ๋ ธ๋ ฅ์ ์ฌ๊ธฐ์ ์ง์ค๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
4. Zone.js
Zone.js๋ ๋น๋๊ธฐ ์์ ์ ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์คํ ์ปจํ ์คํธ๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ฃผ๋ก Angular์์ ์ฌ์ฉ๋๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ง๋ง, Node.js์์๋ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ `AsyncLocalStorage`๋ `cls-hooked`์ ๋นํด ๋ ๋ณต์กํ๊ณ ๋ฌด๊ฑฐ์ด ์๋ฃจ์ ์ด๋ฉฐ, ์ด๋ฏธ ์ ํ๋ฆฌ์ผ์ด์ ์์ Zone.js๋ฅผ ์ฌ์ฉํ๊ณ ์์ง ์๋ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์์ต๋๋ค.
์ฅ์ :
- ํฌ๊ด์ ์ธ ์ปจํ ์คํธ: Zone.js๋ ๋งค์ฐ ํฌ๊ด์ ์ธ ์คํ ์ปจํ ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Angular์์ ํตํฉ: Angular ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํํ๊ฒ ํตํฉ๋ฉ๋๋ค.
๋จ์ :
- ๋ณต์ก์ฑ: Zone.js๋ ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฅธ ๋ณต์กํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- ์ฑ๋ฅ ์ค๋ฒํค๋: Zone.js๋ ์๋นํ ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ๊ฐ๋จํ ์์ฒญ ๋ฒ์ ๋ณ์์๋ ๊ณผ๋ํจ: ๊ฐ๋จํ ์์ฒญ ๋ฒ์ ๋ณ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ณผํ ์๋ฃจ์ ์ ๋๋ค.
5. ๋ฏธ๋ค์จ์ด ํจ์
Express.js์ ๊ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ์์ ๋ฏธ๋ค์จ์ด ํจ์๋ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ ๋ผ์ฐํธ ํธ๋ค๋ฌ์ ๋๋ฌํ๊ธฐ ์ ์ ์์ ์ ์ํํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ์ค์ ํ๊ณ ํ์ ๋ฏธ๋ค์จ์ด ๋ฐ ๋ผ์ฐํธ ํธ๋ค๋ฌ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค. ์ด๋ ์ข ์ข `AsyncLocalStorage`์ ๊ฐ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ ์ค ํ๋์ ๊ฒฐํฉ๋ฉ๋๋ค.
์์ (Express ๋ฏธ๋ค์จ์ด์ AsyncLocalStorage ์ฌ์ฉ):
const express = require('express');
const { AsyncLocalStorage } = require('async_hooks');
const { v4: uuidv4 } = require('uuid');
const app = express();
const asyncLocalStorage = new AsyncLocalStorage();
// ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ์ค์ ํ๋ ๋ฏธ๋ค์จ์ด
app.use((req, res, next) => {
asyncLocalStorage.run(new Map(), () => {
const requestId = uuidv4();
asyncLocalStorage.getStore().set('requestId', requestId);
asyncLocalStorage.getStore().set('request', req);
next();
});
});
// ๋ผ์ฐํธ ํธ๋ค๋ฌ
app.get('/', (req, res) => {
const requestId = asyncLocalStorage.getStore().get('requestId');
res.send(`Hello! Request ID: ${requestId}`);
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
์ด ์์ ๋ ์์ฒญ์ด ๋ผ์ฐํธ ํธ๋ค๋ฌ์ ๋๋ฌํ๊ธฐ ์ ์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ์ฌ `AsyncLocalStorage`์ `requestId`๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ผ์ฐํธ ํธ๋ค๋ฌ๋ `AsyncLocalStorage`์์ `requestId`์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ฅ์ :
- ์ค์ ์ง์ค์ ์ปจํ ์คํธ ๊ด๋ฆฌ: ๋ฏธ๋ค์จ์ด ํจ์๋ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ๊ด๋ฆฌํ ์ค์ ์ง์ค์ ์ฅ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๊น๋ํ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ: ๋ผ์ฐํธ ํธ๋ค๋ฌ๊ฐ ์ปจํ ์คํธ ์ค์ ์ ์ง์ ๊ด์ฌํ ํ์๊ฐ ์์ต๋๋ค.
- ํ๋ ์์ํฌ์์ ์ฌ์ด ํตํฉ: ๋ฏธ๋ค์จ์ด ํจ์๋ Express.js์ ๊ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ์ ์ ํตํฉ๋ฉ๋๋ค.
๋จ์ :
- ํ๋ ์์ํฌ ํ์: ์ด ์ ๊ทผ๋ฒ์ ์ฃผ๋ก ๋ฏธ๋ค์จ์ด๋ฅผ ์ง์ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ์ ์ ํฉํฉ๋๋ค.
- ๋ค๋ฅธ ๊ธฐ์ ์ ์์กด: ๋ฏธ๋ค์จ์ด๋ ์ค์ ๋ก ์ปจํ ์คํธ๋ฅผ ์ ์ฅํ๊ณ ์ ํํ๊ธฐ ์ํด ๋ค๋ฅธ ๊ธฐ์ (`AsyncLocalStorage`, `cls-hooked` ๋ฑ) ์ค ํ๋์ ๊ฒฐํฉ๋์ด์ผ ํฉ๋๋ค.
์์ฒญ ๋ฒ์ ๋ณ์ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ์ฌ์ฉํ ๋ ๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฌ๋ฐ๋ฅธ ์ ๊ทผ๋ฒ ์ ํ: Node.js ๋ฒ์ , ์ฑ๋ฅ ์๊ตฌ ์ฌํญ, ๋ณต์ก์ฑ ๋ฑ์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ํ์์ ๊ฐ์ฅ ์ ํฉํ ์ ๊ทผ๋ฒ์ ์ ํํ์ญ์์ค. ์ผ๋ฐ์ ์ผ๋ก `AsyncLocalStorage`๋ ํ์ฌ ์ต์ Node.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ถ์ฅ๋๋ ์๋ฃจ์ ์ ๋๋ค.
- ์ผ๊ด๋ ๋ช ๋ช ๊ท์น ์ฌ์ฉ: ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ์์ฒญ ๋ฒ์ ๋ณ์์ ์ผ๊ด๋ ๋ช ๋ช ๊ท์น์ ์ฌ์ฉํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋ ์์ฒญ ๋ฒ์ ๋ณ์ ์์ `req_`๋ฅผ ๋ถ์ ๋๋ค.
- ์ปจํ ์คํธ ๋ฌธ์ํ: ๊ฐ ์์ฒญ ๋ฒ์ ๋ณ์์ ๋ชฉ์ ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค.
- ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ์ฅํ์ง ์๊ธฐ: ์์ฒญ ์ปจํ ์คํธ์ ์ ์ฅํ๊ธฐ ์ ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๊ฑฐ๋ ๋ง์คํนํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ๋น๋ฐ ์ ๋ณด๋ฅผ ์ง์ ์ ์ฅํ์ง ๋ง์ญ์์ค.
- ์ปจํ ์คํธ ์ ๋ฆฌ: ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ์์ฒญ์ด ์ฒ๋ฆฌ๋ ํ ์ปจํ ์คํธ๋ฅผ ์ ๋ฆฌํด์ผ ํ ์๋ ์์ต๋๋ค. `AsyncLocalStorage`๋ฅผ ์ฌ์ฉํ๋ฉด `run` ์ฝ๋ฐฑ์ด ์๋ฃ๋ ๋ ์ปจํ ์คํธ๊ฐ ์๋์ผ๋ก ์ง์์ง์ง๋ง, `cls-hooked`์ ๊ฐ์ ๋ค๋ฅธ ์ ๊ทผ๋ฒ์์๋ ๋ค์์คํ์ด์ค๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์์ผ ํ ์๋ ์์ต๋๋ค.
- ์ฑ๋ฅ์ ์ ์: ์์ฒญ ๋ฒ์ ๋ณ์ ์ฌ์ฉ์ ์ฑ๋ฅ ์ํฅ์ ์ธ์งํ์ญ์์ค. ํนํ ๋ชฝํค ํจ์นญ์ ์์กดํ๋ `cls-hooked`์ ๊ฐ์ ์ ๊ทผ๋ฒ์์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ ์ ํ ํ ์คํธํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ํด๊ฒฐํ์ญ์์ค.
- ํ์ ์์ ์ฑ์ ์ํด TypeScript ์ฌ์ฉ: TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ํ์ฉํ์ฌ ์์ฒญ ์ปจํ ์คํธ์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ณ ์ปจํ ์คํธ ๋ณ์์ ์ ๊ทผํ ๋ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ์ญ์์ค. ์ด๋ ์ค๋ฅ๋ฅผ ์ค์ด๊ณ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค.
- ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๊ณ ๋ ค: ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํตํฉํ์ฌ ๋ก๊ทธ ๋ฉ์์ง์ ์ปจํ ์คํธ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ํฌํจ์ํค์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์์ฒญ์ ์ถ์ ํ๊ณ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค. Winston์ด๋ Morgan๊ณผ ๊ฐ์ ์ธ๊ธฐ ์๋ ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ปจํ ์คํธ ์ ํ๋ฅผ ์ง์ํฉ๋๋ค.
- ๋ถ์ฐ ํธ๋ ์ด์ฑ์ ์ํ ์๊ด๊ด๊ณ ID ์ฌ์ฉ: ๋ง์ดํฌ๋ก์๋น์ค๋ ๋ถ์ฐ ์์คํ ์ ๋ค๋ฃฐ ๋, ์ฌ๋ฌ ์๋น์ค์ ๊ฑธ์ณ ์์ฒญ์ ์ถ์ ํ๊ธฐ ์ํด ์๊ด๊ด๊ณ ID๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์๊ด๊ด๊ณ ID๋ ์์ฒญ ์ปจํ ์คํธ์ ์ ์ฅ๋๊ณ HTTP ํค๋๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ ํตํด ๋ค๋ฅธ ์๋น์ค๋ก ์ ํ๋ ์ ์์ต๋๋ค.
์ค์ ์ฌ์ฉ ์ฌ๋ก
์์ฒญ ๋ฒ์ ๋ณ์๊ฐ ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ๋ช ๊ฐ์ง ์ค์ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- ์ ์์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ : ์ ์์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ์ํ, ๋ฐฐ์ก ์ฃผ์, ๊ฒฐ์ ๋ฐฉ๋ฒ ๋ฑ ์ฌ์ฉ์์ ์ผํ ์นดํธ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด ์ ๋ณด๋ ์ํ ์นดํ๋ก๊ทธ, ๊ฒฐ์ ํ๋ก์ธ์ค, ์ฃผ๋ฌธ ์ฒ๋ฆฌ ์์คํ ๊ณผ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ถ๋ถ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ : ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ข ์์ก, ๊ฑฐ๋ ๋ด์ญ, ํฌ์ ํฌํธํด๋ฆฌ์ค ๋ฑ ์ฌ์ฉ์์ ๊ณ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด ์ ๋ณด๋ ๊ณ์ ๊ด๋ฆฌ ์์คํ , ๊ฑฐ๋ ํ๋ซํผ, ๋ณด๊ณ ์์คํ ๊ณผ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ถ๋ถ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ์๋ฃ ์ ํ๋ฆฌ์ผ์ด์ : ์๋ฃ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์์ ์๋ฃ ๊ธฐ๋ก, ํ์ฌ ๋ณต์ฉ ์ค์ธ ์ฝ, ์๋ ๋ฅด๊ธฐ ๋ฑ ํ์์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด ์ ๋ณด๋ ์ ์ ๊ฑด๊ฐ ๊ธฐ๋ก(EHR) ์์คํ , ์ฒ๋ฐฉ ์์คํ , ์ง๋จ ์์คํ ๊ณผ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ถ๋ถ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๊ธ๋ก๋ฒ ์ฝํ ์ธ ๊ด๋ฆฌ ์์คํ (CMS): ์ฌ๋ฌ ์ธ์ด๋ก ์ฝํ ์ธ ๋ฅผ ์ฒ๋ฆฌํ๋ CMS๋ ์ฌ์ฉ์๊ฐ ์ ํธํ๋ ์ธ์ด๋ฅผ ์์ฒญ ๋ฒ์ ๋ณ์์ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์์ ์ธ์ ๋์ ์ฌ๋ฐ๋ฅธ ์ธ์ด๋ก ์ฝํ ์ธ ๋ฅผ ์๋์ผ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์์ ์ธ์ด ์ ํธ๋๋ฅผ ์กด์คํ๋ ํ์งํ๋ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
- ๋ฉํฐํ ๋ํธ SaaS ์ ํ๋ฆฌ์ผ์ด์ : ์ฌ๋ฌ ํ ๋ํธ์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ SaaS(Software-as-a-Service) ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ํ ๋ํธ ID๋ฅผ ์์ฒญ ๋ฒ์ ๋ณ์์ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ ํ ๋ํธ์ ๋ฐ์ดํฐ์ ๋ฆฌ์์ค๋ฅผ ๊ฒฉ๋ฆฌํ์ฌ ๋ฐ์ดํฐ ํ๋ผ์ด๋ฒ์์ ๋ณด์์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ด๋ ๋ฉํฐํ ๋ํธ ์ํคํ ์ฒ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
๊ฒฐ๋ก
์์ฒญ ๋ฒ์ ๋ณ์๋ ๋น๋๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ํ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ๋์ ์์ฒญ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒฉ๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํจ์ผ๋ก์จ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ณ , ์ฝ๋ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๋ฉฐ, ๋๋ฒ๊น ์ ๋จ์ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์๋ ์ปจํ ์คํธ ์ ํ๋ ๊ฐ๋ฅํ์ง๋ง, Node.js์ `AsyncLocalStorage`์ ๊ฐ์ ์ต์ ์๋ฃจ์ ์ ๋น๋๊ธฐ ์ปจํ ์คํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ์ ๊ทผ๋ฒ์ ์ ์คํ๊ฒ ์ ํํ๊ณ , ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ๋ก๊น ๋ฐ ํธ๋ ์ด์ฑ ๋๊ตฌ์ ํตํฉํ๋ฉด ๋น๋๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ํ์ง๊ณผ ์ ๋ขฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋น๋๊ธฐ ์ปจํ ์คํธ๋ ํนํ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์ ์ฉํด์ง ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ํ๊ณ๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ๊ฒฌ๊ณ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด์๋ ๋น๋๊ธฐ ์ปจํ ์คํธ ๊ด๋ฆฌ์ ์ต์ ๊ธฐ์ ์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. `AsyncLocalStorage`๋ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ์ํ ๊น๋ํ๊ณ ์ฑ๋ฅ ์ข์ ์๋ฃจ์ ์ ์ ๊ณตํ๋ฉฐ, ์๋ก์ด ํ๋ก์ ํธ์๋ ์ด์ ์ฑํ์ด ์ ๊ทน ๊ถ์ฅ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ `cls-hooked`์ ๊ฐ์ ๋ ๊ฑฐ์ ์๋ฃจ์ ์ ํฌํจํ ๋ค์ํ ์ ๊ทผ๋ฒ์ ์ฅ๋จ์ ์ ์ดํดํ๋ ๊ฒ์ ๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์ง๋ณด์ํ๊ณ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ์ ์ ํ์ฉํ์ฌ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ณต์ก์ฑ์ ๊ธธ๋ค์ด๊ณ , ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๋ ์ ๋ขฐ์ฑ ์๊ณ ํจ์จ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ์ญ์์ค.