Node.js에서 JSON 파일을 읽고 쓸 수 있습니다. 따라하기 쉬운 가이드에 설명된 대로 fs 모듈을 활용하기만 하면 됩니다.

Node.js에서 JSON 파일 읽기 및 쓰기

JSON 또는 JavaScript 객체 표기법은 복잡한 데이터 구조를 사람이 쉽게 읽을 수 있고 기계가 파싱할 수 있는 방식으로 표현할 수 있어 널리 사용되는 데이터 직렬화 표준으로, 큰 인기를 얻고 있습니다. 이 다목적 형식은 XML과 같은 다른 부피가 큰 형식에 대한 가벼운 대안을 제공하여 다양한 애플리케이션과 시스템 간의 원활한 통신을 촉진합니다.

Node.js의 프로그래밍 기능을 활용하여 JSON 문서를 자동으로 해석하고 생성하면 구조화된 정보를 효율적이고 손쉽게 저장, 전송 및 조작할 수 있습니다. Node.js의 기본 제공 파일 시스템 모듈을 사용하여 JSON 파일을 읽고, 생성하고, 해결하는 방법을 이해합니다.

Node.js 파일 시스템 모듈

Node.js 프레임워크 내에 Node.js 파일 시스템(fs) 모듈을 통합하여 사용자에게 디바이스의 파일 시스템과 상호 작용할 수 있는 인터페이스를 제공합니다. 이 기능을 통해 파일 읽기, 새 파일 생성, 기존 파일 삭제 등 파일 조작과 관련된 다양한 기능을 사용할 수 있습니다.

파일 시스템(fs) 모듈은 파일 및 디렉터리와 상호 작용하기 위한 두 가지 유형의 방법(동기 및 비동기)을 제공합니다. 전자는 작업이 완료될 때까지 프로그램의 실행 흐름을 차단하는 반면, 후자는 응용 프로그램에서 다른 작업의 진행을 방해하지 않는 비차단 작업을 허용합니다. “동기화”라는 끝 접미사로 식별할 수 있는 이러한 동기식 메서드에는 일반적으로 “readFileSync” 또는 “writeFileSync”와 같은 용어가 포함됩니다.

이와 대조적으로 비동기 기술은 애플리케이션의 진행을 방해하지 않으며 파일 시스템 작업 중에 추가 작업을 수행할 수 있습니다. 이러한 접근 방식에는 작업이 완료되면 실행되는 콜백 함수를 제공하는 것이 포함됩니다. 예시적인 예로는 readFile 및 writeFile 함수가 있습니다.

이벤트 루프의 방해받지 않는 흐름을 유지하고 파일을 처리할 때 애플리케이션의 전반적인 기능과 신속성을 최적화하려면 파일 시스템과 관련된 모든 상호 작용에 비동기 기술을 사용하는 것이 좋습니다.

기본 스크립트를 작성하거나 가끔 파일을 조작할 때와 같은 특정 상황에서는 비동기 방식이 필요하지 않을 수 있으며 동기 방식이 적절한 솔루션을 제공할 수 있습니다.

이 글도 확인해 보세요:  파이썬을 사용하여 FLAMES 게임 플레이하기

fs 모듈로 JSON 파일 읽기

JavaScript의 비동기 파일 시스템(fs) 모듈을 사용하여 JSON 파일을 읽으려면 먼저 기본 스크립트로 해당 파일을 가져와야 합니다. 아래 그림과 같이 필요한 코드 스니펫을 통합하면 이 작업을 수행할 수 있습니다:

 const fs = require("node:fs/promises");

18 이하의 Node.js 버전에서 fs 모듈을 활용하려면 다음 구조와 유사한 가져오기 작업을 수행해야 합니다:

 const fs = require("fs/promises");

특정 모듈의 동기 및 비동기 컴포넌트를 모두 통합하려면 해당 모듈을 전체적으로 가져올 때 `/promises` 지시문을 생략해야 합니다.

파일 경로와 선택적 구성 객체를 입력으로 받는 `readFile` 메서드는 JSON 파일을 읽는 프로세스를 용이하게 합니다. 이 구성 객체는 파일을 읽기 위한 선택 항목 모음 또는 인코딩의 문자열 표현으로 표현될 수 있습니다.

