JavaScript에서 사용자에게 입력 받기

성유진·2024년 7월 15일

readline 모듈 활용하기

아래와 같이 입력을 받기 위한 readline 모듈을 불러오고,
readline 모듈을 이용해 입출력을 위한 인터페이스 객체를 생성하여 입력과 출력을 처리할 수 있도록 하였다.
해당 객체를 이용하여 콘솔에서 입력을 받아올 수 있다.

node.js 공식 문서에 따르면 readline 모듈 활용 방식은 다음과 같다.

// readline 모듈 불러오기
const readline = require('node:readline');

// 입출력 인터페이스 객체 생성하기
const { stdin: input, stdout: output } = require('node:process');
const rl = readline.createInterface({ input, output });

// 입력 받기
rl.question('What do you think of Node.js? ', (answer) => {
  console.log(`Thank you for your valuable feedback: ${answer}`);

  rl.close(); // 사용이 끝나면 입출력 닫아주기
});

일반적으로는 아래 코드처럼 readline 모듈과 입출력 인터페이스를 생성하는 예시가 많은 것 같다.

const readline = require("readline");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

사용 방식을 찾아보니 너무 다양해서 오히려 헷갈렸는데, 찾아보니 그냥 모듈을 불러오고 활용하는 작성 방식이 다른 것이라고 한다.
두번째 코드가 더 직관적으로 이해하기 편리하여 더 많이 사용되는 것 같다.

비동기 방식

하지만!
readline 모듈을 통해 입력을 받는 함수를 작성한 후에, 해당 함수를 호출하여 입력을 진행하였다. 그리고 입력값을 출력하려고 하니 제대로 출력되지 않았다...
입력을 받는 함수가 종료되면 입력 받는 함수가 실행되지 않고 종료되는 것 같았다.
readline 모듈이 비동기 방식으로 진행되기 때문이라고 한다.

동기(synchronous) vs 비동기(Asynchronous)?

  • 동기 방식 : 처리하고 있는 일이 다 마무리되어야 다른 일을 진행할 수 있는 방식
  • 비동기 방식 : 지금 처리하고 있는 일이 다 마무리 되지 않아도 다른 일을 진행할 수 있는 방식

즉, readline 모듈은 비동기 방식으로 작동하기 때문에, 입력을 진행하는 작업이 전부 진행되지 않아도 메인 함수가 진행되어 끝나면
전체 프로그램 자체가 종료되는 방식으로 프로그램이 동작하고 있었던 것이다.
이런 비동기 방식을 지원하기 위해서 사용할 수 있는 함수들이 javascript에 존재한다고 한다.

비동기 방식 해결하기

Promise

비동기로 진행되는 동작을 완료하면 알려주는 역할을 한다

  • resolve : 비동기 동작을 시작하여 모든 작업을 성공한 경우에 호출하여 promise를 이행
  • reject : 오류가 발생한 경우에 호출하여 promise를 거부

async, await

  • async : 비동기를 진행하는 함수에 작성하는 키워드
  • await : 비동기 함수를 기다리는 함수에 작성하는 키워드

+) readlinePromises.Interface 가 있던데 이거에 대해서도 더 찾아봐야 겠다.

ref

1개의 댓글

comment-user-thumbnail
2024년 7월 30일

자스는 입출력이 너무 그지같아용. 우리 같이 행복 C++ 해용.

답글 달기