상똥이의 Back-End 공부방

[Node.js] 동기, 비동기 및 Node.js의 비동기 처리 본문

Node.JS

[Node.js] 동기, 비동기 및 Node.js의 비동기 처리

상똥백 2024. 11. 4. 23:48

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