์๋ฐ์คํฌ๋ฆฝํธ 'using' ๊ตฌ๋ฌธ์ ์ฌ์ธต ๋ถ์ํ์ฌ ์ฑ๋ฅ ์ํฅ, ๋ฆฌ์์ค ๊ด๋ฆฌ ์ด์ ๋ฐ ์ ์ฌ์ ์ค๋ฒํค๋๋ฅผ ์ดํด๋ด ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ 'using' ๊ตฌ๋ฌธ ์ฑ๋ฅ: ๋ฆฌ์์ค ๊ด๋ฆฌ ์ค๋ฒํค๋ ์ดํดํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ 'using' ๊ตฌ๋ฌธ์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ๊ฒฐ์ ์ ํด์ ๋ฅผ ๋ณด์ฅํ๋๋ก ์ค๊ณ๋์ด, ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ๋ณด์ ํ๋ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ์ธ์ด ๊ธฐ๋ฅ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ๊ณผ ์ ์ฌ์ ์ธ ์ค๋ฒํค๋๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
'using' ๊ตฌ๋ฌธ์ด๋ ๋ฌด์์ธ๊ฐ?
'using' ๊ตฌ๋ฌธ(๋ช ์์ ๋ฆฌ์์ค ๊ด๋ฆฌ ์ ์์ ์ผ๋ถ๋ก ๋์ ๋จ)์ ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋ ์ฝ๋ ๋ธ๋ก์ด ์ ์์ ์ผ๋ก ์๋ฃ๋๊ฑฐ๋, ์์ธ๊ฐ ๋ฐ์ํ๊ฑฐ๋, ๋๋ ๋ค๋ฅธ ์ด๋ค ์ด์ ๋ก๋ ์ข ๋ฃ๋ ๋ ํด๋น ๊ฐ์ฒด์ `Symbol.dispose` ๋๋ `Symbol.asyncDispose` ๋ฉ์๋ ํธ์ถ์ ๋ณด์ฅํ๋ ๊ฐ๊ฒฐํ๊ณ ์ ๋ขฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ์ฒด๊ฐ ๋ณด์ ํ ๋ฆฌ์์ค๊ฐ ์ฆ์ ํด์ ๋์ด ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ด๋ ํ์ผ ํธ๋ค, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ, ๋คํธ์ํฌ ์์ผ ๋๋ ๊ณ ๊ฐ์ ํผํ๊ธฐ ์ํด ๋ช ์์ ์ผ๋ก ํด์ ํด์ผ ํ๋ ๊ธฐํ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ๋ค๋ฃฐ ๋ ํนํ ์ ์ฉํฉ๋๋ค.
'using' ๊ตฌ๋ฌธ์ ์ด์
- ๊ฒฐ์ ์ ํด์ : ๋น๊ฒฐ์ ์ ์ธ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ ๋ฌ๋ฆฌ ๋ฆฌ์์ค ํด์ ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
- ๋จ์ํ๋ ๋ฆฌ์์ค ๊ด๋ฆฌ: ๊ธฐ์กด์ `try...finally` ๋ธ๋ก์ ๋นํด ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ฌ์ค๋๋ค.
- ํฅ์๋ ์ฝ๋ ๊ฐ๋ ์ฑ: ๋ฆฌ์์ค ๊ด๋ฆฌ ๋ก์ง์ ๋ ๋ช ํํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ๋ฆฌ์์ค ๋์ ๋ฐฉ์ง: ํ์ ์ด์์ผ๋ก ๋ฆฌ์์ค๋ฅผ ์ค๋ ๋ณด์ ํ ์ํ์ ์ต์ํํฉ๋๋ค.
๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ: `Symbol.dispose`์ `Symbol.asyncDispose`
'using' ๊ตฌ๋ฌธ์ `Symbol.dispose` ๋๋ `Symbol.asyncDispose` ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด์ ์์กดํฉ๋๋ค. ์ด ๋ฉ์๋๋ค์ ๊ฐ์ฒด๊ฐ ๋ณด์ ํ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๋ ์ญํ ์ ํฉ๋๋ค. 'using' ๊ตฌ๋ฌธ์ ์ด๋ฌํ ๋ฉ์๋๋ค์ด ์ ์ ํ๊ฒ ํธ์ถ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
`Symbol.dispose` ๋ฉ์๋๋ ๋๊ธฐ์ ํด์ ์ ์ฌ์ฉ๋๊ณ , `Symbol.asyncDispose`๋ ๋น๋๊ธฐ์ ํด์ ์ ์ฌ์ฉ๋ฉ๋๋ค. 'using' ๊ตฌ๋ฌธ์ด ์ด๋ป๊ฒ ์์ฑ๋์๋์ง(`using` ๋ `await using`)์ ๋ฐ๋ผ ์ ์ ํ ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
๋๊ธฐ์ ํด์ ์์
ํ์ผ ํธ๋ค์ ๊ด๋ฆฌํ๋ ๊ฐ๋จํ ํด๋์ค๋ฅผ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค (์์ฐ์ ์ํด ๋จ์ํ๋จ):
class FileResource {
constructor(filename) {
this.filename = filename;
this.fileHandle = this.openFile(filename); // ํ์ผ ์ด๊ธฐ ์๋ฎฌ๋ ์ด์
console.log(`${filename}์ ๋ํ FileResource ์์ฑ๋จ`);
}
openFile(filename) {
// ํ์ผ ์ด๊ธฐ ์๋ฎฌ๋ ์ด์
(์ค์ ํ์ผ ์์คํ
์์
์ผ๋ก ๋์ฒด)
console.log(`ํ์ผ ์ฌ๋ ์ค: ${filename}`);
return `${filename}์ ๋ํ ํ์ผ ํธ๋ค`;
}
[Symbol.dispose]() {
this.closeFile();
}
closeFile() {
// ํ์ผ ๋ซ๊ธฐ ์๋ฎฌ๋ ์ด์
(์ค์ ํ์ผ ์์คํ
์์
์ผ๋ก ๋์ฒด)
console.log(`ํ์ผ ๋ซ๋ ์ค: ${this.filename}`);
}
}
// using ๊ตฌ๋ฌธ ์ฌ์ฉ
{
using file = new FileResource("example.txt");
// ํ์ผ์ ์ฌ์ฉํ ์์
์ํ
console.log("ํ์ผ ์์
์ํ ์ค");
}
// ๋ธ๋ก์ด ์ข
๋ฃ๋๋ฉด ํ์ผ์ด ์๋์ผ๋ก ๋ซํ๋๋ค
๋น๋๊ธฐ์ ํด์ ์์
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๋ ํด๋์ค๋ฅผ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค (์์ฐ์ ์ํด ๋จ์ํ๋จ):
class DatabaseConnection {
constructor(connectionString) {
this.connectionString = connectionString;
this.connection = this.connect(connectionString); // ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์๋ฎฌ๋ ์ด์
console.log(`${connectionString}์ ๋ํ DatabaseConnection ์์ฑ๋จ`);
}
async connect(connectionString) {
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์๋ฎฌ๋ ์ด์
(์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ผ๋ก ๋์ฒด)
await new Promise(resolve => setTimeout(resolve, 50)); // ๋น๋๊ธฐ ์์
์๋ฎฌ๋ ์ด์
console.log(`์ฐ๊ฒฐ ์ค: ${connectionString}`);
return `${connectionString}์ ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ`;
}
async [Symbol.asyncDispose]() {
await this.disconnect();
}
async disconnect() {
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํด์ ์๋ฎฌ๋ ์ด์
(์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ผ๋ก ๋์ฒด)
await new Promise(resolve => setTimeout(resolve, 50)); // ๋น๋๊ธฐ ์์
์๋ฎฌ๋ ์ด์
console.log(`๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํด์ ์ค`);
}
}
// await using ๊ตฌ๋ฌธ ์ฌ์ฉ
async function main() {
{
await using db = new DatabaseConnection("mydb://localhost:5432");
// ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ์์
์ํ
console.log("๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ํ ์ค");
}
// ๋ธ๋ก์ด ์ข
๋ฃ๋๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ์๋์ผ๋ก ํด์ ๋ฉ๋๋ค
}
main();
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
'using' ๊ตฌ๋ฌธ์ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
`Symbol.dispose` ๋๋ `Symbol.asyncDispose` ํธ์ถ์ ์ค๋ฒํค๋
์ฃผ์ ์ฑ๋ฅ ์ค๋ฒํค๋๋ `Symbol.dispose` ๋๋ `Symbol.asyncDispose` ๋ฉ์๋ ์์ฒด์ ์คํ์์ ๋ฐ์ํฉ๋๋ค. ์ด ๋ฉ์๋์ ๋ณต์ก์ฑ๊ณผ ์คํ ์๊ฐ์ ์ ์ฒด ์ฑ๋ฅ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํด์ ํ๋ก์ธ์ค์ ๋ณต์กํ ์์ (์: ๋ฒํผ ํ๋ฌ์, ์ฌ๋ฌ ์ฐ๊ฒฐ ๋ซ๊ธฐ, ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ ์ํ)์ด ํฌํจ๋๋ฉด ๋์ ๋๋ ์ง์ฐ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ๋ฉ์๋ ๋ด์ ํด์ ๋ก์ง์ ์ฑ๋ฅ์ ์ต์ ํ๋์ด์ผ ํฉ๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ฏธ์น๋ ์ํฅ
'using' ๊ตฌ๋ฌธ์ ๊ฒฐ์ ์ ํด์ ๋ฅผ ์ ๊ณตํ์ง๋ง, ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํ์์ฑ์ ์์ ์ง๋ ์์ต๋๋ค. ๊ฐ์ฒด๋ ๋ ์ด์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ฉด ์ฌ์ ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ 'using'์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค๋ฅผ ๋ช ์์ ์ผ๋ก ํด์ ํ๋ฉด, ํนํ ๊ฐ์ฒด๊ฐ ๋๋์ ๋ฉ๋ชจ๋ฆฌ๋ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ๋ณด์ ํ๋ ์๋๋ฆฌ์ค์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์์ ๋์ ์ค์ผ ์ ์์ต๋๋ค. ๋ฆฌ์์ค๋ฅผ ์ ์ํ๊ฒ ํด์ ํ๋ฉด ๋ ๋นจ๋ฆฌ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋๋ฏ๋ก ๋ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
`try...finally`์์ ๋น๊ต
์ ํต์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ `try...finally` ๋ธ๋ก์ ์ฌ์ฉํ์ฌ ์ด๋ฃจ์ด์ก์ต๋๋ค. 'using' ๊ตฌ๋ฌธ์ ์ด ํจํด์ ๋จ์ํํ๋ ๋ฌธ๋ฒ์ ์คํ(syntactic sugar)์ผ๋ก ๋ณผ ์ ์์ต๋๋ค. 'using' ๊ตฌ๋ฌธ์ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์์ฑ๋ `try...finally` ๊ตฌ์กฐ๋ฅผ ํฌํจํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๋ฐ๋ผ์ 'using' ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ ์์ฑ๋ `try...finally` ๋ธ๋ก์ ์ฌ์ฉํ๋ ๊ฒ ์ฌ์ด์ ์ฑ๋ฅ ์ฐจ์ด๋ ์ข ์ข ๋ฌด์ํ ์ ์์ ์ ๋์ ๋๋ค.
ํ์ง๋ง 'using' ๊ตฌ๋ฌธ์ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์์ฉ๊ตฌ ์ฝ๋ ๊ฐ์ ์ธก๋ฉด์์ ์๋นํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ์๋๋ฅผ ๋ช ์์ ์ผ๋ก ๋ง๋ค์ด ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๊ณ ์ค๋ฅ์ ์ํ์ ์ค์ผ ์ ์์ต๋๋ค.
๋น๋๊ธฐ์ ํด์ ์ค๋ฒํค๋
`await using` ๊ตฌ๋ฌธ์ ๋น๋๊ธฐ ์์ ์ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํฉ๋๋ค. `Symbol.asyncDispose` ๋ฉ์๋๋ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ฏ๋ก, ์ ์คํ๊ฒ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต์ฑ์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ ค๋ฉด ๋น๋๊ธฐ ํด์ ์์ ์ด ๋ ผ๋ธ๋กํน(non-blocking)์ด๊ณ ํจ์จ์ ์ธ์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํด์ ์์ ์ ์์ปค ์ค๋ ๋๋ก ์คํ๋ก๋ํ๊ฑฐ๋ ๋ ผ๋ธ๋กํน I/O ์์ ์ ์ฌ์ฉํ๋ ๋ฑ์ ๊ธฐ์ ์ด ์ด ์ค๋ฒํค๋๋ฅผ ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
'using' ๊ตฌ๋ฌธ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ํด์ ๋ก์ง ์ต์ ํ: `Symbol.dispose` ๋ฐ `Symbol.asyncDispose` ๋ฉ์๋๊ฐ ๊ฐ๋ฅํ ํ ํจ์จ์ ์ด๋๋ก ํ์ญ์์ค. ํด์ ์ค์ ๋ถํ์ํ ์์ ์ ์ํํ์ง ๋ง์ญ์์ค.
- ๋ฆฌ์์ค ํ ๋น ์ต์ํ: 'using' ๊ตฌ๋ฌธ์ผ๋ก ๊ด๋ฆฌํด์ผ ํ๋ ๋ฆฌ์์ค์ ์๋ฅผ ์ค์ด์ญ์์ค. ์๋ฅผ ๋ค์ด, ์ ์ฐ๊ฒฐ์ด๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋์ ๊ธฐ์กด์ ๊ฒ์ ์ฌ์ฌ์ฉํ์ญ์์ค.
- ์ปค๋ฅ์ ํ๋ง ์ฌ์ฉ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ๊ณผ ๊ฐ์ ๋ฆฌ์์ค์ ๊ฒฝ์ฐ, ์ปค๋ฅ์ ํ๋ง์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ์ ์ค์ ํ๊ณ ๋ซ๋ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ์ญ์์ค.
- ๊ฐ์ฒด ์๋ช ์ฃผ๊ธฐ ๊ณ ๋ ค: ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ๋ฆฌ์์ค๊ฐ ๋ ์ด์ ํ์ํ์ง ์๊ฒ ๋๋ฉด ์ฆ์ ํด์ ๋๋๋ก ํ์ญ์์ค.
- ํ๋กํ์ผ๋ง ๋ฐ ์ธก์ : ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์์ 'using' ๊ตฌ๋ฌธ์ด ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ธก์ ํ์ญ์์ค. ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ต์ ํํ์ญ์์ค.
- ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ: `Symbol.dispose` ๋ฐ `Symbol.asyncDispose` ๋ฉ์๋ ๋ด์ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ก์ง์ ๊ตฌํํ์ฌ ์์ธ๊ฐ ํด์ ํ๋ก์ธ์ค๋ฅผ ์ค๋จ์ํค์ง ์๋๋ก ํ์ญ์์ค.
- ๋ ผ๋ธ๋กํน ๋น๋๊ธฐ ํด์ : `await using`์ ์ฌ์ฉํ ๋, ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต์ฑ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๋น๋๊ธฐ ํด์ ์์ ์ด ๋ ผ๋ธ๋กํน์ธ์ง ํ์ธํ์ญ์์ค.
์ ์ฌ์ ์ค๋ฒํค๋ ์๋๋ฆฌ์ค
ํน์ ์๋๋ฆฌ์ค๋ 'using' ๊ตฌ๋ฌธ๊ณผ ๊ด๋ จ๋ ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ฆํญ์ํฌ ์ ์์ต๋๋ค:
- ๋น๋ฒํ ๋ฆฌ์์ค ํ๋ ๋ฐ ํด์ : ๋ฆฌ์์ค๋ฅผ ์์ฃผ ํ๋ํ๊ณ ํด์ ํ๋ ๊ฒ์ ์๋นํ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ผ๋ฉฐ, ํนํ ํด์ ํ๋ก์ธ์ค๊ฐ ๋ณต์กํ ๊ฒฝ์ฐ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ, ๋ฆฌ์์ค๋ฅผ ์บ์ฑํ๊ฑฐ๋ ํ๋งํ์ฌ ํด์ ๋น๋๋ฅผ ์ค์ด๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ฅ๊ธฐ ์กด์ ๋ฆฌ์์ค: ๋ฆฌ์์ค๋ฅผ ์ฅ๊ธฐ๊ฐ ๋ณด์ ํ๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ง์ฐ๋๊ณ ์ ์ฌ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋จํธํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ ์ด์ ํ์ํ์ง ์์ ๋ฆฌ์์ค๋ ์ฆ์ ํด์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ์ญ์์ค.
- ์ค์ฒฉ๋ 'using' ๊ตฌ๋ฌธ: ์ฌ๋ฌ ๊ฐ์ ์ค์ฒฉ๋ `using` ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋ฆฌ์์ค ๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๊ณ ํด์ ํ๋ก์ธ์ค๊ฐ ์ํธ ์์กด์ ์ธ ๊ฒฝ์ฐ ์ ์ฌ์ ์ผ๋ก ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ค์ฒฉ์ ์ต์ํํ๊ณ ํด์ ์์๋ฅผ ์ต์ ํํ๋๋ก ์ฝ๋๋ฅผ ์ ์คํ๊ฒ ๊ตฌ์กฐํํ์ญ์์ค.
- ์์ธ ์ฒ๋ฆฌ: 'using' ๊ตฌ๋ฌธ์ ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ํด์ ๋ฅผ ๋ณด์ฅํ์ง๋ง, ์์ธ ์ฒ๋ฆฌ ๋ก์ง ์์ฒด๋ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํํ๋๋ก ์์ธ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ์ต์ ํํ์ญ์์ค.
์์: ๊ตญ์ ์ ์ปจํ ์คํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ
์ฌ์ฉ์์ ์์น์ ๋ฐ๋ผ ๋ค๋ฅธ ์ง์ญ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํด์ผ ํ๋ ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด์ญ์์ค. ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํด์ผ ํ๋ ๋ฆฌ์์ค์ ๋๋ค. `await using` ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋คํธ์ํฌ ๋ฌธ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์ด๋ฌํ ์ฐ๊ฒฐ์ด ์์ ์ ์ผ๋ก ๋ซํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ๋ง์ฝ ํด์ ํ๋ก์ธ์ค์ ํธ๋์ญ์ ๋กค๋ฐฑ์ด๋ ์์ ๋ฐ์ดํฐ ์ ๋ฆฌ๊ฐ ํฌํจ๋๋ค๋ฉด, ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํํ๊ธฐ ์ํด ์ด๋ฌํ ์์ ์ ์ต์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ํ, ๊ฐ ์ง์ญ์์ ์ปค๋ฅ์ ํ๋ง์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉํ๊ณ ๊ฐ ์ฌ์ฉ์ ์์ฒญ์ ๋ํด ์ ์ฐ๊ฒฐ์ ์ค์ ํ๋ ์ค๋ฒํค๋๋ฅผ ์ค์ด๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
async function handleUserRequest(userLocation) {
let connectionString;
switch (userLocation) {
case "US":
connectionString = "us-db://localhost:5432";
break;
case "EU":
connectionString = "eu-db://localhost:5432";
break;
case "Asia":
connectionString = "asia-db://localhost:5432";
break;
default:
throw new Error("Unsupported location");
}
try {
await using db = new DatabaseConnection(connectionString);
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์์ฒญ ์ฒ๋ฆฌ
console.log(`${userLocation}์ ์ฌ์ฉ์์ ๋ํ ์์ฒญ ์ฒ๋ฆฌ ์ค`);
} catch (error) {
console.error("์์ฒญ ์ฒ๋ฆฌ ์ค ์ค๋ฅ ๋ฐ์:", error);
// ์ค๋ฅ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌ
}
// ๋ธ๋ก์ด ์ข
๋ฃ๋๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ์๋์ผ๋ก ๋ซํ๋๋ค
}
// ์ฌ์ฉ ์์
handleUserRequest("US");
handleUserRequest("EU");
๋์ฒด ๋ฆฌ์์ค ๊ด๋ฆฌ ๊ธฐ๋ฒ
'using' ๊ตฌ๋ฌธ์ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๋ชจ๋ ๋ฆฌ์์ค ๊ด๋ฆฌ ์๋๋ฆฌ์ค์ ํญ์ ์ต์์ ํด๊ฒฐ์ฑ ์ ์๋๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋์ฒด ๊ธฐ๋ฒ์ ๊ณ ๋ คํด ๋ณด์ญ์์ค:
- ์ฝํ ์ฐธ์กฐ(Weak References): ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํ์ฑ์ ์ค์ํ์ง ์์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด WeakRef์ FinalizationRegistry๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ฐฉํดํ์ง ์์ผ๋ฉด์ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ถ์ ํ ์ ์๊ฒ ํด์ค๋๋ค.
- ๋ฆฌ์์ค ํ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด๋ ๋คํธ์ํฌ ์์ผ๊ณผ ๊ฐ์ด ์์ฃผ ์ฌ์ฉ๋๋ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ฆฌ์์ค ํ์ ๊ตฌํํ์ญ์์ค. ๋ฆฌ์์ค ํ์ ๋ฆฌ์์ค๋ฅผ ํ๋ํ๊ณ ํด์ ํ๋ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ์ ํํฌ: ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋ก์ธ์ค์ ๋ํ ํํฌ๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ์ญ์์ค. ์ด๋ฌํ ํํฌ๋ฅผ ํตํด ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋๊ธฐ ์ง์ ์ ์ ๋ฆฌ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- ์๋ ๋ฆฌ์์ค ๊ด๋ฆฌ: ๊ฒฝ์ฐ์ ๋ฐ๋ผ, ํนํ ํด์ ํ๋ก์ธ์ค์ ๋ํ ์ธ๋ฐํ ์ ์ด๊ฐ ํ์ํ ๋ `try...finally` ๋ธ๋ก์ ์ฌ์ฉํ ์๋ ๋ฆฌ์์ค ๊ด๋ฆฌ๊ฐ ๋ ์ ์ ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ 'using' ๊ตฌ๋ฌธ์ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ์์ด ๊ฒฐ์ ์ ํด์ ๋ฅผ ์ ๊ณตํ๊ณ ์ฝ๋๋ฅผ ๋จ์ํํ๋ ๋ฑ ์๋นํ ๊ฐ์ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ณต์กํ ํด์ ๋ก์ง์ด๋ ๋น๋ฒํ ๋ฆฌ์์ค ํ๋ ๋ฐ ํด์ ๊ฐ ํฌํจ๋ ์๋๋ฆฌ์ค์์๋ `Symbol.dispose` ๋ฐ `Symbol.asyncDispose` ๋ฉ์๋์ ๊ด๋ จ๋ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ , ํด์ ๋ก์ง์ ์ต์ ํํ๊ณ , ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ, ์ฑ๋ฅ์ ํฌ์ํ์ง ์์ผ๋ฉด์๋ 'using' ๊ตฌ๋ฌธ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ์ ํฅ์์ํค๊ณ ๋ฆฌ์์ค ๋์๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์ต์ ์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ๋ฅ ์ํฅ์ ํ๋กํ์ผ๋งํ๊ณ ์ธก์ ํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.