ABOUT ME

작은 디테일에 집착하는 개발자

Today
-
Yesterday
-
Total
-
  • TypeScript 5.2의 새로운 키워드: 'using' - 자원 관리의 혁신
    IT Study/FE 2023. 9. 18. 09:00
    728x90

    안녕하세요! 오늘은 정말 흥미로운 소식을 들고 왔습니다.

    함께 공부하는 친구가 갑자기 "대박"이라고 하며, 노마드 코더의 영상 링크를 공유했는데요,

    그 내용은 바로 TypeScript의 새로운 키워드 'using'이 나왔다는 것입니다.

    저도 이 흥미로운 키워드에 대해 더 알아보고 공유하려 합니다. 바로 시작하겠습니다!

     

    'using' 키워드란?

    'using'은 TypeScript 5.2에서 새롭게 도입할 키워드로,

     

    'using' 키워드가 적용된 코드 블록이나 함수의 실행이 종료될 때

    Symbol.dispose 또는 Symbol.asyncDispose 메서드가 있는 객체를 자동으로 해제해 줍니다.

     

    이를 통해 코드를 깔끔하고 안전하게 만들어 주며, 자원 관리를 효율적으로 할 수 있습니다.

     

    Symbol.dispose는 동기적으로 자원을 해제하며,
    Symbol.asyncDispose는 비동기적으로 (일반적으로 네트워크 요청, 파일 I/O 처리 시) 자원 해제합니다.

    'using' 키워드와 함께 사용되면, 이러한 메서드들은 자동으로 호출되어
    객체가 사용하던 자원(예: 파일 핸들, 데이터베이스 연결 등)을 안전하게 해제할 수 있게 돕습니다.

     

    실제 응용 사례

    1. 파일 핸들 관리

    파일을 열고 작업을 수행한 후에는 반드시 닫아야 하는데, 'using' 키워드를 사용하면 이 과정이 자동화됩니다,

    더욱이 예외 처리도 간편해집니다.

     

    - 기존 방법

    import { open } from "node:fs/promises";
    let filehandle;
    try {
      filehandle = await open("thefile.txt", "r");
      // 파일과 관련된 작업 수행
    } finally {
      await filehandle?.close();
    }

     

    - using 키워드를 사용한 새로운 방법

    import { open } from "node:fs/promises";
    const getFileHandle = async (path: string) => {
      const filehandle = await open(path, "r");
      return {
        filehandle,
        [Symbol.asyncDispose]: async () => {
          await filehandle.close();
        },
      };
    };
    {
      await using file = await getFileHandle("thefile.txt");
      // file.filehandle과 관련된 작업 수행
    } // 자동으로 해제!

     

    2. 데이터베이스 연결 관리

    연결을 열고 작업을 수행한 후에는 연결을 닫아야 하는데, 'using' 키워드를 사용하면 이 과정이 자동화됩니다.

     

    - 기존 방법

    const connection = await getDb();
    try {
      // 연결과 관련된 작업 수행
    } finally {
      await connection.close();
    }

     

    - using 키워드를 사용한 새로운 방법

    const getConnection = async () => {
      const connection = await getDb();
      return {
        connection,
        [Symbol.asyncDispose]: async () => {
          await connection.close();
        },
      };
    };
    {
      await using db = await getConnection();
      // db.connection과 관련된 작업 수행
    } // 자동으로 닫힘!

     

    3. 웹 소켓 관리

    웹소켓 관리도 'using' 키워드의 도움을 받을 수 있습니다.

    웹소켓 연결을 열고 데이터를 전송한 후에는 연결을 닫아야 하는데, 'using' 키워드를 사용하면 이 과정이 자동화됩니다.

     

    - 예시

    const getWebSocket = async (url: string) => {
      const socket = new WebSocket(url);
      return {
        socket,
        [Symbol.asyncDispose]: async () => {
          await socket.close();
        },
      };
    };
    {
      await using ws = await getWebSocket("wss://example.com/socket");
      // ws.socket과 관련된 작업 수행
    } // 자동으로 해제!

     

    4. 네트워크 리소스 관리

    'using' 키워드는 네트워크 리소스, 예를 들어 HTTP 요청과 같은 것들을 관리하는 데도 사용될 수 있습니다.

    요청을 보내고 응답을 받은 후에는 연결을 닫아야 하는데, 'using' 키워드를 사용하면 이 과정이 자동화됩니다.

     

    - 예시

    const getNetworkResource = async (url: string) => {
      const response = await fetch(url);
      return {
        response,
        [Symbol.asyncDispose]: async () => {
          await response.body?.cancel();
        },
      };
    };
    {
      await using netResource = await getNetworkResource("https://api.example.com/data");
      // netResource.response와 관련된 작업 수행
    } // 자동으로 해제!

     

    🆕 마무리

    이렇게 'using' 키워드는 코드를 더욱 깔끔하고 안전하게 관리할 수 있게 하기 때문에

    우리 개발자를 한층 더 편리하게 만들어 줄 것 같은데요, 저도 개인적으로 'using' 키워드를 꼭 써보고 싶네요 :)

    그럼... 20000 다음 블로그 글에서 뵙겠습니다!

Designed by Tistory.