nodejs docs를 살펴보면 opendir는 opendir() 함수는 디렉터리 이름에 해당하는 디렉터리 스트림을 열고 반환하는 함수이다.
const fs = require("fs");
const path = './programmers';
fs.opendir(path, { bufferSize: 64 }, (err, dir) => {
if (err) {
console.error('Error opening directory:', err);
return;
}
console.dir(dir, "dir")
});
이제, NodeJS의 fs 모듈 내의 opendir의 실행 과정을 살펴보자.
🧐
NodeJS는 크게lib
폴더와src
폴더로 이루어져 있다.
lib 폴더 내에는 NodeJS의내장 모듈 라이브러리
가 들어 있고,
src 폴더 내에는C++ 코드가 구현
되어 있다.
Nodejs Github의 dir.js에 접속해 보자.
lib/internal 폴더 속 dir.js
파일에 opendir
의 함수가 구현되어 있다.
opendir 함수를 살펴보면 유효성 검사를 실시
하고 dirBinding 함수의 opendir 메서드를 호출
하고 있다.
✅ 다음으로, dirBinding
를 가져오는 곳을 한 번 살펴보자
require
을 사용하지 않고 internalBinding
으로 모듈을 가져오는 것으로 보인다.
internalBinding
은 Nodejs가 Javascript를 C++에 바인딩할 때 사용하는 메서드라고 한다.
즉, Javscript에서 C++을 호출할 때 사용하는 방법인 것이다!
다음으로 C++ 코드가 존재하는 Nodejs Github의 node_dir.cc에 접속해 보자
openDir 함수
를 보면 아래와 같이 SystemCall
을 통해서 uv_fs_opendir
을 호출하는 것을 볼 수 있다.args.GetReturnValue()~
로 끝나는데 [Node.js] C++ Addon 적용 [출처] [Node.js] C++ Addon 적용|작성자 경직를 참고해보면 GetReturnValue에 값을 Set 해주면 자동으로 리턴값으로 인식하고 가져간다고 한다.
libUV
라이브러리에서 설명하는uv_fs_opendir
은 아래와 같이 설명하고 있다.
https://docs.libuv.org/en/v1.x/fs.html#c.uv_fs_opendir
https://github.com/nodejs/node/blob/main/lib/internal/fs/dir.js#L289
https://github.com/nodejs/node/blob/main/src/node_dir.cc
https://blog.naver.com/PostView.naver?blogId=sssang97&logNo=221994411876
https://man7.org/linux/man-pages/man3/opendir.3.html