본문 바로가기

이노베이션캠프/TIL

이노베이션 캠프 6일차_JSON 데이터가 정상 로드 안 되는 현상


fs/promises를 이용한 JSON 데이터 로드 문제 해결


 

🔧 문제: JSON 데이터가 정상적으로 로드되지 않음

오늘은 게임 서버에서 JSON 형식으로 저장된 업적 데이터를 fs.readFile로 불러오고 achievements에 할당하려 했으나, 값이 제대로 반영되지 않는 문제가 있었다.

 

❗ 주요 증상

  • Load() 함수 내부에서 JSON 파일은 정상적으로 읽힘.
  • 그러나 외부에 선언된 achievements 변수에 데이터를 할당해도 반영되지 않음.
  • console.log() 출력은 "데이터로드중..."까지만 되고, "데이터 로드 성공"은 출력되지 않음.

 

🔍 원인 분석

  • fs.readFile()을 await로 쓰려면 fs/promises를 사용해야 하는데, 일반 fs 모듈을 사용하고 있어서 콜백 기반 함수로 인식됨.
  • await fs.readFile(..., 'utf-8') 사용 시, utf-8이 콜백 함수 자리에 들어가면서 "The 'cb' argument must be of type function" 에러 발생.
import fs from 'fs'; // 문제 원인
  • writeFileSync()를 사용하려 했는데, fs.promises에서 writeFileSync는 제공되지 않아 TypeError 발생.
fs.writeFileSync() // 동기 방식이며, 콜백이나 Promise를 지원하지 않음

 

✅ 해결 방법

  • fs/promises를 import 하는 방식으로 통일:
import { promises as fs } from 'fs';

 

  • 동기 방식이 필요할 경우에는 fs.writeFileSync를 fs에서 따로 불러와야 함:
import fs from 'fs';
import { promises as fsp } from 'fs';

 

  • JSON 데이터를 loadData = JSON.parse(data)로 파싱한 후, Object.assign(target, loadData)로 기존 객체에 안전하게 병합.

 

💡 배운 점

  • fs.readFile()fs/promises.readFile()은 완전히 다르게 동작하며, await를 사용하려면 반드시 fs/promises를 사용해야 한다.
  • import 문에서 모듈을 혼용할 때는 함수 동기/비동기 여부에 따라 import 방식이 달라진다.
  • JSON 파싱 결과를 Object.assign()으로 기존 객체에 덮어쓰는 방식은 객체 참조를 유지하며 안전하게 데이터를 갱신할 수 있다.