체인의정석

node.js에서 파일만들기, 폴더만들기, 읽어오기 (fs 기능들 정리) - DB데이터 교차검증 시 사용한 함수들 정리 본문

개발/backend

node.js에서 파일만들기, 폴더만들기, 읽어오기 (fs 기능들 정리) - DB데이터 교차검증 시 사용한 함수들 정리

체인의정석 2023. 4. 21. 11:54
728x90
반응형

이번에는 블록체인 데이터가 누락없이 저장되고 dev의 환경을 로컬에 다시 구현했을때 제대로 구현이 되고 누락된 사항이 없는지 체크하는 프로그램을 설계하고 구현하였다.

일단 각 데이터를 테이블별로 가져와서 json파일로 경로 생성 후 만들고 두 배열을 비교하는 모듈을 작성해서 두 배열을 비교했다. 이 경우 fs모듈을 통해 자유자재로 파일을 만들고 경로를 만드는 코딩이 필요했다. 이때 사용한 문법들을 아래에 정리해 보았다.

fs 모듈 가져오기

var fs = require('fs');

makeFolder기능

const makeFolder = (dir) => {
    if(!fs.existsSync(dir)){
        console.log("make folder in : ", dir)
        fs.mkdirSync(dir);
    }
}

fs.existsSync(dir)를 통해 해당 경로에 폴더가 있는지 체크하고

fs.mkdirSync(dir)를 통해 해당 경로에 폴더를 만든다.

파일쓰는 기능 fs.writeFileSync

        fs.writeFileSync(`${__dirname}/${data}.json`, JSON.stringify(res, null, 2), function (err) {
                    if (err) throw err;
         })

fs.writeFileSync를 사용한다.

이때 경로의 경우 __dirname 을 쓰면 현재 파일의 경로가 들어가게 되므로 현재 파일로 부터 어디에 파일을 만들지 정해서 넣어주면 된다. 상황에 맞게 파일 이름을 여러개 바꾸어서 저장하는 구문의경우 위와 같이 문자열 안에 변수를 넣어서 만들 수 있다.

파일에 저장할 데이터의 경우 만약 배열 형태라면 위와 같이 JSON.stringify를 통해서 문자열로 만든 후 저장해 주어야 한다.

그리고 가독성을 높이기 위해서 뒤에 옵션을 null, 2로 두면 사람의 눈으로 읽기 좋은 형태로 데이터가 파일로 만들어지게 된다.

내가 사용할 때는 반복문 안에 해당 파일 쓰기를 넣어두고 res 안에 파일명에 필요한 정보와 내용에 필요한 정보를 넣고 이를 이용해서 폴더를 만들고 그 안에 데이터에 맞게 데이터와 경로를 집어 넣었다.

동기화 시켜서 실행시키기

파일을 만드는 함수의 경우 그냥 만들게 되면 동기화가 잘 안되기 때문에 먼저 계산을 하고 그 다음에 .then을 사용해서 파일을 만들고 그 다음 함수를 호출하고 하는 식으로 자동화를 시켰다.

이때 함수에서는 개발환경 및 폴더명과 같이 기록할 정보를 같이 가져와서 응답값으로 주면 실제로 파일을 만들 때 해당 값들을 적재적소에 넣어서 활용하면 된다.

Class명.함수이름()
.then((res) => {
    makeFolder(`${__dirname}/../output/output_${route}/폴더명`)
    for(data of res) {
        fs.writeFileSync(`${__dirname}/../output/output_${route}/폴더명/${data.A}_${data.B}.json`, JSON.stringify(data.C, null, 2), function (err) {
            if (err) throw err;
         })
    }
})
.then(async() => await Class명.2번째함수이름())

readdirSync로 하나의 경로에 여러개의 파일이 있는 경우 다 가져오기

fs.readdirSync('./dirpath', {withFileTypes: true})
.filter(item => !item.isDirectory())
.map(item => item.name)

만약 분기처리를 하다가 하나의 경로에 여러개의 파일 이름을 가져와서 해당 파일들을 모두 읽어야 할 경우 위와 같이 fs.readdirSync를 사용하면 된다. 위와 같은 코드를 실행하게 되면 아래처럼

['file1.txt', 'file2.txt', 'file3.txt']

이런 값들이 나오게 된다.

 

fs.readFileSync로 파일 읽어오기

  async getEachInfo(path_from, path_to) {
    const jsonFile_from = fs.readFileSync(`${path_from}`)
    const jsonData_from = JSON.parse(jsonFile_from);
    const jsonFile_to = fs.readFileSync(`${path_to}`)
    const jsonData_to = JSON.parse(jsonFile_to);
    return [jsonData_from, jsonData_to];
  }

다음과 같이 각 path를 변수로 지정해두었다면 readFilsSync로 파일을 읽어올 수 있다.

 

읽어온 2개의 파일 배열 비교하기

function compareArrays(arr1, arr2, env1, env2) {

    const diff = {
      [env1]: [],
      [env2]: [],
      differentValues: []
    };
  
    arr1.forEach((item, index) => {
      const indexInArr2 = arr2.findIndex(x => x === item);
      if (indexInArr2 === -1) {
        diff[env1].push(item);
      } else if (JSON.stringify(item) !== JSON.stringify(arr2[indexInArr2])) {
        diff.differentValues.push(item);
      }
    });
  
    arr2.forEach((item, index) => {
      const indexInArr1 = arr1.findIndex(x => x === item);
      if (indexInArr1 === -1) {
        diff[env2].push(item);
      }
    });
  
    return diff;
}

위의 함수를 이용하면 서로 다른 2개의 배열을 비교하여 차이점만 저장할 수 있다.

나는 위의 함수들을 이용해서 데이터베이스에서 해당하는 요소들을 뽑아낸 후 환경 별로 비교하는 검토 로직을 짰다.

728x90
반응형
Comments