var, let, const 와 같이 변수를 초기화할 때 사용하는
새로운 자바스크립트 키워드 using
using
은 자바스크립트 프로그램에서 리소스를 관리하는데 유용하다function getResource() {
return {
data: "hello world",
[Symbol.dispose]: () => {
console.log('bye world')
}
}
}
function main() {
using myResource = getResource();
console.log(myResource.data);
}
main(); // hello world
// bye world
단순히 const
대신 using
을 사용하는것이 아니라 위와 같이 변수가 폐기될 때 실행될 코드를 작성해야한다.
폐기될 때 실행될 코드는 [Symbol.dispose]: () => {}
의 형태로 작성한다.
async function getUsers() {
const db = await getDb();
const users = await db.query('SELECT ID FROM USERS;');
return users;
}
위 코드는 db
를 닫는 과정이 없다.
코드베이스 전체에서 이 작업을 계속 수행하면, 데이터베이스 과부화가 생김
보통은 위 문제를 try/catch
블록으로 해결한다.
async function getUsers() {
const db = await getDb();
try {
const db = await getDb();
const users = await db.query('SELECT ID FROM USERS;');
return users;
} catch {
console.error('ERROR!');
} finally {
await db.close();
}
}
항상 수동으로 finally
블럭에서 데이터베이스를 닫아야 하는데,
using
키워드를 활용하면 데이터베이스가 더 이상 사용되지 않을 때 데이터베이스 연결을 자동으로 종료할수있다.
using
으로 변수를 선언하면 변수가 범위를 벗어나 더 이상 사용되지 않으면 자동으로 폐기
async function getDb() {
const connection = await mysql.connect(...);
// return connection
return {
connection,
[Symbol.asyncDispose]: async () => {
await connection.close();
},
}
}
async function getUsers() {
// const db = await getDb();
await using db = await getDb();
// 첫번째 await: dispose code
// 두번째 await: connects to our DB
try {
const db = await getDb();
const users = await db.query('SELECT ID FROM USERS;');
return users;
} catch {
console.error('ERROR!');
}
// finally {
// await db.close();
// }
}
getUsers
함수가 종료되는 순간 [Symbol.asyncDispose]
에 정의 되어있는 함수를 자동으로 호출한다.using
은 데이터베이스 연결 뿐만아니라,
닫아야 하는 파일, 데이터 스트림, 웹 소켓 연결등을 처리할 때 유용하다.
using
은 아직 정식으로 자바스크립트의 일부가 아니고 거의 완성 단계에 있다.
23.09.02 기준 타입스크립트 버전 5.2에서 사용해볼 수 있다.
using
은 C# using
과 python with
와 유사하다
Reference