์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์ปจํ ์คํธ๋ฅผ ํ์ํ๊ณ , ๊ฐ๋ ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์์ฒญ ๋ฒ์ ๋ณ์ ๊ด๋ฆฌ ๊ธฐ๋ฒ์ ์ค์ ์ ๋ก๋๋ค. AsyncLocalStorage์ ๊ทธ ํ์ฉ๋ฒ์ ์์๋ณด์ธ์.
JavaScript ๋น๋๊ธฐ ์ปจํ ์คํธ: ์์ฒญ ๋ฒ์ ๋ณ์ ๊ด๋ฆฌ ๋ง์คํฐํ๊ธฐ
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ, ํนํ Node.js์ ๊ฐ์ ํ๊ฒฝ์์ ํต์ฌ์ ์ธ ์์์
๋๋ค. ํ์ง๋ง ๋น๋๊ธฐ ์์
์ ๋ฐ์ ๊ฑธ์ณ ์ปจํ
์คํธ์ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ ํต์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ข
์ข
๋ณต์กํ ์ฝ๋๋ฅผ ์ผ๊ธฐํ๊ณ ๋ฐ์ดํฐ ์์์ ๊ฐ๋ฅ์ฑ์ ๋ดํฌํฉ๋๋ค. ์ด ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์ปจํ
์คํธ ๊ธฐ๋ฅ, ํนํ AsyncLocalStorage์ ์ด์ ์ ๋ง์ถฐ, ๊ฐ๋ ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๊ธฐ ์ํด ์์ฒญ ๋ฒ์ ๋ณ์ ๊ด๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๋จ์ํํ๋์ง ํ๊ตฌํฉ๋๋ค.
๋น๋๊ธฐ ์ปจํ ์คํธ์ ์ด๋ ค์ ์ดํดํ๊ธฐ
๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์์๋ ํจ์ ๋ฒ์ ๋ด์์ ๋ณ์๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๊ฐ๋จํฉ๋๋ค. ๊ฐ ํจ์๋ ๊ณ ์ ํ ์คํ ์ปจํ ์คํธ๋ฅผ ๊ฐ์ง๋ฉฐ, ํด๋น ์ปจํ ์คํธ ๋ด์ ์ ์ธ๋ ๋ณ์๋ ๊ฒฉ๋ฆฌ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋น๋๊ธฐ ์์ ์ ์ ํ์ ์ผ๋ก ์คํ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ณต์ก์ฑ์ ์ผ๊ธฐํฉ๋๋ค. ์ฝ๋ฐฑ, ํ๋ก๋ฏธ์ค, async/await๋ ํน์ ์์ฒญ์ด๋ ์์ ๊ณผ ๊ด๋ จ๋ ๋ณ์๋ฅผ ์ ์งํ๊ณ ์ ๊ทผํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ์๋ก์ด ์คํ ์ปจํ ์คํธ๋ฅผ ๋์ ํฉ๋๋ค.
์์ฒญ ํธ๋ค๋ฌ ์คํ ์ ๋ฐ์ ๊ฑธ์ณ ๊ณ ์ ํ ์์ฒญ ID๋ฅผ ์ถ์ ํด์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ธ์. ์ ์ ํ ๋ฉ์ปค๋์ฆ์ด ์๋ค๋ฉด, ์์ฒญ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ๋ชจ๋ ํจ์์ ์์ฒญ ID๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ ์์กดํ๊ฒ ๋ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฒ๊ฑฐ๋กญ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์ฝ๋๋ฅผ ๊ธด๋ฐํ๊ฒ ๊ฒฐํฉ์ํต๋๋ค.
์ปจํ ์คํธ ์ ํ์ ๋ฌธ์ ์
- ์ฝ๋ ๋ณต์ก์ฑ ์ฆ๊ฐ: ์ฌ๋ฌ ํจ์ ํธ์ถ์ ํตํด ์ปจํ ์คํธ ๋ณ์๋ฅผ ์ ๋ฌํ๋ฉด ์ฝ๋์ ๋ณต์ก์ฑ์ด ํฌ๊ฒ ์ฆ๊ฐํ๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋๋ค.
- ๊ฐํ ๊ฒฐํฉ: ํจ์๋ค์ด ํน์ ์ปจํ ์คํธ ๋ณ์์ ์์กดํ๊ฒ ๋์ด ์ฌ์ฌ์ฉ์ฑ์ด ๋จ์ด์ง๊ณ ํ ์คํธํ๊ธฐ ์ด๋ ค์์ง๋๋ค.
- ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ: ์ปจํ ์คํธ ๋ณ์ ์ ๋ฌ์ ์๊ฑฐ๋ ์๋ชป๋ ๊ฐ์ ์ ๋ฌํ๋ฉด ์์ธกํ ์ ์๋ ๋์๊ณผ ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์ ์ง๋ณด์ ์ค๋ฒํค๋: ์ปจํ ์คํธ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ฝ๋๋ฒ ์ด์ค์ ์ฌ๋ฌ ๋ถ๋ถ์ ์์ ํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ค์ ๋น๋๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ ์ฐ์ํ๊ณ ๊ฒฌ๊ณ ํ ํด๊ฒฐ์ฑ ์ ํ์์ฑ์ ๊ฐ์กฐํฉ๋๋ค.
AsyncLocalStorage ์๊ฐ: ๋น๋๊ธฐ ์ปจํ ์คํธ๋ฅผ ์ํ ํด๊ฒฐ์ฑ
Node.js v14.5.0์ ๋์
๋ AsyncLocalStorage๋ ๋น๋๊ธฐ ์์
์ ์๋ช
์ฃผ๊ธฐ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋ณธ์ง์ ์ผ๋ก ๋น๋๊ธฐ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์ง์๋๋ ์ปจํ
์คํธ๋ฅผ ์์ฑํ์ฌ, ํน์ ์์ฒญ์ด๋ ์์
์ ํนํ๋ ๋ณ์๋ฅผ ๋ช
์์ ์ผ๋ก ์ ๋ฌํ์ง ์๊ณ ๋ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๊ฒ ํด์ค๋๋ค.
AsyncLocalStorage๋ ์คํ ์ปจํ
์คํธ๋ณ๋ก ์๋ํฉ๋๋ค. ๊ฐ ๋น๋๊ธฐ ์์
(์: ์์ฒญ ํธ๋ค๋ฌ)์ ์์ ๋ง์ ๊ฒฉ๋ฆฌ๋ ์ ์ฅ์๋ฅผ ๊ฐ์ง๋๋ค. ์ด๋ฅผ ํตํด ํ ์์ฒญ๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ์์ฒญ์ผ๋ก ์ฐ์ฐํ ์ ์ถ๋๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ๊ฒฉ๋ฆฌ๋ฅผ ์ ์งํฉ๋๋ค.
AsyncLocalStorage ์๋ ๋ฐฉ์
AsyncLocalStorage ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค:
getStore(): ํ์ฌ ์คํ ์ปจํ ์คํธ์ ์ฐ๊ด๋ ํ์ฌ ์ ์ฅ์๋ฅผ ๋ฐํํฉ๋๋ค. ์ ์ฅ์๊ฐ ์์ผ๋ฉดundefined๋ฅผ ๋ฐํํฉ๋๋ค.run(store, callback, ...args): ์ ๊ณต๋callback์ ์๋ก์ด ๋น๋๊ธฐ ์ปจํ ์คํธ ๋ด์์ ์คํํฉ๋๋ค.store์ธ์๋ ์ปจํ ์คํธ์ ์ ์ฅ์๋ฅผ ์ด๊ธฐํํฉ๋๋ค. ์ฝ๋ฐฑ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋ ๋ชจ๋ ๋น๋๊ธฐ ์์ ์ ์ด ์ ์ฅ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.enterWith(store): ์ ๊ณต๋store์ ์ปจํ ์คํธ๋ก ๋ค์ด๊ฐ๋๋ค. ์ด๋ ํน์ ์ฝ๋ ๋ธ๋ก์ ๋ํด ์ปจํ ์คํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ค์ ํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.disable(): AsyncLocalStorage ์ธ์คํด์ค๋ฅผ ๋นํ์ฑํํฉ๋๋ค. ๋นํ์ฑํ ํ ์ ์ฅ์์ ์ ๊ทผํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ ์ฅ์ ์์ฒด๋ ๊ด๋ฆฌํ๋ ค๋ ์ปจํ ์คํธ ๋ณ์๋ฅผ ๋ด๋ ๊ฐ๋จํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด(๋๋ ์ ํํ ๋ชจ๋ ๋ฐ์ดํฐ ํ์ )์ ๋๋ค. ์์ฒญ ID, ์ฌ์ฉ์ ์ ๋ณด ๋๋ ํ์ฌ ์์ ๊ณผ ๊ด๋ จ๋ ๊ธฐํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
AsyncLocalStorage ์ค์ ํ์ฉ ์์
๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์์ ๋ฅผ ํตํด AsyncLocalStorage์ ์ฌ์ฉ๋ฒ์ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
์์ 1: ์น ์๋ฒ์์ ์์ฒญ ID ์ถ์ ํ๊ธฐ
Express.js๋ฅผ ์ฌ์ฉํ๋ Node.js ์น ์๋ฒ๋ฅผ ์๊ฐํด ๋ณด์ธ์. ๋ค์ด์ค๋ ๊ฐ ์์ฒญ์ ๋ํด ๊ณ ์ ํ ์์ฒญ ID๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์ถ์ ํ๊ณ ์ถ์ต๋๋ค. ์ด ID๋ ๋ก๊น , ์ถ์ ๋ฐ ๋๋ฒ๊น ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
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) => {
const requestId = uuidv4();
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('requestId', requestId);
console.log(`ID์ ํจ๊ป ์์ฒญ ์์ : ${requestId}`);
next();
});
});
app.get('/', (req, res) => {
const requestId = asyncLocalStorage.getStore().get('requestId');
console.log(`ID๋ก ์์ฒญ ์ฒ๋ฆฌ ์ค: ${requestId}`);
res.send(`์๋
ํ์ธ์, ์์ฒญ ID: ${requestId}`);
});
app.listen(3000, () => {
console.log('์๋ฒ๊ฐ 3000๋ฒ ํฌํธ์์ ์์ ๋๊ธฐ ์ค์
๋๋ค');
});
์ด ์์ ์์๋:
AsyncLocalStorage์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.- Express ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ด์ค๋ ๊ฐ ์์ฒญ์ ๊ฐ๋ก์ฑ๋๋ค.
- ๋ฏธ๋ค์จ์ด ๋ด์์
uuidv4()๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ ์ ํ ์์ฒญ ID๋ฅผ ์์ฑํฉ๋๋ค. asyncLocalStorage.run()์ ํธ์ถํ์ฌ ์๋ก์ด ๋น๋๊ธฐ ์ปจํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ปจํ ์คํธ ๋ณ์๋ฅผ ๋ด์Map์ผ๋ก ์ ์ฅ์๋ฅผ ์ด๊ธฐํํฉ๋๋ค.run()์ฝ๋ฐฑ ๋ด๋ถ์์asyncLocalStorage.getStore().set('requestId', requestId)๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅ์์requestId๋ฅผ ์ค์ ํฉ๋๋ค.- ๊ทธ๋ฐ ๋ค์
next()๋ฅผ ํธ์ถํ์ฌ ์ ์ด๋ฅผ ๋ค์ ๋ฏธ๋ค์จ์ด๋ ๋ผ์ฐํธ ํธ๋ค๋ฌ๋ก ๋๊น๋๋ค. - ๋ผ์ฐํธ ํธ๋ค๋ฌ(
app.get('/'))์์asyncLocalStorage.getStore().get('requestId')๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅ์์์requestId๋ฅผ ๊ฒ์ํฉ๋๋ค.
์ด์ ์์ฒญ ํธ๋ค๋ฌ ๋ด์์ ์ผ๋ง๋ ๋ง์ ๋น๋๊ธฐ ์์
์ด ํธ๋ฆฌ๊ฑฐ๋๋ ์๊ด์์ด ํญ์ asyncLocalStorage.getStore().get('requestId')๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ ID์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์์ 2: ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ธ๊ฐ
๋ ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ธ๊ฐ ์ ๋ณด ๊ด๋ฆฌ์
๋๋ค. ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๊ณ ์ฌ์ฉ์ ID๋ฅผ ๊ฒ์ํ๋ ๋ฏธ๋ค์จ์ด๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์ธ์. AsyncLocalStorage์ ์ฌ์ฉ์ ID๋ฅผ ์ ์ฅํ์ฌ ํ์ ๋ฏธ๋ค์จ์ด ๋ฐ ๋ผ์ฐํธ ํธ๋ค๋ฌ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
const express = require('express');
const { AsyncLocalStorage } = require('async_hooks');
const app = express();
const asyncLocalStorage = new AsyncLocalStorage();
// ์ธ์ฆ ๋ฏธ๋ค์จ์ด (์์ )
const authenticateUser = (req, res, next) => {
// ์ฌ์ฉ์ ์ธ์ฆ ์๋ฎฌ๋ ์ด์
(์ค์ ๋ก์ง์ผ๋ก ๋์ฒดํ์ธ์)
const userId = req.headers['x-user-id'] || 'guest'; // ํค๋์์ ์ฌ์ฉ์ ID ๊ฐ์ ธ์ค๊ธฐ
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('userId', userId);
console.log(`ID๋ก ์ฌ์ฉ์ ์ธ์ฆ๋จ: ${userId}`);
next();
});
};
app.use(authenticateUser);
app.get('/profile', (req, res) => {
const userId = asyncLocalStorage.getStore().get('userId');
console.log(`์ฌ์ฉ์ ID ํ๋กํ ์ ๊ทผ ์ค: ${userId}`);
res.send(`์ฌ์ฉ์ ID ํ๋กํ: ${userId}`);
});
app.listen(3000, () => {
console.log('์๋ฒ๊ฐ 3000๋ฒ ํฌํธ์์ ์์ ๋๊ธฐ ์ค์
๋๋ค');
});
์ด ์์ ์์ authenticateUser ๋ฏธ๋ค์จ์ด๋ ์ฌ์ฉ์ ID๋ฅผ ๊ฒ์ํ๊ณ (์ฌ๊ธฐ์๋ ํค๋๋ฅผ ์ฝ์ด ์๋ฎฌ๋ ์ด์
) AsyncLocalStorage์ ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด /profile ๋ผ์ฐํธ ํธ๋ค๋ฌ๋ ๋ช
์์ ์ธ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ง ์๊ณ ๋ ์ฌ์ฉ์ ID์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์์ 3: ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ๊ด๋ฆฌ
๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์
๊ณผ ๊ด๋ จ๋ ์๋๋ฆฌ์ค์์ AsyncLocalStorage๋ ํธ๋์ญ์
์ปจํ
์คํธ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋๋ ํธ๋์ญ์
๊ฐ์ฒด๋ฅผ AsyncLocalStorage์ ์ ์ฅํ์ฌ ํน์ ์์ฒญ ๋ด์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ด ๋์ผํ ํธ๋์ญ์
์ ์ฌ์ฉํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.
const express = require('express');
const { AsyncLocalStorage } = require('async_hooks');
const app = express();
const asyncLocalStorage = new AsyncLocalStorage();
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์๋ฎฌ๋ ์ด์
const db = {
query: (sql, callback) => {
const transactionId = asyncLocalStorage.getStore()?.get('transactionId') || 'ํธ๋์ญ์
์์';
console.log(`SQL ์คํ ์ค: ${sql} (ํธ๋์ญ์
: ${transactionId})`);
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์คํ ์๋ฎฌ๋ ์ด์
setTimeout(() => {
callback(null, { success: true });
}, 50);
},
};
// ํธ๋์ญ์
์ ์์ํ๋ ๋ฏธ๋ค์จ์ด
const startTransaction = (req, res, next) => {
const transactionId = Math.random().toString(36).substring(2, 15); // ์์์ ํธ๋์ญ์
ID ์์ฑ
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('transactionId', transactionId);
console.log(`ํธ๋์ญ์
์์: ${transactionId}`);
next();
});
};
app.use(startTransaction);
app.get('/data', (req, res) => {
db.query('SELECT * FROM data', (err, result) => {
if (err) {
return res.status(500).send('๋ฐ์ดํฐ ์กฐํ ์ค๋ฅ');
}
res.send('๋ฐ์ดํฐ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ฒ์ํ์ต๋๋ค');
});
});
app.listen(3000, () => {
console.log('์๋ฒ๊ฐ 3000๋ฒ ํฌํธ์์ ์์ ๋๊ธฐ ์ค์
๋๋ค');
});
์ด ๋จ์ํ๋ ์์ ์์๋:
startTransaction๋ฏธ๋ค์จ์ด๊ฐ ํธ๋์ญ์ ID๋ฅผ ์์ฑํ๊ณAsyncLocalStorage์ ์ ์ฅํฉ๋๋ค.- ์๋ฎฌ๋ ์ด์
๋
db.queryํจ์๋ ์ ์ฅ์์์ ํธ๋์ญ์ ID๋ฅผ ๊ฒ์ํ์ฌ ๋ก๊ทธ์ ๊ธฐ๋กํจ์ผ๋ก์จ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ๋ด์์ ํธ๋์ญ์ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ ์ ์์์ ๋ณด์ฌ์ค๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ๋ฒ ๋ฐ ๊ณ ๋ ค ์ฌํญ
๋ฏธ๋ค์จ์ด์ ์ปจํ ์คํธ ์ ํ
AsyncLocalStorage๋ ๋ฏธ๋ค์จ์ด ์ฒด์ธ์์ ํนํ ์ ์ฉํฉ๋๋ค. ๊ฐ ๋ฏธ๋ค์จ์ด๋ ๊ณต์ ์ปจํ
์คํธ์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ด ๋ณต์กํ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๋ฏธ๋ค์จ์ด ํจ์๊ฐ ์ปจํ
์คํธ๋ฅผ ์ ์ ํ ์ ํํ๋๋ก ์ค๊ณ๋์๋์ง ํ์ธํ์ธ์. asyncLocalStorage.run() ๋๋ asyncLocalStorage.enterWith()๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์
์ ๊ฐ์ธ๊ณ ์ปจํ
์คํธ ํ๋ฆ์ ์ ์งํ์ธ์.
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ์ ๋ฆฌ
AsyncLocalStorage๋ฅผ ์ฌ์ฉํ ๋๋ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ค์ํฉ๋๋ค. ์์ธ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ปจํ
์คํธ์ ๊ด๋ จ๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋๋ก ํ์ธ์. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ฆฌ์์ค๊ฐ ํด์ ๋๋๋ก try...finally ๋ธ๋ก์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ
AsyncLocalStorage๋ ์ปจํ
์คํธ๋ฅผ ๊ด๋ฆฌํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ผ๋์ ๋๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. AsyncLocalStorage๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ํนํ ์ฒ๋ฆฌ๋์ด ๋ง์ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ์ฌ ์ ์ฌ์ ์ธ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ต์ ํํ์ธ์.
AsyncLocalStorage์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ๋ง์ธ์. ํ์ํ ์ปจํ
์คํธ ๋ณ์๋ง ์ ์ฅํ์ธ์. ๋ ํฐ ๊ฐ์ฒด๋ฅผ ์ ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ ๊ฐ์ฒด ์์ฒด ๋์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
AsyncLocalStorage์ ๋์
AsyncLocalStorage๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง ํน์ ์๊ตฌ ์ฌํญ ๋ฐ ํ๋ ์์ํฌ์ ๋ฐ๋ผ ๋น๋๊ธฐ ์ปจํ
์คํธ๋ฅผ ๊ด๋ฆฌํ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ ์์ต๋๋ค.
- ๋ช ์์ ์ปจํ ์คํธ ์ ๋ฌ: ์์์ ์ธ๊ธํ๋ฏ์ด, ์ปจํ ์คํธ ๋ณ์๋ฅผ ํจ์์ ์ธ์๋ก ๋ช ์์ ์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ ๋ ์ฐ์ํ์ง๋ง ๊ธฐ๋ณธ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
- ์ปจํ ์คํธ ๊ฐ์ฒด: ์ ์ฉ ์ปจํ ์คํธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ ๋ฌํ๋ฉด ๊ฐ๋ณ ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ๋ณด๋ค ๊ฐ๋ ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ํ๋ ์์ํฌ๋ณ ์๋ฃจ์ : ๋ง์ ํ๋ ์์ํฌ๊ฐ ์์ฒด ์ปจํ ์คํธ ๊ด๋ฆฌ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, NestJS๋ ์์ฒญ ๋ฒ์ ํ๋ก๋ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ด์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
์ ์ญ ์ปจํ ์คํธ์์ ๋น๋๊ธฐ ์ปจํ ์คํธ๋ก ์์ ํ ๋ ๋ค์์ ๊ณ ๋ คํ์ธ์:
- ์๊ฐ๋: ์ปจํ ์คํธ์์ ๋ ์ง ๋ฐ ์๊ฐ ์ ๋ณด๋ฅผ ๋ค๋ฃฐ ๋ ์๊ฐ๋๋ฅผ ์ ์ํ์ธ์. ๋ชจํธํจ์ ํผํ๊ธฐ ์ํด ํ์์คํฌํ์ ํจ๊ป ์๊ฐ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ์ธ์.
- ์ง์ญํ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ, ์ฝํ ์ธ ๊ฐ ์ฌ๋ฐ๋ฅธ ์ธ์ด๋ก ํ์๋๋๋ก ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ์ปจํ ์คํธ์ ์ ์ฅํ์ธ์.
- ํตํ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ธ์ต ๊ฑฐ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ, ๊ธ์ก์ด ์ฌ๋ฐ๋ฅด๊ฒ ํ์๋๋๋ก ์ฌ์ฉ์์ ํตํ๋ฅผ ์ปจํ ์คํธ์ ์ ์ฅํ์ธ์.
- ๋ฐ์ดํฐ ํ์: ๋ค๋ฅธ ์ง์ญ์์ ์ฌ์ฉ๋๋ ๋ค์ํ ๋ฐ์ดํฐ ํ์์ ์ธ์งํ์ธ์. ์๋ฅผ ๋ค์ด, ๋ ์ง ํ์๊ณผ ์ซ์ ํ์์ ํฌ๊ฒ ๋ค๋ฅผ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
AsyncLocalStorage๋ ๋น๋๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์ ์์ฒญ ๋ฒ์ ๋ณ์๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ์ฐ์ํ ํด๊ฒฐ์ฑ
์ ์ ๊ณตํฉ๋๋ค. ๋น๋๊ธฐ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์ง์์ ์ธ ์ปจํ
์คํธ๋ฅผ ์์ฑํจ์ผ๋ก์จ ์ฝ๋๋ฅผ ๋จ์ํํ๊ณ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ฉฐ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค. ๊ทธ ๊ธฐ๋ฅ๊ณผ ํ๊ณ๋ฅผ ์ดํดํจ์ผ๋ก์จ AsyncLocalStorage๋ฅผ ํ์ฉํ์ฌ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ ์ธ๊ณ์ ์ผ๋ก ์ธ์๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ์ปจํ
์คํธ๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ ๋น๋๊ธฐ ์ฝ๋๋ก ์์
ํ๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์
๋๋ค. AsyncLocalStorage ๋ฐ ๊ธฐํ ์ปจํ
์คํธ ๊ด๋ฆฌ ๊ธฐ์ ์ ๋ฐ์๋ค์ฌ ๋ ๊นจ๋ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์ ๋ขฐํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํ์ธ์.