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 |