[Deep JavaScript] using 키워드

Dae-Hee·2023년 9월 20일
0

Deep JavaScript Study

목록 보기
12/12
post-thumbnail

var, let, const 와 같이 변수를 초기화할 때 사용하는
새로운 자바스크립트 키워드 using

  • 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]: () => {} 의 형태로 작성한다.


▪︎ 일반적인 db connect 구현

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 으로 변수를 선언하면 변수가 범위를 벗어나 더 이상 사용되지 않으면 자동으로 폐기


▪︎ using 활용해서 db connect 구현

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

0개의 댓글