node.js로 서버를 실행하고 동작시키며 공부하다보니 async await이라는게 항상 사용되는게 눈에 들어왔다, 짝을 이뤄 사용한다는 것은 알겠는데 왜 쓰는지, 어떤 개념인지 몰라서 글로 정리해본다.
동기와 비동기?
동기(sychronous) 는 설계가 간단하고 직관적이지만, 해당 프로세스가 종료될때까지 다른 것을 못하고 대기하고 있어야한다. 연산이 오래걸리는 작업의 경우 대기시간이 무한하게 길어질수있다.
비동기(asynchronous) 는 동기보다 설계가 복잡하지만, 해당 프로세스가 종료 될 때까지 대기하지 않고, 다른작업을 진행할 수 있다. 연산이 오래걸리는 작업이더라도 실행시켜놓고 종료될때까지 다른 작업을 진행하고 있으면 된다.
내가 이해한 예시로는
요리사가 A 주문과, B주문을 받았는데 동기의 경우 A주문을 다 요리한 다음 B 주문을 처리하는 것이고 비동기의 경우 A주문을 요리하는 동안 B주문도 처리를 하는 것이다. A주문을 처리하며 끝나지 않더라도 B주문에 필요한다른 행동을 하는 방식으로 말이다. 그러다 A주문이 끝나면 내주면된다. 이후 B주문도 완료되는대로 내주면된다.
왜 사용할까?
- 일반적으로 자바스크립트에서 비동기 처리를 하는데 사용되는 방법은 Callback 함수, Promise, async/await 이 있다. Callback 함수의 경우 콜백지옥(callback hell)이 발생할 수 있다는 문제점이 있고 그것을 해결하기 위한 Promise는 코드가 길다는 문제점이 있다.
어떻게 사용할까?
1. async는 function 앞에 위치한다.
- function 앞에 async가 위치하는 경우 해당 function은 항상 promise를 반환한다.
- promise가 아닌 값을 반환하더라도 이행 상태의 프로미스로 값을 감싸 반환한다.
2. await 은 async 함수 안에서만 동작한다.
- JavaScript는 await 키워드를 만나면 프로미스 처리가 될때까지 기다리고, 결과는 그 후에 반환된다.
promise는 JavaScript 비동기 처리에 사용되는 객체이다.
'개인공부 기록 > JavaScript' 카테고리의 다른 글
[JavaScript] 클로저(Closuer) (0) | 2022.08.17 |
---|---|
[JavaScript] 스코프 체인(Scope Chain), 렉시컬환경 (0) | 2022.08.13 |
[JavaScript] CSV파일 추가하여 출력하기 (0) | 2022.07.31 |
배열에 특정단어를 포함한 문자 삭제하기 (2) (0) | 2022.07.23 |
문장에서 특정단어를 포함한 문자 삭제하기 (split, splice, join, indexof) (0) | 2022.07.21 |