본문 바로가기
> 개발/Node.js & Express

[Node.js]Node.js의 fs모듈로 디렉토리와 파일 추가 함수 만들기

by @일리 2023. 6. 5.

내 단짝 친구와 TIL 을 공유하는 스터디를 하고 있다. 친구는 자동화와 효율에 관심이 많아서 셸 스크립트로 TIL 파일을 자동으로 추가하도록 구현했다고 했다. 내가 아는 것은 js와 리액트뿐이었기 때문에 나는 어떻게 파일을 추가할 수 있을까 고민하다가 node.js의 fs모듈을 활용하기로 했다. 

구현 목표

TIL 파일과 폴더명
TIL 파일과 폴더명

1. 새로운 주가 시작되었을 때 2023-06-둘째주와 같은 이름의 디렉토리 만들기

2. 디렉토리 안에 오늘 날짜의 md 파일 생성하기

fs 모듈

fs 모듈은 이름 그대로 file system과 관련된 모듈이다. 파일은 물론 디렉토리 추가/삭제/읽기와 같은 작업을 수행할 때 사용한다. 

파일의 최상단에 const fs = require( "fs" );  를 입력한 뒤 관련 매서드를 사용하면 된다.

 

내가 사용한 매서드는 existsSync, mkdirSync, writeFile 이다.

매서드에 Sync가 붙는 경우와 붙지 않는 경우가 있다. Sync가 붙은 것은 동기적으로 실행하는 것이고, Sync가 생략된 것은 비동기적으로 실행한다.

구현 방법

1. 오늘 날짜 구하기

const fs = require("fs");

// 두 자리로 만들어주는 함수(6월 -> 06월)
const makeTwoDigits = (data) => {
  return data.toString().padStart(2, "0");
};

// 오늘 날짜 구하기
const today = new Date();
const year = today.getFullYear();
const month = today.getMonth() + 1;
const date = today.getDate();

 

오늘 날짜를 구해서 몇 주차인지 계산을 해서 디렉토리명을 설정하고, 그 다음에 오늘 날짜로 된 이름의 파일을 만들어야 한다. 예전에 스탑워치에서 했던 대로 new Date()를 활용해서 오늘 날짜의 year, month, date를 구하자.

 

2. 몇 주차인지 구해서 폴더명 만들기

// 폴더명 : 몇 주차인지 구하기
const getWeekNumber = (year, month, date) => {
	// 이것은 손을 좀 봐야돼서 일단 비공개
};

const week = getWeekNumber(year, month, date);
const weeks = ["첫째주", "둘째주", "셋째주", "넷째주", "다섯째주"];

const dirName = `${year}-${makeTwoDigits(month)}-${weeks[week - 1]}`;

// 디렉토리 만들기
const makeDir = (dirName) => {
  if (!fs.existsSync(dirName)) {
    fs.mkdirSync(dirName, (err) => {
      if (err) {
        console.log("디렉토리 생성 중 오류가 발생!!");
      } else {
        console.log("디렉토리 추가 완료!");
      }
    });
  }
};

 

getWeekNumber는 year, month, date를 넣어서 오늘이 몇 주차인지 구하는 함수다. 6월엔 잘 작동을 하는데 7월에서는 오류가 나는 듯해서 조만간 손을 볼 예정이다. 6월에 바빠서 손 볼 시간이 부족해서 일단 비공개...week가 1인지 2인지 3인지에 따라 첫째주, 둘째주, 셋째주 등으로 표현할 수 있도록 weeks[week-1]을 해주었당

 

fs.existsSync(path) : boolean 

existsSync 파라미터로 경로를 입력하면 디렉토리의 유무에 따라 boolean을 반환해준다. console.log(fs.existsSync(dirName))을 하니 이미 디렉토리가 만들어져있기 때문에 true를 반환했다.

fs.existsSync의 결과값
boolean을 반환한다.

디렉토리가 없는 경우에 mkdirsSnyc 가 실행된다.

 

fs.mkdirSync(path, [options])

dirName 을 받아 dirName의 이름을 가진 디렉토리를 만든다. 만약 err가 발생하면 console.log로 에러가 발생했다고 알려주고, 성공했으면 디렉토리 추가가 완료됐다고 알려주도록 만들었다.

3. 해당 주차 내부에 오늘 날짜명을 가진 md 파일 만들기

// 파일명 : 오늘 날짜 형식 만들기
const dateFormatting = (year, month, date) => {
  return `${year}-${makeTwoDigits(month)}-${makeTwoDigits(date)}`;
};

const dateFormat = dateFormatting(year, month, date);

// 파일 만들기
const makeFile = (dirName, dateFormat) => {
  // 만약 기존 파일이 이미 있다면 추가하지 않음.
  if (!fs.existsSync(`${dirName}/${dateFormat}.md`)) {
    fs.writeFile(
      `${dirName}/${dateFormat}.md`,
      `# ${dateFormat}의 TIL`,
      (err) => {
        if (err) {
          console.log("에러 발생!:", err);
        } else {
          console.log("파일이 성공적으로 추가되었습니다.");
        }
      }
    );
  } else {
    console.log("이미 파일이 존재합니다.");
  }
};

makeDir(dirName);
makeFile(dirName, dateFormat);

 

파일을 만들 때도 existsSync로 이미 오늘 날짜의 파일이 존재하는지 확인한 후, 파일이 없을 때만 writeFile 매서드로 파일을 만들도록 구현했다. 

 

fs.writeFile(path, data, callback)

path에는 파일의 경로, 그러니까  2023-06월-둘째주 폴더 내부에 2023-06-06.md 파일을 만들도록 하고

data에는 파일의 내용을 입력하면 된다. 나는 파일 첫째 줄에 다음과 같이 입력되도록 했다.

마지막으로 err가 생기면 console.log로 에러를 알려주고, 성공했으면 파일이 성공적으로 추가했다고 알려주게 했다.

만들어진 파일 내부

한계

node.js로 구현했기 때문에 100% 자동화로 파일과 디렉토리가 추가되진 않는다. 내 친구는 셸 스크립트 + crontab 을 이용해서 100% 자동화가 가능하도록 만들었다고 한다. 반면 나는 직접 node fs.js로 매번 파일을 실행시켜줘야 한다. setInterval로 일정 시간마다 함수가 자동 실행되도록 할 수 있을 것 같기도 한데 씁 파일을 닫으면 결국 매번 실행해줘야 하는 건 똑같을 것이다. 스케줄링을 해주는 관련 라이브러리가 있는듯해서 나중에 적용해보고 후기쓰러 와야겠다. 일단 이번달은 너무 할 게 많기 때문에 우선순위에 있는 것들부터 해치워야겠다...큐큐

댓글