[Node.js] 5. synchronous & asynchronous(동기,비동기)
synchronous & asynchronous
우리는 어떤 일을 해결하기 위한 여러 과정들과 방식이 필요합니다. 그 중에서 동기, 비동기적 처리 방식은 문제를 해결하는 과정을 정하는 방식이고, 운영체제에선 이를 스케줄링 이라 하는데, 말 그대로 각 스레드가 어떠한 방식으로 프로그램들을 실행 시킬지 정하는 일종의 규칙입니다.
1. synchronous - 동기적 처리
기본적으로 동기적 처리 방식은 아래 규칙들을 따릅니다.
위에서 아래로 순차적으로 처리 된다.
요청에 따른 결과가 돌아올 때까지 다음 동작을 대기한다.
즉 효율성에 상관없이 언제든 순서대로 진행되는 방식이기 때문에 간편하다는 장점이 존재하지만,
결과 값을 기다리는 비효율적인 시간적 손해가 발생하는 방식입니다.
2. asynchronous - 비동기적 처리
비동기적 처리 방식은 아래 규칙들을 따릅니다.
요청과 결과가 각각 따로 발생된다.
요청에 대한 동작을 백그라운드 작업으로 작업하기에 별도의 대기 시간이 발생되지 않는다.
비동기적 처리 방식은 동기적 처리 방식에 비해 효율적인 자원 관리가 가능하고, 백그라운드 작업으로 동작하기 때문에병렬적인 처리 또한 가능하다는 장점이 존재하지만, 코드의 복잡성이 동기적 처리에 비해 많이 높다.
2023-03-16 내용 추가
동기적 처리 명령어
동기, 비동기적 파일을 처리하는 방법은 여러가지가 존재하는데 그 중 파일을 읽어오는 readFile을 예시로
설명하겠습니다. 먼저 fs.readFileSync(path,options)는 파일을 동기적으로 읽어오는 방식입니다.
readFileSync는 코드 순서대로 실행되며, 명령어가 끝날 때 까지 다음 명령어는 대기 합니다.
fs.readFileSync(path,options)
path : 읽어올 파일의 경로
option : 각종 플로그인 등
var fs = require('fs');
//readFileSync
console.log('a');
var result = fs.readFileSync('./sample.txt','utf-8');
console.log(result);
console.log('c\n');
동기적 명령어인 readFileSync의 결과를 보면 node.js의 fs 모듈이 console 명령어의 순서에 따라 차례대로 실행하는 것을 볼 수 있습니다.
비동기적 처리 명령어
다음 명령어인 fs.readFile(path,options,callback)은 파일을 비동기적으로 읽어오는 방식입니다.
readFile는 callback 함수를 추가함으로써 자신의 작업을 정하거나, 결과를 비동기적으로 출력하게 해주는 역할을 합니다.
fs.readFileSync(path,options,callback)
path : 읽어올 파일의 경로
option : 각종 플로그인 등
callback : err - 에러 발생 시 실행, data - 실행 결과
//readFile
console.log('a');
fs.readFile('./sample.txt','utf-8',function(err,result){
if(err) {
return console.error(err);
}else {
console.log(result);
}
});
console.log('c');
비동기적 명령어 readFile을 보면 function(err,result)가 추가되고 별도의 var 변수가 생성되지 않는 걸 볼 수 있습니다.
- 비동기적 명령어는 이 callback 을 통해 순서를 제어하고 readFileSync는 return 값이 존재해서 변수 선언이 가능하지만
readFile의 경우 결과가 callback 함수로 들어가기 때문에 별도의 return 값이 존재하지 않습니다.
결과 또한 동기적 명령어가 먼저 실행 된 후 비동기 명령어가 실행되는 것을 볼 수 있습니다.
- 이벤트 루프가 동기적 명령어를 먼저 수행 시킨 후 비동기적 명령어를 처리하기 때문입니다.
정리
비동기(Asynchronous) 함수란 쉽게 설명하면 호출부에서 실행 결과를 가다리지 않아도 되는 함수입니다.
동기 함수(Synchronous) 함수는 호출부에서 실행 결과가 리턴될 때 까지 기다려야 하는 함수입니다.
비동기 함수는 별도의 리턴 값이 존재하지 않고 순서를 제어하여, 중간에 대기하는 시간이 존재하지 않지만
동기 함수는 코드 순서에 따라 진행하고 명령어 수행 중 다음 명령어를 대기 시키기 때문에 대기 시간이 존재합니다