JavaScript Async Local Storage(ALS)๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ๋ ฅํ ์ปจํ ์คํธ ๊ด๋ฆฌ๋ฅผ ํ์ํด ๋ณด์ธ์. ์์ฒญ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ถ์ ํ๊ณ , ์ฌ์ฉ์ ์ธ์ ์ ๊ด๋ฆฌํ๋ฉฐ, ๋น๋๊ธฐ ์์ ์ ๋ฐ์ ๊ฑธ์ณ ๋๋ฒ๊น ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ์ธ์.
JavaScript Async Local Storage: ๋น๋๊ธฐ ํ๊ฒฝ์์์ ์ปจํ ์คํธ ๊ด๋ฆฌ ๋ง์คํฐํ๊ธฐ
ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์, ํนํ ์๋ฒ์ฌ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ Node.js์ ์ ์ ๋ ๋ธ๋ผ์ฐ์ ์์, ๊ทผ๊ฐ์ ์ด๋ฃน๋๋ค. ๊ทธ๋ฌ๋ ๋น๋๊ธฐ ์์ ์ ๋ฐ์ ๊ฑธ์ณ ์์ฒญ, ์ฌ์ฉ์ ์ธ์ ๋๋ ํธ๋์ญ์ ๊ณผ ๊ฐ์ ํน์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ปจํ ์คํธ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ํจ์ ํธ์ถ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ํ์ค ๊ธฐ์ ์ ํนํ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฒ๊ฑฐ๋กญ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. ๋ฐ๋ก ์ฌ๊ธฐ์ Async Local Storage(ALS)๊ฐ ๊ฐ๋ ฅํ ํด๊ฒฐ์ฑ ์ผ๋ก ๋ฑ์ฅํฉ๋๋ค.
Async Local Storage(ALS)๋ ๋ฌด์์ธ๊ฐ?
Async Local Storage(ALS)๋ ํน์ ๋น๋๊ธฐ ์์ ์ ๋ก์ปฌ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ค๋ ๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ๊ฐ๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ์ ๋จ์ผ ์ค๋ ๋, ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ๋ง์ถฐ์ ธ ์์ต๋๋ค. ALS๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ํ์ฌ ๋น๋๊ธฐ ์คํ ์ปจํ ์คํธ์ ์ฐ๊ด์ํฌ ์ ์์ด, ๋ช ์์ ์ผ๋ก ์ธ์๋ก ์ ๋ฌํ์ง ์๊ณ ๋ ์ ์ฒด ๋น๋๊ธฐ ํธ์ถ ์ฒด์ธ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ณธ์ง์ ์ผ๋ก ALS๋ ๋์ผํ ์ปจํ ์คํธ ๋ด์์ ์์๋ ๋น๋๊ธฐ ์์ ์ ํตํด ์๋์ผ๋ก ์ ํ๋๋ ์ ์ฅ ๊ณต๊ฐ์ ๋ง๋ญ๋๋ค. ์ด๋ ์ปจํ ์คํธ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ๋น๋๊ธฐ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์ํ๋ฅผ ์ ์งํ๋ ๋ฐ ํ์ํ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ํฌ๊ฒ ์ค์ฌ์ค๋๋ค.
Async Local Storage๋ฅผ ์ฌ์ฉํ๋ ์ด์
ALS๋ ๋น๋๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์ ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ๊ฐ์ํ๋ ์ปจํ ์คํธ ๊ด๋ฆฌ: ์ฌ๋ฌ ํจ์ ํธ์ถ์ ํตํด ์ปจํ ์คํธ ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ํผํ์ฌ ์ฝ๋์ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ๊ฐ๋ ์ฑ์ ํฅ์์ํต๋๋ค.
- ํฅ์๋ ๋๋ฒ๊น : ๋น๋๊ธฐ ํธ์ถ ์คํ ์ ์ฒด์์ ์์ฒญ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ถ์ ํ์ฌ ๋๋ฒ๊น ๋ฐ ๋ฌธ์ ํด๊ฒฐ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
- ๋ณด์ผ๋ฌํ๋ ์ดํธ ๊ฐ์: ์ปจํ ์คํธ๋ฅผ ์๋์ผ๋ก ์ ํํ ํ์๊ฐ ์์ด์ ธ ๋ ๊นจ๋ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ํฅ์: ์ปจํ ์คํธ ์ ํ๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌ๋์ด ์๋ ์ปจํ ์คํธ ์ ๋ฌ๊ณผ ๊ด๋ จ๋ ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ต์ํํฉ๋๋ค.
- ์ค์ํ๋ ์ปจํ ์คํธ ์ ๊ทผ: ์ปจํ ์คํธ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ ๋จ์ผํ๊ณ ์ ์ ์๋ ์์น๋ฅผ ์ ๊ณตํ์ฌ ์ ๊ทผ ๋ฐ ์์ ์ ๋จ์ํํฉ๋๋ค.
Async Local Storage ์ฌ์ฉ ์ฌ๋ก
ALS๋ ๋น๋๊ธฐ ์์ ์ ๋ฐ์ ๊ฑธ์ณ ์์ฒญ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ถ์ ํด์ผ ํ๋ ์๋๋ฆฌ์ค์์ ํนํ ์ ์ฉํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค:
1. ์น ์๋ฒ์์์ ์์ฒญ ์ถ์
์น ์๋ฒ์์ ๊ฐ ๋ค์ด์ค๋ ์์ฒญ์ ๋ณ๋์ ๋น๋๊ธฐ ์ปจํ ์คํธ๋ก ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค. ALS๋ ์์ฒญ ID, ์ฌ์ฉ์ ID, ์ธ์ฆ ํ ํฐ ๋ฐ ๊ธฐํ ๊ด๋ จ ๋ฐ์ดํฐ์ ๊ฐ์ ์์ฒญ๋ณ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฏธ๋ค์จ์ด, ์ปจํธ๋กค๋ฌ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ํฌํจํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ๋ถ๋ถ์์ ์ด ์ ๋ณด์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
์์ (Node.js์ Express):
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(`์์ฒญ ${requestId} ์์๋จ`);
next();
});
});
app.get('/', (req, res) => {
const requestId = asyncLocalStorage.getStore().get('requestId');
console.log(`์์ฒญ ${requestId} ์ฒ๋ฆฌ ์ค`);
res.send(`์๋
ํ์ธ์, ์์ฒญ ID: ${requestId}`);
});
app.listen(3000, () => {
console.log('์๋ฒ๊ฐ 3000๋ฒ ํฌํธ์์ ์์ ๋๊ธฐ ์ค์
๋๋ค');
});
์ด ์์ ์์๋ ๋ค์ด์ค๋ ๊ฐ ์์ฒญ์ ๊ณ ์ ํ ์์ฒญ ID๊ฐ ํ ๋น๋์ด Async Local Storage์ ์ ์ฅ๋ฉ๋๋ค. ์ด ID๋ ์์ฒญ ํธ๋ค๋ฌ์ ์ด๋ ๋ถ๋ถ์์๋ ์ ๊ทผํ ์ ์์ด ์๋ช ์ฃผ๊ธฐ ๋์ ์์ฒญ์ ์ถ์ ํ ์ ์์ต๋๋ค.
2. ์ฌ์ฉ์ ์ธ์ ๊ด๋ฆฌ
ALS๋ ์ฌ์ฉ์ ์ธ์ ์ ๊ด๋ฆฌํ๋ ๋ฐ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์ฌ์ฉ์์ ์ธ์ ๋ฐ์ดํฐ(์: ์ฌ์ฉ์ ID, ์ญํ , ๊ถํ)๋ฅผ ALS์ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ธ์๋ก ์ ๋ฌํ ํ์ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ ๋ถ๋ถ์์๋ ์ฌ์ฉ์์ ์ธ์ ๋ฐ์ดํฐ์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
์์:
const { AsyncLocalStorage } = require('async_hooks');
const asyncLocalStorage = new AsyncLocalStorage();
function authenticateUser(username, password) {
// ์ธ์ฆ ์๋ฎฌ๋ ์ด์
if (username === 'user' && password === 'password') {
const userSession = { userId: 123, username: 'user', roles: ['admin'] };
asyncLocalStorage.run(new Map(), () => {
asyncLocalStorage.getStore().set('userSession', userSession);
console.log('์ฌ์ฉ์ ์ธ์ฆ ์๋ฃ, ์ธ์
์ด ALS์ ์ ์ฅ๋จ');
return true;
});
return true;
} else {
return false;
}
}
function getUserSession() {
return asyncLocalStorage.getStore() ? asyncLocalStorage.getStore().get('userSession') : null;
}
function someAsyncOperation() {
return new Promise(resolve => {
setTimeout(() => {
const userSession = getUserSession();
if (userSession) {
console.log(`๋น๋๊ธฐ ์์
: ์ฌ์ฉ์ ID: ${userSession.userId}`);
resolve();
} else {
console.log('๋น๋๊ธฐ ์์
: ์ฌ์ฉ์ ์ธ์
์ ์ฐพ์ ์ ์์');
resolve();
}
}, 100);
});
}
async function main() {
if (authenticateUser('user', 'password')) {
await someAsyncOperation();
} else {
console.log('์ธ์ฆ ์คํจ');
}
}
main();
์ด ์์ ์์๋ ์ฑ๊ณต์ ์ธ ์ธ์ฆ ํ ์ฌ์ฉ์ ์ธ์ ์ด ALS์ ์ ์ฅ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด `someAsyncOperation` ํจ์๋ ์ด ์ธ์ ๋ฐ์ดํฐ๊ฐ ๋ช ์์ ์ผ๋ก ์ธ์๋ก ์ ๋ฌ๋ ํ์ ์์ด ์ ๊ทผํ ์ ์์ต๋๋ค.
3. ํธ๋์ญ์ ๊ด๋ฆฌ
๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ์์ ALS๋ ํธ๋์ญ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํธ๋์ญ์ ์ ์ฐธ์ฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ ๋ถ๋ถ์์๋ ํธ๋์ญ์ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์ด ๋ชจ๋ ์์ ์ด ๋์ผํ ํธ๋์ญ์ ๋ฒ์ ๋ด์์ ์ํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
4. ๋ก๊น ๋ฐ ๊ฐ์ฌ
ALS๋ ๋ก๊น ๋ฐ ๊ฐ์ฌ ๋ชฉ์ ์ ์ํด ์ปจํ ์คํธ๋ณ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ID, ์์ฒญ ID ๋ฐ ํ์์คํฌํ๋ฅผ ALS์ ์ ์ฅํ ๋ค์ ์ด ์ ๋ณด๋ฅผ ๋ก๊ทธ ๋ฉ์์ง์ ํฌํจ์ํฌ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ํ๋์ ๋ ์ฝ๊ฒ ์ถ์ ํ๊ณ ์ ์ฌ์ ์ธ ๋ณด์ ๋ฌธ์ ๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
Async Local Storage ์ฌ์ฉ ๋ฐฉ๋ฒ
Async Local Storage๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋ ์ธ ๊ฐ์ง ์ฃผ์ ๋จ๊ณ๊ฐ ํฌํจ๋ฉ๋๋ค:
- AsyncLocalStorage ์ธ์คํด์ค ์์ฑ: `AsyncLocalStorage` ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
- ์ปจํ ์คํธ ๋ด์์ ์ฝ๋ ์คํ: `run()` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ปจํ ์คํธ ๋ด์์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. `run()` ๋ฉ์๋๋ ์คํ ์ด(์ผ๋ฐ์ ์ผ๋ก Map ๋๋ ๊ฐ์ฒด)์ ์ฝ๋ฐฑ ํจ์, ๋ ๊ฐ์ง ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. ์ด ์คํ ์ด๋ ์ฝ๋ฐฑ ํจ์ ๋ด์์ ์์๋ ๋ชจ๋ ๋น๋๊ธฐ ์์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์คํ ์ด์ ์ ๊ทผ: `getStore()` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ปจํ ์คํธ ๋ด์์ ์คํ ์ด์ ์ ๊ทผํฉ๋๋ค.
์์:
const { AsyncLocalStorage } = require('async_hooks');
const asyncLocalStorage = new AsyncLocalStorage();
function doSomethingAsync() {
return new Promise(resolve => {
setTimeout(() => {
const value = asyncLocalStorage.getStore().get('myKey');
console.log('ALS์ ๊ฐ:', value);
resolve();
}, 500);
});
}
async function main() {
asyncLocalStorage.run(new Map(), async () => {
asyncLocalStorage.getStore().set('myKey', '์๋
ํ์ธ์ ALS!');
await doSomethingAsync();
});
}
main();
AsyncLocalStorage API
`AsyncLocalStorage` ํด๋์ค๋ ๋ค์ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค:
- constructor(): ์๋ก์ด AsyncLocalStorage ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
- run(store, callback, ...args): ์ฃผ์ด์ง ์คํ ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ปจํ ์คํธ ๋ด์์ ์ ๊ณต๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํฉ๋๋ค. ์คํ ์ด๋ ์ผ๋ฐ์ ์ผ๋ก `Map` ๋๋ ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ๋๋ค. ์ฝ๋ฐฑ ๋ด์์ ์์๋ ๋ชจ๋ ๋น๋๊ธฐ ์์ ์ ์ด ์ปจํ ์คํธ๋ฅผ ์์๋ฐ์ต๋๋ค. ์ถ๊ฐ ์ธ์๋ฅผ ์ฝ๋ฐฑ ํจ์์ ์ ๋ฌํ ์ ์์ต๋๋ค.
- getStore(): ํ์ฌ ๋น๋๊ธฐ ์ปจํ ์คํธ์ ํ์ฌ ์คํ ์ด๋ฅผ ๋ฐํํฉ๋๋ค. ํ์ฌ ์ปจํ ์คํธ์ ์ฐ๊ด๋ ์คํ ์ด๊ฐ ์์ผ๋ฉด `undefined`๋ฅผ ๋ฐํํฉ๋๋ค.
- disable(): AsyncLocalStorage ์ธ์คํด์ค๋ฅผ ๋นํ์ฑํํฉ๋๋ค. ๋นํ์ฑํ๋๋ฉด `run()` ๋ฐ `getStore()`๋ ๋ ์ด์ ์๋ํ์ง ์์ต๋๋ค.
๊ณ ๋ ค์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
ALS๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง ์ ์คํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ๊ณ ๋ ค์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค:
- ๊ณผ์ฉ ๋ฐฉ์ง: ๋ชจ๋ ๊ฒ์ ALS๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ๋น๋๊ธฐ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์ปจํ ์คํธ๋ฅผ ์ถ์ ํด์ผ ํ ๋๋ง ์ฌ์ฉํ์ญ์์ค. ์ปจํ ์คํธ๊ฐ ๋น๋๊ธฐ ํธ์ถ์ ํตํด ์ ํ๋ ํ์๊ฐ ์๋ค๋ฉด ์ผ๋ฐ ๋ณ์์ ๊ฐ์ ๋ ๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ฑ๋ฅ: ALS๋ ์ผ๋ฐ์ ์ผ๋ก ํจ์จ์ ์ด์ง๋ง ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ํ์์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์ธก์ ํ๊ณ ์ต์ ํํ์ญ์์ค. ALS์ ๋ฃ๋ ์คํ ์ด์ ํฌ๊ธฐ์ ์ ์ํ์ญ์์ค. ํฐ ๊ฐ์ฒด๋ ํนํ ๋ง์ ๋น๋๊ธฐ ์์ ์ด ์์๋ ๋ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
- ์ปจํ ์คํธ ๊ด๋ฆฌ: ์คํ ์ด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ๊ฐ ์์ฒญ ๋๋ ์ธ์ ์ ๋ํด ์ ์คํ ์ด๋ฅผ ๋ง๋ค๊ณ ๋ ์ด์ ํ์ํ์ง ์์ ๋ ์คํ ์ด๋ฅผ ์ ๋ฆฌํ์ญ์์ค. ALS ์์ฒด๊ฐ ๋ฒ์ ๊ด๋ฆฌ์ ๋์์ด ๋์ง๋ง, ์คํ ์ด *๋ด์* ๋ฐ์ดํฐ๋ ์ฌ์ ํ ์ ์ ํ ์ฒ๋ฆฌ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ํ์ํฉ๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์ค๋ฅ ์ฒ๋ฆฌ์ ์ ์ํ์ญ์์ค. ๋น๋๊ธฐ ์์ ๋ด์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ปจํ ์คํธ๊ฐ ์์ค๋ ์ ์์ต๋๋ค. try-catch ๋ธ๋ก์ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ปจํ ์คํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ง๋๋๋ก ํ์ญ์์ค.
- ๋๋ฒ๊น : ALS ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๋๋ฒ๊น ๋๊ตฌ์ ๋ก๊น ์ ์ฌ์ฉํ์ฌ ์คํ ํ๋ฆ์ ์ถ์ ํ๊ณ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ์ญ์์ค.
- ํธํ์ฑ: ALS๋ Node.js ๋ฒ์ 14.5.0 ์ด์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ์ฉํ๊ธฐ ์ ์ ํ๊ฒฝ์ด ALS๋ฅผ ์ง์ํ๋์ง ํ์ธํ์ญ์์ค. ์ด์ ๋ฒ์ ์ Node.js์ ๊ฒฝ์ฐ continuation-local storage(CLS)์ ๊ฐ์ ๋์์ ๊ณ ๋ คํ ์ ์์ง๋ง, ์ด๋ค์ ๋ค๋ฅธ ์ฑ๋ฅ ํน์ฑ๊ณผ API๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
Async Local Storage์ ๋์
ALS๊ฐ ๋์ ๋๊ธฐ ์ , ๊ฐ๋ฐ์๋ค์ ๋น๋๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ค๋ฅธ ๊ธฐ์ ์ ์์กดํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋์์ ๋๋ค:
- ๋ช ์์ ์ปจํ ์คํธ ์ ๋ฌ: ํธ์ถ ์ฒด์ธ์ ๋ชจ๋ ํจ์์ ์ปจํ ์คํธ ๋ณ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋จํ์ง๋ง ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ง๋ฃจํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. ๋ํ ์ปจํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ง์ ํจ์์ ์๊ทธ๋์ฒ๋ฅผ ์์ ํด์ผ ํ๋ฏ๋ก ๋ฆฌํฉํ ๋ง์ด ๋ ์ด๋ ค์์ง๋๋ค.
- Continuation-Local Storage (CLS): CLS๋ ALS์ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. CLS๋ ๋ชฝํค ํจ์นญ์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ๊ฐ๋ก์ฑ๊ณ ์ปจํ ์คํธ๋ฅผ ์ ํํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ ๋ณต์กํ ์ ์์ผ๋ฉฐ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ: ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ๋ ์์ฒด ์ปจํ ์คํธ ๊ด๋ฆฌ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Express.js๋ ์์ฒญ๋ณ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฏธ๋ค์จ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ๋์์ด ํน์ ์ํฉ์์๋ ์ ์ฉํ ์ ์์ง๋ง, ALS๋ ๋น๋๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ ์ฐ์ํ๊ณ ํจ์จ์ ์ธ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
๊ฒฐ๋ก
Async Local Storage(ALS)๋ ๋น๋๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ํน์ ๋น๋๊ธฐ ์์ ์ ๋ก์ปฌ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํจ์ผ๋ก์จ ALS๋ ์ปจํ ์คํธ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ๋๋ฒ๊น ์ ๊ฐ์ ํ๋ฉฐ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ฌ์ค๋๋ค. ์น ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ , ์ฌ์ฉ์ ์ธ์ ์ ๊ด๋ฆฌํ๋ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ๋ , ALS๋ ๋ ๊นจ๋ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ฐ๋ฉฐ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ์ ๋ ๋ณดํธํ๋๊ณ ์์ผ๋ฉฐ, ALS์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ ์ ๋ ์ค์ํด์ง๊ณ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒ๊ณผ ํ๊ณ๋ฅผ ์ดํดํจ์ผ๋ก์จ ์ ์ธ๊ณ์ ๋ค์ํ ์ฌ์ฉ์ ์๊ตฌ์ ๋ง์ถฐ ํ์ฅํ๊ณ ์ ์ํ ์ ์๋ ๋ ๊ฐ๋ ฅํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ํ๋ก์ ํธ์์ ALS๋ฅผ ์คํํด๋ณด๊ณ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๋น๋๊ธฐ ์ํฌํ๋ก์ฐ๋ฅผ ๋จ์ํํ๊ณ ์ ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ๋ฅผ ๊ฐ์ ํ ์ ์๋์ง ์์๋ณด์ญ์์ค.