Node.JS ) require, os모듈, path모듈, url모듈, fs모듈
Programming/JS

Node.JS ) require, os모듈, path모듈, url모듈, fs모듈

반응형

목차

     


     

     

    1. require, exports

    자바에서 임포트해서 쓰던 클래스 -> 자바스크립트에서는 '모듈(Module)'을 require 한다고 표현한다.
     

    1.1. os모듈을 활용해보기

    const os = require('os');
    // 'os모듈의 기능을 담고있는 객체를 불러와, os변수에 (const형 변수)에 저장하고 사용할 것이다.' 라는 뜻
     
     
    console.log('운영체제 정보 -----------------------------------------------------------');
    console.log('os.arch() : ', os.arch());     // 현재 운영체제의 설계 및 운영방식
    console.log('os.platform() : ', os.platform()); //운영체제 기반 플랫폼
    console.log('os.type() : ', os.type() );        //운영체제 종류
    console.log('os.uptime() : ', os.uptime() );    // 운영체제 부팅 후 흐른시간
    console.log('os.hostname() : ',os.hostname() ); // 컴퓨터 이름
    console.log('os.release() : ', os.release() );  // 운영체제 버전
    
    
    console.log('경로 -----------------------------------------------------------');
    console.log('os.homedir() : ', os.homedir());   // 현재 사용자의 홈디렉토리(폴더)
    console.log('os.tmpdir() : ', os.tmpdir());     //현재 사용자의 임시 디렉토리(폴더)
    
    
    console.log('cpu 정보 -----------------------------------------------------');
    console.log('os.cpus() : ', os.cpus());             //cpu정보
    console.log('os.cpus().length : ', os.cpus().length);    // cpu 코어 개수
    
    
    console.log('메모리 정보 -----------------------------------------------------');
    console.log('os.freemem() : ', os.freemem());   // 사용 가능 메모리
    console.log('os.totalmem() : ', os.totalmem()); // 전체 메모리

     


     

    1.2. 모듈 내보내기 ( exports )

    위에서 본 os.js에서 처럼, Node.js에 내장되어 있는 'os' 모듈을 require하여 그 내부의 변수나 함수를 사용할 수 있었다면,
    이번에는 '내가 만든 객체를 export' 해두고 그것을 다른파일에서 require하여 사용'해본다.
     
    // Var.js
    
    const odd = '홀수입니다.';
    const even = '짝수입니다.';
    
    module.exports = {
        odd : odd,
        even : even,
    };
    • 만들어진 객체를 module.exports 에 저장하면 그 객체는 외부로 내보내진다.
    • 딱히 어느 파일로 내보낸다라는 방향은 없고,
      exports 되었다라는것 알고 있는 파일에서 'require해서 사용'한다.
    • module이라는 단위로, (var이라는 파일 이름으로) exports된다.

     


     

    1.3. 내보낸 모듈 요구하기 ( require )

    1.3.1. require 예제 1

    • require : 지정된 모듈을 import합니다.
    • Var에는 exports된 객체가 있으며, 그 안에는 odd, even 멤버변수가 있다.
    • 그리고 그것을 value변수에 담는다.
    // func01.js
    
    const value = require('./Var');
    console.log(value);

     

    1.3.1. require 예제 2

    // func02.js
    
    const value = require('./Var');
    
    const odd = value.odd;
    const even = value.even;
    
    console.log(odd);
    console.log(even);

     

    1.3.1. require 예제 3

    구조분해 후 할당하여 require로 얻어온 값을 담고, 그 값으로 함수를 제작하여 export 가능하다. 

    // func03.js
    
    // 구조분해 할당으로 변수 초기화
    const{odd, even } = require('./Var');
    
    // require로 얻어온 값을 이용한 함수 제작
    function checkOddOrEven(number){
        if(number % 2){
            return odd;
        }else{
            return even;
        }
    }
    
    // 모듈을 이용하면, 함수도 exports해서 다른 파일에서 사용이 가능하다.
    module.exports = checkOddOrEven;

     

    // index.js
    
    // const {odd, even} = require('./Var');
    
    const checkNumber = require('./func03');
    // checkNumber 변수에 func03.js 파일에서 exports한 함수를 require 했습니다.
    
    const result = checkNumber(15);
    console.log('15는 ', result);

     


     

    2. path 모듈

    // 04_Path.js
    
    const path = require('path');

    path모듈을 require하여 사용한다.


     

    2.1. path모듈이 아니지만 node.js에서 제공하는 파일경로 상수 

    __filename 현재 사용 중인 파일의 이름
    __dirname 현재 파일이 위치한 경로
    // path가 아니어도 사용 가능한 경로와 파일관련 상수
    console.log(__filename);    // 현재 사용중인 파일의 이름
    // D:\Java\00_JS\02_Internal_Module\04_path.js
    
    console.log(__dirname);     // 현재 파일이 위치한 경로
    // D:\Java\00_JS\02_Internal_Module
    
    // 현재 경로와 파일의 이름을 변수에 저장하여 별도 출력
    const string = __filename;
    console.log( string );	// D:\Java\00_JS\02_Internal_Module\04_path.js

     


    2.2. path 모듈 사용방법

    2.2.1. path.sep, path.delimiter

    path.sep 경로의 디렉토리 구분문자
    path.delimiter 경로와 경로르 구분하는 구분문자
    const path = require('path');
    
    // path.sep - 경로내부의 폴더들 구분문자
    console.log('path.sep : ', path.sep);   // path.sep :  \
    // '\' 백슬래시 -> c:\users\java01과 같이 사용한다.
    
    // path.delimiter - 경로와 경로를 구분하는 구분문자
    console.log('path.delimiter : ', path.delimiter);   // path.delimiter :  ;
    // 경로와 경로를 구분하는 구분문자 - 세미콜론 ' ; '
    // '경로1; 경로2; 경로3;' 와 같이 사용

     

    2.2.2. 주요 메서드 ( path.dirname( ), path.extname( ), path.basename( ) )

    path.dirname( string ) 파일이 위치한 폴더 경로를 보여준다
    path.extname( string ) 파일의 확장자를 보여준다
    path.basename( string ) 파일의 이름 + 확장자를 보여준다
    path.basename( string, path.extname( string ) ) 파일의 이름만 보고싶다면, 함수의 두번째 인자로 확장자를 넣어준다.
    // 04_Path.js
    
    const path = require('path');
    
    // 파일이 위치한 폴더 경로를 보여준다
    console.log('path.dirname() : ', path.dirname(string)); // path.dirname() :  D:\Java\00_JS\02_Internal_Module
    
    //파일의 확장자를(.js)를 보여준다.
    console.log('path.extname() : ', path.extname(string)); // path.extname() :  .js
    
    // 파일의 이름 + 확장자를 보여준다.
    console.log('path.basename() : ', path.basename(string));   //path.basename() :  04_path.js
    
    // 파일의 이름만 보고싶다면, 함수의 두번째 인자로 확장자를 넣어준다.
    console.log('path.basename (extname 제외)', path.basename(string, path.extname(string) ));  // path.basename (extname 제외) 04_path

     

    2.2.3. 경로 편집 메서드 ( path.parse( ), path.format( ), path.normalize( ) )

    path.parse( ) 파일의 경로를 root, dir, base, ext, name으로 분리한다.
    path.format( ) 파일의 경로와 이름, 확장자를 제공하고, '경로-파일명-확장자로 조합'한다.
    path.normalize( ) 파일 경로를 사용하다가 \나 /를 실수하면 수정한다.
    // 04_Path.js
    
    const path = require('path');
    
    // 파일의 경로를 root, dir, base, ext, name으로 분리한다.
    console.log('path.parse() : ', path.parse(string));
    // path.parse() :  {
    // root: 'D:\\',
    // dir: 'D:\\Java\\00_JS\\02_Internal_Module',
    // base: '04_path.js',
    // ext: '.js',
    // name: '04_path'
    // }
    
    // 파일의 경로와 이름, 확장자를 제공하고, 경로-파일명-확장자로 조합한다.
    console.log('path.format() : ', path.format({
        dir : 'D:\\Keonmon\\node_js',
        name : 'javascript_ex1',
        ext: '.js',
    }));    // path.format() :  D:\Keonmon\node_js\javascript_ex1.js
    
    // 파일 경로를 사용하던 중 \나 /를 실수로 여러번 쓴 것을 수정한다.
    console.log('path.normalize() : ', path.normalize('D:///Keonmon\\\/node_js\\\javascripts_ex1.js') );
    // path.normalize() :  D:\Keonmon\node_js\javascripts_ex1.js

     

    2.2.4. 그 외 메서드( path.isAbsolute( ), path.relative( ) ) 

    path.isAbsolute( ) 파일의 경로가 절대경로인지를 판단하여 참, 거짓을 반환한다.
    (true : 절대경로, false : 상대경로)
    path.relative( ) 두 인수 사이의 이동 경로를 표시한다.
    // 04_Path.js
    
    const path = require('path');
    
    // 파일의 경로가 절대경로인지 상대 경로인지 true false로 표시한다.
    console.log('path.isAbsolute(C:\\) : ', path.isAbsolute('C:\\'));   // path.isAbsolute(C:\) :  true
    console.log('path.isAsolute(./home) : ', path.isAbsolute('./home'));    // path.isAsolute(./home) :  false
    
    // 인수로 나오는 경로와 경로사이에 이동 경로를 표시한다.
    console.log('path.relative() : ', path.relative('D:\\JAVA01\\nodejs', 'D:\\')); // path.relative() :  ..\..
    // ' ..\.. '  -> 세번 부모폴더로 이동

     

    2.2.5. 전달인수를 통한 경로 표시( path.join( ), path.resolve( ) )

    path.join( ) 첫 경로(첫 번째 인수)로 시작하여 경로를 표시한다. ( '/' 를 상대경로로 판단 )
    path.resolve( ) 첫 경로(첫 번째 인수)로 시작하여 경로를 표시한다. ( '/' 를 절대경로로 판단 )
    // 04_Path.js
    
    const path = require('path');
    
    // 처음 경로부터 이후 나오는 경로로 이동한 폴더를 표시한다.
    console.log('첫 인수 경로(__dirname) : ' + __dirname); // D:\Java\00_JS\02_Internal_Module
    console.log('path.join() : ', path.join(__dirname, '..', 'Keonmon', '.', '/node_js') ); // path.join() :  D:\Java\00_JS\Keonmon\node_js
    // 현재 폴더에서 부모폴더로 이동, Keonmon 폴더로 이동, 현재 폴더에서, node_js 폴더로 표시
    // 결과 : D:\Keonmon\Keonmon\node_js
    // 이동 경로에 해당 폴더가 없어도 경로이름은 조합되어 결과로 나온다.
    
    console.log();
    
    // resoleve()와 join()은 비슷하지만 '/' 표시를 절대경로 또는 상대경로로 보느냐가 다르다.
    // resoleve()는 '/'를 절대경로로 판단하여 최종 결과 경로가 D:\node_js가 된다.
    console.log('첫 인수 경로(__dirname) : ' + __dirname); // D:\Java\00_JS\02_Internal_Module
    console.log('path.resolve() : ', path.resolve(__dirname, '..', '/Keonmon', '.', '/node_js') );  // path.resolve() :  D:\node_js
    // '/Keonmon'에 의해서 D:\Keonmon 되었다가 '/node_js'에 의해서 다시 D:\node_js로 설정된다.

     


     

     


    3. url 모듈

    3.1. url 모듈을 사용하지 않고, url객체 저장 방법

    // 05_Url.js
    
    const url = require('url');
    
    
    const { URL } = url;
    const myURL = new URL("https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=require");
    console.log('new URL():', myURL);   // url 객체 출력

     


     

    3.2. url 모듈 사용

    url.parse( ) url 문자열을 url 객체로 변환하여 리턴
    url.format( ) url 문자열을 리턴 ( parse( )의 반대되는 개념 )
    url객체.query url객체의 qurey속성 (그 외 속성도 가능)
    • url.parse : 인터넷 주소를 parse 함수로 분해하여 각각의 요소를 따로 분리해서 사용할 수 있다.
    • parse의 속성 중 query는 파싱된 주소에서 파라미터(쿼리) 부분만 분리하여 보여준다. 
    // 05_Url.js
    
    const url = require('url');
    
    
    // parse() : url을 url객체로 변환하여 리턴한다.
    // 인터넷 주소를 parse 함수로 분해하여 각각의 요소를 따로 분리해서 사용할 수 있다.
    const parsedUrl = url.parse("https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=require");
    console.log('url.parse():', parsedUrl);
    
    console.log('----------------------------');
    
    // format() : url문자열을 리턴
    console.log('url.format() : ', url.format(parsedUrl));
    // url.format() :  https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=require
    
    console.log('----------------------------');
    
     // url객체의 쿼리속성만 출력
    console.log("query : " + parsedUrl.query);
    // query : where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=require

     


     

    4. fs 모듈 ( file system )

    // 파일 읽기 쓰기를 위한 모듈
    const fs = require('fs');
    fs.readFile( filename, [options], callback ) 비동기 filename의 파일을 [options]의 방식으로 읽은 뒤, callback으로 전달된 함수를 호출
    fs.readFileSync( filename, [options] ) 동기 filename의 파일을 [options]의 방식으로 읽은 뒤, 문자열을 반환
    fs.writeFile( filename, [options], callback ) 비동기 filename의 파일에 [options]의 방식으로 data를 작성한 뒤, callback함수를 호출
    fs.writeFileSync( filename, [options] ) 동기 filename의 파일에 [options]의 방식으로 data를 작성

     

    4.1. readFile( )

    readMe.txt 파일을 미리 생성해둔다.

    4.1.1. 일반적인 readFile( ) 사용

    // 06_readFile.js
    
    // 파일 읽기 쓰기를 위한 모듈
    const fs = require('fs');
    
    fs.readFile( './readMe.txt', (err, data)=>{
        if(err){    //파일을 읽어오는데 에러가 발생해서 err 변수가 null이 아니라면
            throw err;
        }
    
        console.log(data);  
        // 버퍼형식으로 출력된다.
        // <Buffer ec 9d b4 20 ea b8 80 ec 9d 84 20 ec 9d bd ec 96 b4 eb b3 b4 ec 9e 90 2e>
    
        console.log("출력 : " + data.toString());
        // 이 글을 읽어보자.
    } );
    
    // # readMe.txt
    // 이 글을 읽어보자.
    
    // err : 파일 읽기에 실패했을 때 전달되는 값을 받는 매개 변수
    // data : 파일읽기에 성공했을 때 읽어온 파일 내용 데이터

     

    4.1.2. fs모듈에 promise를 포함할 경우의 readFile( )

    // 07_readFIlePromise.js
    
    // 파일 입출력을 위한 모듈의 promise를 포함하여 로딩한다.
    const fs = require('fs').promises;
    
    // # readMe.txt
    // 이 글을 읽어보자.
    
    // 파일 읽기도 에러처리를 위한 함수 없이 실행됩니다.
    fs.readFile('./readme.txt') // 이게 실행속도가 비교적 느리니까 나중에 실행됨.
    .then( (data)=>{
        console.log(data);
        // 버퍼형식으로 출력
        // <Buffer ec 9d b4 20 ea b8 80 ec 9d 84 20 ec 9d bd ec 96 b4 eb b3 b4 ec 9e 90 2e>
    
        console.log(data.toString());   // 이 글을 읽어보자.
    
    })
    .catch((err)=>{
        console.error(err);
    });
    
    // Promise는 비동기 실행이므로, 아래의 명령이 나중에 실행되도록 뒤에 기술해도, 실행속도가 빠른 명령이 먼저 실행되어 promise결과가 출력된다.
    console.log('Promise로 파일을 읽어왔습니다.')   // Promise로 파일을 읽어왔습니다.

    비동기 실행이 되어 나중에 입력한 출력이 먼저 실행되었다.

     


     

    4.2. writeFile( )

    4.2.1. 일반적인 writeFile( ) 사용

    // 08_WriteMe.js
    
    const fs = require('fs');
    
    fs.writeFile('./writeMe.txt', '텍스트가 입력됩니다.', (err) => {
        if(err){
            throw err;
        }
    });

    writeMe.txt파일이 생성되고, 텍스트가 입력되었다.

     

    4.2.2. fs모듈에 promise를 포함할 경우의 writeFile( )

    // 10_WriteFilePromise.js
    
    const fs = require('fs').promises;
    
    fs.writeFile('./writeMe3.txt', '안녕하세요. \n방갑습니다')
    .then(()=>{
        return fs.readFile('./writeMe3.txt');   // 파일을 읽어오는 프라미스를 리턴
    })
    .then((data)=>{
        console.log(data.toString());
        // 안녕하세요.
        // 방갑습니다
    })
    .catch((err)=>{
        console.error(err);
    });

    writeMe3.txt파일이 생성되고, 텍스트가 입력되었다.

     

    4.2.3. writeFile( )하고, readFile( )해보기

    // 09_WriteAndRead.js
    
    // writeme2.txt에 '안녕하세요. 방갑습니다.'를 쓰고 바로 읽어서 콘솔창에 출력하기.
    
    const fs = require('fs');
    const string = '안녕하세요. \n방갑습니다. \n또오세요 \n내일뵐게요!';
    fs.writeFile('./writeMe2.txt', string , (err) => {
        if(err){
            throw err;
        }
        
    });
    
    fs.readFile('./writeMe2.txt', (err,data)=>{
        if(err){
            throw err;
        }
        console.log(data.toString());
        // 안녕하세요. 
        // 방갑습니다.
        // 또오세요
        // 내일뵐게요!
    });

    writeMe2.txt파일이 생성되고, 텍스트가 입력되었다.

     


     

    4.3. fs모듈의 메서드는 '동기 / 비동기로 구분'된다

    4.3.1. readFile( )

    // 11_readFileAsync.js
    
    const fs = require('fs');
    
    console.log("시작");    // 시작
    fs.readFile('./readMe1.txt', (err, data)=>{
        if(err){ throw err; }
        console.log('1번', data.toString());    // 1번 저는 readMe1입니다.
    });
    
    fs.readFile('./readMe2.txt', (err, data)=>{
        if(err){ throw err; }
        console.log('2번', data.toString());    // 2번 저는 readMe2입니다.
    });
    
    fs.readFile('./readMe3.txt', (err, data)=>{
        if(err){ throw err; }
        console.log('3번', data.toString());    // 3번 저는 readMe3입니다.
    });
    console.log("끝");  // 끝

    비동기식이다 보니 순서가 엉망이다.

    4.3.2. readFile( )로 동기 처리하는 방법1

    // 11_readFileAsync.js
    
    const fs = require('fs');
    
    console.log("시작");    // 시작
    fs.readFile('./readMe1.txt', (err, data)=>{
        if(err){throw err; }
        console.log('1번', data.toString());    // 1번 저는 readMe1입니다.
        
        fs.readFile('./readMe2.txt', (err, data)=>{
            if(err){ throw err; }
            console.log('2번', data.toString());    // 2번 저는 readMe2입니다.
            
            fs.readFile('./readMe3.txt', (err, data)=>{
                if(err){ throw err; }
                console.log('3번', data.toString());    // 3번 저는 readMe3입니다.
                console.log("끝");  // 끝
            });
        });
    })

     

    4.3.2. readFile( )로 동기 처리하는 방법2 ( promise 활용 )

    // 12_readFileAsyncPromise.js
    
    const fs = require("fs").promises;
    
    console.log("시작");    // 시작
    fs.readFile('./readMe1.txt')
    .then((data)=>{
        console.log('1번', data.toString()) // 1번 저는 readMe1입니다.
        return fs.readFile('./readMe2.txt')
    })
    .then((data)=>{
        console.log('2번', data.toString()) // 2번 저는 readMe2입니다.
        return fs.readFile('./readMe3.txt')
    })
    .then((data)=>{
        console.log('3번', data.toString()) // 3번 저는 readMe3입니다.
        console.log("끝");  // 끝
    })
    .catch((err)=>{
        console.error(err);
    });

     

    4.3.4. readFileSync( )로 비동기 처리하기

    // 11_readFileAsync.js
    
    const fs = require('fs');
    
    console.log("시작");    // 시작
    let readMeFile = fs.readFileSync('./readMe1.txt')
        console.log('1번', readMeFile.toString());    // 1번 저는 readMe1입니다.
    
    readMeFile = fs.readFileSync('./readMe2.txt')
        console.log('2번', readMeFile.toString());    // 2번 저는 readMe2입니다.
    
    readMeFile = fs.readFileSync('./readMe3.txt')
        console.log('3번', readMeFile.toString());    // 3번 저는 readMe3입니다.
    
    console.log("끝");  // 끝


     

     

    반응형