Node.js-콜백함수, 동기/비동기
callback함수
var a = [3,1,2];
function b (v1, v2) {return v2-v1;};
a.sort(b);
- 위와 같이 메소드 인수로 함수가 넣어질때에만 함수가 호출되는 함수를 callback함수라고 한다.
- b라는 변수를 만들어 메모리할당하는 것이 낭비이므로 익명함수로 아예 호출할 때에만 쓰이도록 인수자리에서 선언을 해버린다.
a.sort(function(v1, v2) {return v2-v1;}); a.sort((v1, v2)=>(v2-v1));
- 참고로 sort()는 매개변수로 함수를 받을 수 있는 성격의 아이임.
동기와 비동기 프로그래밍
- 동기 : 빨래 30분해서 끝내고 설거지 30분 해서 끝내고 청소 30분 해서 종료한다.
- 비동기 : 빨래, 설거지, 청소 업체에 전화해서 일이 다 끝나면 알려달라고 말만하고 대략 3분만에 일처리가 끝난다. → 이렇게 처리하면 뭐가 먼저 처리될지 알 수 없으므로 순서가 중요하지않을 때 효율적이다.
- 동기 : 한 명 한 명에게 이메일을 보내는거 → 한명 당 1초라면 만 명의 사람에겐 10000초가 걸림.
- 비동기 : 발행버튼 누르면 이메일을 보내는 별도의 시스템에게 10000명에게 이메일을 보내라고 위임을 하는것이다. 그리고 난 다른 작업하러 룰루~
→ 동기와 비동기 프로그래밍을 코드로 알아보자
var fs = require("fs");
// sync방식
console.log(1);
var data = fs.readFileSync("test.txt", {encoding : "utf8"});
console.log(data);
// async방식
console.log(2);
fs.readFile("test.txt", {encoding : "utf8"}, function(err,data){
console.log(3);
console.log(data)
});
console.log(4);
- 위에서 readFile()메소드 안에 있는 function(){} 이거는 콜백함수이다.
- 그래서 콜백함수는 비동기프로그래밍에서 쓰인다는 것을 알 수 있다.
- test.txt에는 hello sync and async라고 쓰여져있다.
- 위의 코드를 실행하면 아래와 같이 나온다.
1 hello sync and async 2 4 3 hello sync and async
- 출력 결과가 2,3,4가 아닌 2,4,3인 걸 알 수 있다.
- 이유는 비동기방식의 특징때문이다. 비동기방식인 readFile()은 전화로 해달라고 부탁만해놓고 프로그램은 다음 자기가 할 일인 console.log(4)을 하러가버린거다.
- 그리고 readFile()이 끝났을 때 그 결과가 나온것이다. 만약 readFile()이 굉장히 길게 10분동안 처리되어야하는 코드이면 먼저 다른 걸 끝내도록 이런 비동기방식이 지향된다. 10분이 걸리는 상황인데 동기방식이면 계속 10분 내내 사용자가 기다려야하는 불상사가 발생한다.
→ Node.js 서버코드로 동기와 비동기 작동을 알아보자
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
- 위에서 listen()함수는 매개변수로 콜백함수를 설정하는데 이는 비동기적인 작동이다.
- listen()함수가 시간이 오래걸릴 수 있는 함수이기 때문이다.
- listen()함수가 완료되었을 때 콜백이 실행되는 것!
- 콜백함수 쓸 때 새로운 문법이 나왔는데 결국 익명함수 간단하게 표현한 축약형이라 생각하면됨.
(req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World\n'); }
- 위의 함수는 결국 아래와 같은 말인데 간단히 축약한 것 뿐이다.
function (req, res){ res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World\n'); }
댓글남기기