티스토리 뷰
path 모듈
파일의 경로와 관련된 모듈
path 모듈이 왜 필요할까
1. 경로 구분자를 통일할 수 있다.
- 윈도우 : 역슬래시(\) 사용 (예: C:\Users\myCom\Desktop\myNode\basics\03\example.txt)
- 맥OS : 슬래시(/) 사용 (예: /Users/myCom/Desktop/myNode/basics/03/example.txt)
위와 같이 컴퓨터 운영체제에 따라 경로를 나타내는 기호가 다르다.
path 모듈을 사용하면 경로 구분자를 하나로 통일해서 적용할 수 있다.
2. 경로를 나누거나 합칠 수 있다.
여러 조각으로 되어 있는 문자열을 묶어서 경로로 표현할 수 있다. (아래 예문으로 확인해보자)
절대경로와 상대경로
- 절대경로 : 파일이나 폴더의 위치를 루트 폴더부터 시작해서 파일까지 전부 다 나타내는 것
C:\Users\myCom\Desktop\myNode\basics\03\example.txt //윈도우
/Users/myCom/Desktop/myNode/basics/03/example.txt //맥
- 상대경로 : 어떤 파일을 기준으로 하여 사용하는 경로,
- 특정 파일 A가 기준이 되는 파일과 같은 폴더에 있을 경우 './A' 로 표기
- 특정 파일 A가 기준이 되는 파일보다 한 단계 위 부모 폴더에 있을 경우 '../A' 로 표기
- 특정 파일 A가 기준이 되는 파일의 하위 경로에 있을 경우 . 없이 '/A'로 표기
node.js 공식 문서 path 모듈 참고하기
https://nodejs.org/docs/latest/api/path.html
Path | Node.js v23.7.0 Documentation
Path# Source Code: lib/path.js The node:path module provides utilities for working with file and directory paths. It can be accessed using: const path = require('node:path');import path from 'node:path';copy Windows vs. POSIX# The default operation of the
nodejs.org
node.js 공식 사이트의 문서 카테고리에서 path 모듈을 조회해보면,
path 모듈에서 사용할 수 있는 함수 리스트를 안내하고 있으니 참고하자.
path 모듈 예제
- join 함수 : 여러개의 텍스트 조각으로 하나의 경로를 만들 수 있는 함수
- dirname 함수 : 전체 경로에서 파일명 제외하고 경로만 추출하는 함수
- basename 함수 : 전체 경로에서 경로 제외하고 파일명만 추출하는 함수
const path = require('path');
//전체경로 만들기 : join
const fullPath = path.join('some', 'work', 'ex.txt');
console.log(fullPath);
//파일명 제외하고 경로만 추출 : dirname
const dir = path.dirname(fullPath);
console.log(dir);
상단에 require 문으로 path 선언 후, 위와 같이 사용하면 된다.
fullPath에는 some\work\ex.txt 라는 파일명을 포함한 전체경로가 찍혔고,
dir에는 some\work 라는 파일명을 제외한 경로만 찍혔다.
const path = require('path');
//경로 제외하고 파일명만 추출 : basename
const fn1 = path.basename(__filename); //전체경로 filename에서 확장자 포함한 파일명 추출
const fn2 = path.basename(__filename, '.js'); //전체경로 filename에서 확장자 제외한 파일명 추출
console.log(`전체경로 (__filename) : ${__filename}`);
console.log(`파일명 : ${fn1}`);
console.log(`확장자 제외한 파일명 : ${fn2}`);
* __filename : global 모듈에 있던 속성으로, 현재 파일의 전체 경로를 담고있는 값이다.
* path.basename( __filename ) : 현재 파일의 전체 경로( __filename) 에서 basename(파일명)을 추출해달라는 뜻이다.
실행해보았더니 콘솔창에 위와 같이 출력되었다.
basename 함수는 확장자를 포함한 파일 이름을 가져오게 할 수도 있고, 확장자를 뺀 이름만 가져오게 할 수도 있다.
File System 모듈 (fs 모듈)
fs 모듈은 동기식 함수와 비동기식 함수를 구별하여 제공하고 있다.
https://nodejs.org/docs/latest/api/fs.html
File system | Node.js v23.7.0 Documentation
nodejs.org
위 공식 문서를 봐보면
파일을 읽어온다거나 할 때 동기식으로 처리하고 싶으면 Synchronous API 의 함수를 참고하면 되고,
비동기식으로 처리할 경우에는 Callback 함수 형태인지, Promise를 사용할 것인지에 따라 각각 다른 함수를 안내하고 있으니 해당하는 부분을 참고하면 된다.
스크롤 내려보면 엄청 많다...
fs.readdir 함수 (비동기식 콜백함수)
위 공식 문서에서 Callback API 리스트를 살펴보면
fs.readdir(path [, options], callback) 이라는 함수가 있다.
위 타이틀을 눌러서 상세 내용을 확인해보자.
fs.readdir 함수의 파라미터 path, options, callback 에 대한 내용을 확인할 수 있다.
options는 선택사항이고, path와 callback은 필수 매개변수이다.
options의 매개변수로는 encoding, withFileTypes, recursive 가 있고,
callback의 매개변수로는 err(에러 표시), files(가져온 내용 정보) 가 있다.
콜백함수는 (err, files) =>{} 형태로 작성하면 된다.
아래 예제를 살펴보자.
const fs = require('fs'); //fs모듈 가져옴
//readdir 매개변수 중 path와 callback은 필수로 작성한다.
fs.readdir("./", (err, files) => {
if(err){
console.log(err);
}else{
console.log(files);
}
});
readdir 함수는 지정한 path에 있는 파일들을 읽어오는 함수이다.
readdir의 매개변수 중 path와 callback은 필수로 작성해야 한다.
path는 ./ 로 입력하여 "현재 폴더" 로 지정하였고, callback은 (err, files) => {} 형태로 작성하였다.
에러가 발생할 땐 에러를 찍어주고, 에러가 발생하지 않았을 땐 가져온 files를 찍어주도록 작성하였다.
결과를 실행해 보았다.
list-2.js 파일이 있는 현재 경로인 C:\doitNode\basics\03 폴더에 있는 모든 파일들이 콘솔창에 찍혔다.
* readdir은 비동기식 콜백함수였다.
* readdirSync는 동기식으로 처리하는 함수이다. Synchronous API 의 readdirSync 문서도 참고해보자.
파일 읽고 쓰기
비동기 함수 readFile, writeFile 사용해본다.
fs.readFile
fs.readFile 함수는 path, callback이 필수 매개변수이고,
callback에는 err, data 라는 매개변수로 콜백함수를 작성하는 것을 알 수 있다.
fs.writeFile
fs.writeFile 함수는 file, data, callback이 필수 매개변수이고,
callback 에는 err 라는 매개변수로 콜백함수를 작성하는 것을 알 수 있다.
fs.readFile 함수 예제
const fs = require("fs");
//현재 폴더의 example.txt 내용을 읽어줘
fs.readFile("./example.txt", (err,data)=>{
if(err){
console.log(err);
}else{
console.log(data);
}
});
위와 같이 작성하고 실행했다.
콘솔창에 알아볼 수 없는 바이너리 코드가 찍혔다.
인코딩을 지정하지 않으면 메모리에 있는 상태 그대로 보여주기 때문이다.
사람이 알아볼 수 있는 텍스트로 바꿔서 표현하려면 "인코딩"을 지정하면 된다.
*node.js에는 buffer라는 메모리 공간이 있다.
*위 결과는 buffer에 저장된 데이터를 바이너리 형태로 그대로 보여주고 있는 모습이다.
const fs = require("fs");
//인코딩 "utf8" 추가
fs.readFile("./example.txt", "utf8", (err,data)=>{
if(err){
console.log(err);
}else{
console.log(data);
}
});
인코딩을 지정하고 (utf8) 다시 실행했다.
read-3.js와 같은 폴더(./) 밑에 있는 example.txt 파일의 내용이 콘솔창에 잘 찍혔다.
fs.writeFile 함수 예제
위 fs.readFile 함수로 불러온 data를 새로운 파일명으로 저장하는 예제를 작성해보겠다.
const fs = require("fs");
fs.readFile("./example.txt", "utf8", (err,data)=>{
if(err){
console.log(err);
}else{
fs.writeFile("./testWriteFile.txt", data, (err)=>{
if(err){
console.log(err);
}else{
console.log("파일 저장 완료!");
}
})
}
});
위처럼 작성하고 실행해보았다.
콘솔창에 파일 저장 완료! 메세지가 출력됐고,
basics의 03 폴더 아래 testWriteFile.txt 파일이 만들어졌다.
https://youtu.be/cbnOhi9ZtWg?feature=shared
https://youtu.be/cv33E5EXuwI?feature=shared
'백엔드 > Node.js' 카테고리의 다른 글
[Node.js] express로 서버 만들고 라우팅하기, nodemon 설치, HTTP 모듈 vs express 비교 (0) | 2025.02.12 |
---|---|
[Node.js] 네트워크, IP, port, HTTP 모듈로 서버 만들고 라우팅 하기 (0) | 2025.02.12 |
[Node.js] 모듈이란, 2가지 모듈 시스템, 모듈 만들어보기, 코어 모듈, 글로벌 모듈 (0) | 2025.02.10 |
[Node.js] Node.js 백엔드 기초(2, 완) - express 프레임워크 설치, express로 간단한 API 만들기 (0) | 2025.02.07 |
[Node.js] Node.js 백엔드 기초(1) - node.js 시작하기, npm 정의와 기본 개념, npm 모듈 설치, 삭제 해보기 (0) | 2025.02.05 |