ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 타입스크립트에서 "using" 예약어의 동작
    👔, 📚, 🍱 2025. 1. 2. 22:07

    들어가며

    using 예약어는 const와 let 대신 사용되는 일회용 객체, 즉 사용 후 스스로 정리되는 객체를 의미합니다.
    하지만, 이 예약어는 C#에서도 사용됩니다. 타입스크립트가 C#보다 늦게 태생된 것을 보아 C#을 배낀것일까요?
    정답은 아닙니다, 타입스크립트는 전반적인 개발자 경험을 향상시키기 위해 C#에서 가장 좋은 기능을 골라낸 것일 뿐입니다.

    오늘은 타입스크립트에서 using예약어가 어떻게 작동하는지, 그리고 using예약어가 가장 적합한 일반적인 사용 사례에 대해 설명하겠습니다.

    바로 들어가보시죠!

    사용 방법

    using예약어는 const 및 let과 같은 방식으로 사용할 수 있습니다.

    // 참고. x에는 값 또는 함수를 할당해야합니다.
    using x = getX()

    위 방식으로 할당은 가능하나, using 예약어는 다음 용도로만 사용해야합니다.

    • Symbol.dispose 예약어를 사용하는 객체.
    • Symbol.dispose 예약어를 사용하여 객체를 반환하는 함수.
    • const를 사용하거나 그렇지 않다면 let을 사용하세요.

    Symbol.dispose는 객체를 "리소스"로, 즉 일회용으로 표시하는 데 사용되는 TypeScript의 특수 함수입니다.

    다음은 TypeScript의 "리소스"화 예시입니다.

    // Symbol.dispose를 사용하여 일회용으로 표시된 객체
    const disposableObject = {
      [Symbol.dispose]: () => {
        console.log("Dispose of me!");
      },
    };
    
    // 객체를 리소스로 사용.
    using resource = disposableObject

    이 개념을 확장하여 Symbol.asyncDispose 함수를 통해 리소스를 비동기적으로 폐기할 수 있는 await using사용으로 확장할 수 있습니다.

    const getResource = () => ({
      [Symbol.asyncDispose]: async () => {
        await someAsyncFunc();
      },
    });
    
    {
      await using resource = getResource();
    }

    일반적인 사용 사례 - 데이터베이스 연결

    데이터베이스 연결은 아마도 가장 일반적인 사용 사례일 것입니다.

    그 이유는 간단합니다.
    코드 후반부에 데이터베이스 연결을 수동으로 닫을 필요가 없고 Symbol.asyncDispose 함수가 이를 대신 처리해 주기 때문입니다.

    아래는 이 아이디어를 완벽하게 보여주는 TotalTypeScript의 코드 스니펫입니다.

    • using 예약어를 사용하지 않는 경우: ❌

      // https://www.totaltypescript.com/typescript-5-2-new-keyword-using#database-connections
      const connection = await getDb();
      try {
      // 데이터베이스 연결 후 비즈니스 로직
      } finally {
      await connection.close();
      }
    • using 예약어를 함께 사용 할 경우: ✅

      https://www.totaltypescript.com/typescript-5-2-new-keyword-using#database-connections
      const getConnection = async () => {
      const connection = await getDb();
      
      return {
        connection,
        [Symbol.asyncDispose]: async () => {
          await connection.close();
        },
      };
      };
      {
      await using db = await getConnection();
      // db.connectiond과 함께 비즈니스 로직 수행
      } 
      // 해당 블록 스코프가 종료되면, 자동으로 DB의 커넥션이 닫힙니다!

    이제 데이터베이스 연결 종료는 Symbol.asyncDisposeusing예약어를 통해 자동으로 안전하게 처리됩니다.

    결론

    using 예약어는 Symbol.dispose 함수를 포함하는 일회용 객체인 "리소스"를 정의하는 데 사용됩니다.
    using 예약어를 추가하면 예상치 못한 버그가 제거되고 개발자 환경이 10배 이상 개선됩니다.
    한번 사용해 보세요!

    원문 - Understand the “using” keyword in TypeScript

    작성일 24년 6월 26일

    댓글

oct_sky_out