티스토리 뷰

728x90
반응형

목차

     

    순서대로 배우는 건 능률이 좋게 느껴지지 않아서,

     

    알고리즘 풀이로 정방향으로 배우는 동시에 잘 짜인 코드를 바탕으로 리버스 엔지니어링(?)으로 배우기로 했다.

     

    일종의 어깨너머 배우는 느낌인데, 뭐 하여간 그렇다.

     

    오늘 새로 배운 키워드는 제목에 쓰여있듯이 async, promise, await, then, process이다.

     

    가능하면 예를 하나씩 들어가며 정리하도록 하자.

     

    async

     

    'async' 키워드는 이름에서 추측할 수 있듯이, 비동기 함수를 선언할 때 사용한다.

     

    해당 키워드가 붙은 함수는 암묵적으로 'promise'를 반환하게 된다.

    async function doSomething() {
      // ... Promise 반환
    }

     

    Promise

     

    Promise는 자바스크립트에서 비동기 작업의 완료 여부(성공/실패)와 그 결괏값을 나타내는 객체이다.

     

    예를 들자면 아래와 같은 모양이 된다.

    async function doSomething() {
    
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('data');
        }, 1000);
      });
    }
    
    const resultPromise = doSomething(); // 함수 호출 및 Promise 객체 가져옴
    console.log(resultPromise); // Promise { <pending> }

    여기서 new 키워드를 통해 함수 내부에서 Promise 객체를 생성한다.

     

    이어서 setTimeout 함수를 이용해 1초 뒤에 Promise가 'data'를 가지게 된다.

     

    그다음 함수 밖에서 const resultPromise를 통해 Promise 객체를 가져와 출력해 보지만,

     

    여전히 pending 상태임을 확인할 수 있다.

     

    그래도 보통은 'async' 함수의 결과를 직접 처리하기 않고, 아래에 나올 'await'나 'then'을 사용해

     

    Promise의 결과를 처리한다.

    // await 키워드를 사용하여 doSomething 함수의 결과를 기다.
    // 이 코드는 async 함수 내부에서만 작동.
    const data = await doSomething();
    console.log(data); // "data"
    
    // 또는 then 메서드를 사용하여 doSomething 함수의 결과를 처리할 수도 있다.
    doSomething().then((data) => {
      console.log(data); // "data"
    });

     

    await

     

    'await'은 위의 코드블록에 적었듯이 함수 내부에서만 작동한다.

     

    그 역할은 Promise가 완료될 때까지 함수의 실행을 일시적으로 중지하고, Promise의 결괏값을 반환한다.

     

    즉, async가 붙은 비동기 함수를 마치 동시 함수처럼 사용할 수 있도록 해준다.

     

    이는 코드의 가독성 향상과 디버깅을 쉽게 만들어주지만, 순차적인 명령을 동기로 처리하기 때문에

     

    설계에 따라 애플리케이션 성능의 저하를 가져올 가능성이 있다.

     

    then

     

    then은 Promise 객체에서 사용할 수 있는 메서드이다.

     

    비동기 연산이 성공적으로 완료되었을 때 호출될 콜백 함수를 등록하는 역할을 한다.

    const promise = new Promise((resolve, reject) => {
      // 비동기 작업 수행
      resolve("작업 완료!"); // 비동기 작업이 성공적으로 완료되었을 때
    });
    
    promise.then((value) => {
      // promise가 resolve 되었을 때 호출
      console.log(value); // "작업 완료!"
    });

    또한 언제나 Promise 객체를 반환하기 때문에, 여러 개의 then 메서드를 체이닝 해서 사용할 수 있다.

    promise
      .then((value) => {
        console.log(value); // "작업 완료!"
        return "새로운 작업!";
      })
      .then((newValue) => {
        console.log(newValue); // "새로운 작업!"
      });

    위의 예처럼 계속해서 메서드 체이닝을 통해 then을 이용하며, 비동기 작업의 결과를 순서대로 전달 및 처리할 수 있다.

     

    이처럼 복잡한 비동기 로직도 순차적이고 가독성이 좋은 코드로 작성할 수 있으나,

     

    then을 중첩해서 사용하면 오히려 코드의 복잡도가 올라가고 가독성이 떨어질 가능성이 있다.

     

    따라서 'async / await'와 비교해서 적재적소에 사용하는 것이 필요하다.

     

    process

     

    process는 Node.js에서 전역적으로 사용 가능한 객체로, 현재 실행 중인 Node.js 프로세스의 정보를 제공한다.

     

    또한, 해당 프로세스와 상호작용 할 수 있는 여러 가지 방법을 제공하는데,

     

    예를 들면 아래와 같다.

    console.log(process.env.NODE_ENV); // 환경 변수에 접근
    
    process.exit(1); // 오류 코드 1과 함께 프로세스 종료

    위는 환경 변수에 접근하거나 프로세스를 강제로 종료하는 예이다.

     

    이를 포함해 자주 쓰이는 process의 프로퍼티, 혹은 메서드는 아래와 같다.

     

    1. process.env
      환경 변수에 대한 정보를 포함한 객체이다.
      위의 process.env.NODE_ENV는 Node.js의 실행환경('development', 'production' 등)을 설정하는 데 사용되며,
      process.env.PATH는 시스템의 PATH 환경변수를 반환한다.
    2. process.argv
      프로세스에 전달된 명령줄 인수를 배열로 제공한다.
      process.argv[0]는 node의 실행 경로를, process.argv[1]는 현재 실행 중인 파일의 경로를 반환하며,
      그 외 인수들은 process.argv[2]부터 시작한다.
    3. process.stdin / process.stdout
      알고리즘 문제를 풀 때 매번 만나는 이들은 표준 입력(키보드)과 표준 출력(콘솔 또는 터미널)에 대한 스트림을 제공한다.
      readline 모듈과 같은 다른 모듈과 함께 사용되어 사용자 입력을 읽고 결과를 출력하는 데 사용된다.
    4. process.exit()
      이 메서드를 사용하면 Node.js 프로세스가 즉시 종료된다. 선택적으로 종료 코드를 인수로 전달할 수 있다.
    5. process.cwd(): 현재 작업 디렉토리를 반환한다.
    6. process.uptime(): 프로세스가 시작된 후 경과한 시간(초 단위)을 반환한다.
    7. process.nextTick(): 콜백을 이벤트 루프의 현재 단계의 끝에 넣습니다. 주로 비동기 작업의 완료를 알리는 데 사용된다.
    8. process.pid: 현재 프로세스의 프로세스 ID를 반환한다.
    9. process.platform: 프로세스가 실행되고 있는 운영체제를 반환한다.

    이외에도 수많은 프로퍼티와 메서드가 존재한다고 한다. 이는 직접 쓰면서 배우는 편이 빠를 것 같다.

     

    이렇게 해서 JavaScript와 Node.js에서 사용되는 키워드와 메서드 중 처음 만난 아이들을 정리했다.

     

    대부분이 자바스크립트 자체에서 지원하는 문법이지만, 마지막의 process가 Node.js 환경에서만 사용 가능하기 때문에

    게시글의 분류는 Node.js로 했다.

     

    나도 빨리 Node.js로 게시판 만들어보고 싶다!

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/06   »
    1
    2 3 4 5 6 7 8
    9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28 29
    30
    글 보관함