조사 중인 복잡한 현상을 종합적으로 이해하기 위해서는 역사적 맥락과 현대적 이슈를 포함한 다양한 요인에 대한 철저한 조사가 필요합니다.

문자 인코딩 매개변수는 특정 문서를 열람하는 과정에서 사용되는 코딩 시스템을 지정합니다. 일반적으로 사용되는 선택 항목은 문자로 구성된 서면 콘텐츠에 적합한 “utf8″과 주로 숫자 값으로 구성된 데이터 세트에 적합한 “바이너리”로 구성됩니다.

플래그 매개변수는 파일에 액세스할 때 사용되는 파일 시스템 속성을 지정하며, 일반적인 옵션으로는 열람용 ‘r’ 및 비문용 ‘w’ 등이 있습니다.

입력 텍스트를 표준화된 형식으로 변환하는 프로세스를 자연어 처리(NLP)라고 합니다. NLP에는 인간의 언어를 분석하고 이해하기 위해 토큰화, 어간, 품사 태깅과 같은 다양한 기술이 사용됩니다. 감정 분석, 기계 번역, 챗봇과 같은 분야에서 다양하게 활용되고 있습니다.

 fs.readFile("./users.json", { encoding: "utf-8", flag: "r" })
  .then((data) => {
    const users = JSON.parse(data);
    console.log(users);
  })
  .catch((error) => {
    console.error('Error reading the JSON file:', error);
  });

현재 알고리즘은 실행 폴더에 바로 저장되는 “users.json”이라는 로컬 JSON 문서에서 데이터를 추출합니다. 이 정보를 얻은 후에는 브라우저에서 제공하는 내장 함수인 ‘JSON.parse’를 사용하여 원래 JSON 형식에서 JavaScript 객체로 변환할 수 있습니다. 이렇게 하면 스크립트 코드 내에서 일반 자바스크립트 객체의 일부인 것처럼 해당 데이터의 내용을 탐색하고 수정할 수 있는 기능을 얻을 수 있습니다.

이 글도 확인해 보세요:  Vite로 React 앱을 설정하는 방법

더 작은 JSON 파일로 작업할 때 동기식 읽기를 위해 ‘require’ 함수를 활용하면 구문 분석된 콘텐츠를 JavaScript 객체로 자동 변환하는 옵션이 있습니다.그러나 이 접근 방식은 전체 파일 내용을 메모리 내에 캐시하는 경향이 있기 때문에 대용량 JSON 파일이나 비동기 처리가 필요한 상황에는 적합하지 않을 수 있습니다. 이러한 경우, 다양한 파일 콘텐츠 업데이트를 유연하게 관리하면서 JSON 데이터를 효율적으로 처리하려면 `fs.readFile` 메서드를 사용하는 것이 좋습니다.

fs 모듈로 JSON 파일 쓰기

writeFile 함수를 사용하여 정보를 구조화된 형식으로 저장하는 프로세스는 파일 경로, 문자열로 직렬화할 객체, 직렬화할 수 없는 값을 처리하기 위한 선택적 대체 함수의 세 가지 매개 변수를 제공함으로써 가능합니다.

컴퓨터 파일 시스템의 디렉토리 또는 파일 위치로, 루트에서 원하는 대상까지 파일 및 폴더의 계층 구조를 지정합니다.

파일에 포함하려는 정보는 문자열, 버퍼, 비동기 이터러블 또는 이터러블 객체와 같은 다양한 형태를 취할 수 있습니다.

사용자 지정 목적으로 제공될 수 있는 선택적 매개변수를 ‘선택적 구성 개체’라고 합니다.

본 기술은 지정된 파일의 내용을 추가하거나 재정의하기 위해 비동기 연산을 사용합니다. 파일이 이미 존재하는 경우 현재 내용이 제공된 데이터로 대체됩니다. 반대로 파일이 존재하지 않으면 입력 데이터를 사용하여 파일을 생성하고 채웁니다.

