기다리고, 쓰고, 읽기
이벤트와 비동기를 구분하고, 짧은 프로그램을 따로 실행해 파일을 쓰고 읽습니다.
만들 결과물: 입력 한 번 받기, 문장 한 번 쓰기, 파일 한 번 읽기. 작은 동작을 각각 독립된 파일로 실험합니다.
실행·모듈 미션에서 사용한 02-JavaScript와Node 폴더에서 이어서 실행합니다.
미션 4 · 실행 순서 예상하기
04-async/events.mjs와 order.mjs를 읽고 번호의 순서를 예상합니다.
npm run events
npm run asyncevents.mjs의 on은 함수 등록, emit은 이벤트 발생입니다. 이 예제는 emit을 호출하는 동안 등록한 함수를 실행합니다. 이벤트를 썼다고 항상 비동기인 것은 아닙니다.
지금은 어디서 함수를 등록하고, 누가 언제 실행하는지를 찾으면 충분합니다. 콜백·리스너·핸들러의 관계가 궁금하면 실행 용어 지도를 필요한 만큼 읽습니다. 03-0 소켓 채팅에서 에코를 먼저 경험한 뒤 짧게 다시 확인합니다.
order.mjs에서 await work를 잠시 work로 바꿉니다. 4번 출력 시점과 result의 값을 관찰하고 원래대로 복원합니다.
힌트: Promise와 결과가 헷갈려요
work는 작업의 완료 또는 실패를 다루는 Promise입니다. await work는 완료된 결과를 얻습니다. await를 지웠을 때는 완료 전 Promise 자체를 출력합니다. 이미 시작한 타이머가 취소되는 것은 아닙니다.
선택으로 입력 한 번을 기다립니다.
npm run inputName?에 Sam을 입력합니다. input.mjs에서 await input.question과 input.close의 위치를 봅니다. 반복 입력이나 명령 해석은 추가하지 않습니다.
미션 5 · 문장을 한 번 쓰기
04-async/memo.mjs의 전체 코드는 다음과 같습니다.
import { writeFile } from "node:fs/promises";
const text = process.argv[2];
await writeFile("notes.txt", text);
console.log("Saved");npm run memo -- "Hello Node"Saved가 나오면 쓰기 프로그램은 종료됩니다. 단원 폴더에 생긴 notes.txt를 편집기로 엽니다. 이 예제는 한 문장을 한 번 쓰며 자동 저장·명령 반복·입력 검증을 하지 않습니다.
writeFile이 끝난 다음에 저장 완료를 알리는 줄이 어디인지 찾습니다.
다른 프로그램으로 읽기
04-async/storage.mjs는 읽기만 합니다.
import { readFile } from "node:fs/promises";
const text = await readFile("notes.txt", "utf8");
console.log(text);npm run read이전에 실행한 쓰기 프로그램은 끝났지만 Hello Node가 남아 있습니다. 메모리 안의 변수와 파일의 차이를 설명합니다.
"Second note"를 다시 저장하고 읽습니다. 같은 파일을 덮어쓴다는 것을 확인합니다. 이 파일에는 실습용 문장만 사용하세요.
상대 경로 notes.txt는 터미널의 현재 폴더 기준입니다. 이번에는 단원 루트에서 실행합니다. "utf8"는 파일을 문자열로 읽는 옵션이며, 한글과 인코딩의 원리는 다음 통신 단원에서 확인합니다.
객체 배열은 어떻게 저장할까?
npm run json
npm run read:jsonjson.mjs는 우리가 만든 배열을 텍스트로 바꿔 notes.json에 씁니다. read-json.mjs는 그 텍스트를 읽어 다시 값으로 바꿉니다.
객체 배열 → JSON.stringify → 텍스트 → 파일
파일 → 텍스트 → JSON.parse → 객체 배열notes.json을 열어 실제 텍스트를 봅니다. json.mjs의 Hello JSON을 My JSON으로 바꾸고 두 명령을 다시 실행합니다. 출력도 달라지는지 확인하세요.
선택 · 파일이 없으면?
연습용 notes.txt의 이름을 잠시 notes-old.txt로 바꾸고 npm run read를 실행합니다. ENOENT와 오류에 나온 경로를 찾습니다. 관찰 후 원래 이름으로 돌립니다.
예제는 이 오류를 잡지 않으므로 Node의 오류가 그대로 표시됩니다. 지금은 이유를 설명하는 데 집중하고, 복구 기능은 나중에 필요한 동작을 정해 AI 코딩으로 확장합니다.
이해 확인
- 이벤트 등록과 실행을 구분합니다.
- Promise와 완료된 결과를 구분합니다.
- 쓰기 프로그램이 끝난 뒤 읽기 프로그램이 파일을 읽었습니다.
- 파일이 생기는 위치와 덮어쓰기 동작을 설명합니다.
- 객체와 JSON 텍스트 사이의 변환 방향을 설명합니다.
다음: TypeScript 검사와 고장 복구.