Node.js 3장

 

노드란 모듈로 만들수 있다는 점에서 브라우저의 자바스크립트와 다르다.

 

모듈 

 - 특정한 기능을 하는 함수, 변수들의 집합 

 - 그 자체로 하나의 프로그램이면서 다른 프로그램의 부품으로도 사용 가능하다.

 - 모듈을 만들떄는 모듈이 될 파일과 모듈을 불러와 사용할 파일이 필요하다. 

 

var.js 

const odd = '홀수입니다.';         

const even = '짝수입니다.';      

 

module.exports = {

   odd, 

   even,

};

 - var.js 파일에 변수 두개를 선언한 뒤 module.exports에 변수를 담은 객체를 대입

 - 변수들을 모아둔 모듈 

 - module.experts 대신  experts.odd = '홀수입니다.';  experts.even = '짝수입니다.'; 와 같이 experts 객체에 하나씩 삽입하는것도 가능하다.  (module.exports exports가 같은 객체를 참조하기 때문)

 

 

func.js 

const { odd, even } = require('./var');

 

function checkOddOrEven(num) {

     if (num % 2) {

       return odd;

}

return even;

}

module.exports = checkOddOrEven;

 

 - require 함수안에 불러올 모듈의 경로를 적어준다. (파일 경로에서 확장자는 생략가능)

 - var.js 에서 변수를 불러온 뒤 홀짝을 판단하는 함수를 선언해줬다. 

 - module.exports를 통해 var 모듈을 사용하는 모듈을 만들어줬다. 

 

index.js

const { odd, even } = require('./var');

const checkNumber = require('./func');

 

function checkStringOddOrEven(str) { 

    if (str.length%2) {

      return odd;

}

  retrun even;

}

console.log(checkNumber(10));                  // 짝수입니다.

console.log(checkStringOddOrEven('hello'));   // 홀수입니다.

 

 - index.js는 var.js, func.js를 모두 참조한다.

 - 이처럼 모듈 하나에 여려개의 모듈을 사용하는것이 가능하다. 

 - 모듈로부터 값을 불러올 때 변수 이름을 다르게 지정할 수 있다. 

  ( checkOddOrEven 함수를 checkNumber라는이름으로사용 )

 

 

 

동기 메서드와 비동기 메서드

 

const fs = require('fs');

 

console.log('시작');

fs.readFile('./readme2.txt', (err,data=> {

    if(err){

        throw err;

    }

    console.log('1번'data.toString());

});

fs.readFile('./readme2.txt', (err,data=> {

    if (err){

        throw err;

    }

    console.log('2번'data.toString());

});

fs.readFile('./readme2.txt', (err,data)=> {

    if(err){

        throw err;

    }

    console.log('3번'data.toString());

});

console.log('끝');

 

결과 

시작

2번 저를 여러 번 읽어보세요.

3번 저를 여러 번 읽어보세요.

1번 저를 여러 번 읽어보세요.

 

 - 반복 실행할 떄마다 결과가 달라진다.

 - 비동기 메서드들은 백그라운드에 해당 파일을 읽으라고만 요청하고 다음 작업으로 넘어간다.

 - 따라서 파일읽기 요청만 세 번을 보낸 뒤 '끝' 을 찍는다. 

 - 나중에 읽기가 완료되면 백그라운드가 메인 스레드에 알려주고, 메인스레드는 그 때 등록된 콜백 함수를 실행한다. 

 - 메인 스레드가 백그라운드에 요청처리를 위임하는 것이다.

 - 백그라운드가 요청처리가 완료됐다고 알려주면 그떄 콜백함수를 실행한다.

 

 

 

동기 - 블로킹 방식

 - 백그라운드 작업 여부를 계속 확인한다.

 - 호출한 함수가 바로 return되지 않고 백그라운드 작업이 끝난 후 return 된다.

 

블로킹과 논블로킹 

 - 호출한 함수가 바로 return되어 다음 작업으로 넘어간다. 

 - 백그라운드 작업 완료 여부는 신경쓰지 않고 나중에 완료 알림을 줄 때 처리한다.

 

 

노드의 버퍼와 스트림

 - 노드는 파일을 읽을 때 메모리에 파일의 크기만큼 공간을 마련해둔다.

 - 파일 데이터를 메모리에 저장한 뒤 사용자가 조작할 수 있게 해준다. 

 - 이 메모리에 저장된 데이터가 버퍼이다. 

 

 

버퍼 

 

const buffer = Buffer.from('저를 버퍼로 바꿔보세요');

console.log('from():'buffer);

console.log('length:'buffer.length);

console.log('toString():'buffer.toString());

 

const array = [Buffer.from('띄엄'), Buffer.from('띄엄'), Buffer.from('띄어쓰기')];

const buffer2 = Buffer.concat(array);

console.log('concat():'buffer2.toString());

 

const buffer3 = Buffer.alloc(5);

console.log('alloc():'buffer3);

 

 - from(문자열) : 문자열을 버퍼로 바꿀 수 있다. (length = 버퍼의 크기를 알려줌(바이트 단위))

 - toString(버퍼) : 버퍼를 문자열로 바꿀 수 있다. 

 - concat(배열) : 배열안에 든 버퍼들을 하나로 합친다.

 - alloc(바이트) : 빈 버퍼를 생성한다. 바이트를 인자로 정해주면 해당 크기의 버퍼가 생성된다. 

 - 메모리 용량의 문제가 발생할 수도 있다.

 - 모든 내용을 버퍼에 다 쓴 후에 다음 동작으로 넘어가기 때문에 매번 전체 용량을 버퍼로 처리해 주어야 다음 단계로 

  넘어갈 수 있다.

 

 

스트림 

 

const fs = require('fs');

 

const writeStream = fs.createWriteStream('./writeme2.txt');

writeStream.on('finish', () => {

    console.log('파일 쓰기 완료');

});

 

writeStream.write('이 글을 씁니다\n');

writeStream.write('한 번 더 씁니다\n');

writeStream.end();

 

 

fs의 메서드 

 

fs.access (경로, 옵션, 콜백)

 - 폴더나 파일에 접근할 수 있는지 체크하는 메서드 

 

fs.mkdir (경로, 콜백)

 - 폴더를 만드는 메서드 (이미 폴더가 존재하면 에러발생)

 

fs.open (경로, 옵션, 콜백)

 - 파일의 아이디를 가져오는 메서드 (파일이 없다면 생성한 뒤 가져옴)

 

fs.rename (기존경로, 새 경로, 콜백)

 - 파일의 이름을 바꾸는 메서드 

 

fs.readdir (경로, 콜백)

 - 폴더안의 내용물을 확인하는 메서드 

 

fs.unlink (경로, 콜백)

 - 파일을 지울 수 있는 메서드 (파일이 없다면 에러 발생)

 

fs.rmdir (경로, 콜백)

 - 폴더를 지울 수 있는 메서드 (폴더 안에 파일이 있으면 에러 발생)

 

fs.copyFile (복사할 파일, 복사될 경로, 콜백) 

 - 파일을 복사해주는 메서드 

'Node.js' 카테고리의 다른 글

REST API  (0) 2019.12.04
npm과 npx  (0) 2019.12.04
Node.js 4장  (0) 2019.11.27
Node.js 1장  (0) 2019.11.23
Node.js 2장  (0) 2019.11.20
TAGS.

Comments