“어디든 가려면 여기서 나가야 해.” 정교하군요: “어떤 수준의 성공이나 발전을 이루기 위해서는 이 지역에서 벗어나는 것이 필수적입니다.

 const fakeUsers = [
  {
    id: 1,
    name: "John Doe",
    username: "johndoe123",
    address: {
      street: "123 Main St",
      city: "Anytown",
    },
  },
  {
    id: 2,
    name: "Jane Smith",
    username: "janesmith456",
    address: {
      street: "456 Elm St",
      city: "Another City",
    },
  }
];

fs.writeFile("./users.json", JSON.stringify(fakeUsers), {
  encoding: "utf-8",
  flag: "w",
}).catch((error) => {
  console.error('Error writing the JSON file:', error);
});

`writeFile` 함수를 사용할 때 전달되는 데이터는 문자열이거나 버퍼여야 합니다. 따라서 파일에 객체를 저장하기 위해서는 사전에 `JSON.stringify` 메서드를 사용하여 문자열로 변환해야 합니다.

fs 모듈로 JSON 파일 업데이트하기

파일 시스템 모듈은 파일을 덮어쓰면 이전 내용이 모두 지워지므로 파일을 직접 해결하는 방법을 제공하지 않습니다.

이 글도 확인해 보세요:  JES를 활용한 흥미로운 사운드 처리 기법 3가지

이 문제를 해결하기 위해 한 가지 방법은 `readFile` 함수를 사용하여 지정된 파일의 현재 내용을 검색하는 것입니다. 그런 다음 검색된 정보를 최신 데이터와 함께 통합하고 ‘쓰기 파일’ 메서드를 사용할 때 두 정보 세트를 한꺼번에 제출할 수 있습니다.

다음은 앞서 설명한 로직을 구현하는 파이썬 함수의 예입니다: “`python def calculate_total(order): subtotals = { ‘피자’: 0, ‘샐러드’: 0, ‘drink’: 0 } for item in order[‘items’]: item[‘type’] == ‘피자’: subtotals[‘pizza’] += item[‘quantity’] * item[‘price’] elif item[‘type’] == ‘샐러드’: subtotals[‘샐러드’] += item[‘수량’] * item[‘가격’] else: subtotals[‘음료’] += item[‘수량’] * item[‘가격’] total =

 const updateFile = async (filePath, data) => {
  try {
    const fileContents = await fs.readFile(filePath, {
      encoding: "utf-8",
      flag: "r",
    });

    const fileData = JSON.parse(fileContents);

    const updatedFileData = [...fileData, ...data];

    await fs.writeFile(filePath, JSON.stringify(updatedFileData), {
      encoding: "utf-8",
      flag: "w",
    });

    return "File updated successfully";
  } catch (error) {
    console.error('Error updating the JSON file:', error);
  }
};

함수는 다음과 같은 방식으로 호출할 수 있습니다:

 updateFile("./users.json", [
  {
    id: 4,
    name: "Jane Doe",
    username: "janedoe123",
    address: {
      street: "123 Main St",
      city: "Anytown",
    },
  },
  {
    id: 5,
    name: "John Smith",
    username: "johnsmith456",
    address: {
      street: "456 Elm St",
      city: "Another City",
    },
  }
]).then((message) => {
  console.log(message);
});

이 코드 블록은 위에 제공된 세부 정보를 통합하여 기존 `users.json` 파일에 있는 사용자 데이터를 보강합니다.

JSON 파일 읽기 및 쓰기에 대한 보안 고려 사항

JSON 파일을 처리하는 동안 Node.js 애플리케이션의 보안을 보장하는 것은 신중한 고려가 필요한 필수적인 측면입니다. JSON 데이터의 유효성을 검증하여 예상 매개변수를 준수하는지 확인하고, 파일 권한 수준을 제한하고 사용자 입력을 정리하여 코드 인젝션 공격과 같은 취약점을 방지하는 것이 필수적입니다.

By 김민수

안드로이드, 서버 개발을 시작으로 여러 분야를 넘나들고 있는 풀스택(Full-stack) 개발자입니다. 오픈소스 기술과 혁신에 큰 관심을 가지고 있고, 보다 많은 사람이 기술을 통해 꿈꾸던 일을 실현하도록 돕기를 희망하고 있습니다.