Notice
Recent Posts
Recent Comments
Link
상똥이의 Back-End 공부방
[Node.js] 동기, 비동기 및 Node.js의 비동기 처리 본문
1. 동기 (Synchronous)
- 한 작업이 끝난 다음에 다음 작업을 수행
- 작업1의 요청이 있을 경우, 작업1의 요청이 접수되고 응답이 발생하기 전까지 다른 작업은 수행하지 않음
function readDataSync() {
const data = readFileSync('data.txt'); // 파일을 동기적으로 읽음
console.log(data);
}
console.log('Start');
readDataSync();
console.log('End');
/* 결과
Start
data.txt 내용 출력
End */
2. 비동기 (Asynchronous)
- 한 작업이 실행중이더라도 다른 작업을 수행
- 시간이 오래 걸리는 작업이 있더라도 다른 작업을 수행하는데에 지장이 없음
function readDataAsync() {
readFile('data.txt', (data) => { // 파일을 비동기적으로 읽음
console.log(data);
});
}
console.log('Start');
readDataAsync();
console.log('End');
/*
결과
Start
End
data.txt 내용 출력
*/
3. 장단점
동기 | 비동기 | |
장점 | - 코드 흐름이 직관적이며 이해하기 쉬움 - 순차적 처리로 디버깅 용이 |
- 동시에 여러 작업을 처리할 수 있어 성능 우수 - 어느 작업이 다른 작업의 성능에 영향을 미치지 않음 |
단점 | - 이전 작업의 완료까지 대기하므로 특정 작업이 오래 걸리는 경우 전체 성능 저하 | - 코드가 복잡해짐 - 여러 비동기 작업이 연관되어 있으면 코드 흐름을 파악하기 어려움 |
4. Node.js의 비동기 작업
- Node.js는 비동기 처리를 위해 callback, Promise, async/await을 사용
- 아래의 로직들은 모두 같은 결과를 반환함
(1) callback
- Node.js 초기부터 사용해온 방식
- 비동기 작업이 완료된 후 실행할 함수를 인수로 전달
- 여러 개의 callback함수를 중첩해서 사용하는 경우 콜백지옥에 빠질 수 있음
function findAndSaveUser(USers) {
Users.findOne({}, (err, user) => { // 콜백함수 1
if (err) {
return console.error(err);
}
user.name = 'zero';
user.save((err) => { // 콜백함수 2
if (err) {
return console.error(err);
}
Users.findOne({gender : 'm'}, (err, user) => { // 콜백함수 3
...
})
})
})
}
(2) Promise
- callback 지옥을 해결하기 위해 도입된 방식, then, catch, finally 메서드로 결과를 처리함
- 실행은 바로 하되, 결괏값은 나중에 받는 객체
- then 또는 catch로 결괏값을 받으며 finally로 무조건 실행할 로직 설정 가능
function findAndSaveUser(Users) {
Users.findOne({})
.then((user) => {
user.name = 'zero';
return user.save();
})
.then((user) => {
return Users.findOne({ gender : 'm' });
})
.then((user) => {
...
})
.catch(err => {
console.log(err);
});
}
(3) async/await
- Promise의 문법을 더 간단하게 적용시켜주는 역할
- 반복되는 then, catch를 제거해 코드를 깔끔하게 만들어줌
- async 키워드가 사용된 함수 내부에서만 await 사용 가능
async function findAndSaveUsers(Users) {
try {
let user = await Users.findOne({});
user.name = 'zero';
user = await user.save();
user = await Users.findOne({ gender : 'm' });
...
} catch (error) {
console.error(error);
}
}
'Node.JS' 카테고리의 다른 글
[Node.js] Node.js기초 (0) | 2024.09.03 |
---|