동기 / 비동기

신동윤·2023년 1월 26일
0

자바스크립트는 왜 싱글 쓰레드일까?


<자바스크립트 런타임 환경>
결론! 자바스크립트 자체는 싱글 쓰레드가 맞지만 자바스크립트 런타임은 싱글 쓰레드가 아니다.
자바스크립트 비동기 런타임에서는 브라우저가 제공하는 API(멀티 쓰레드)가 관여하기 때문이다.

Call Stack: 자바스크립트에서 수행해야 할 함수들을 순차적으로 스택에 담아 처리
Web API : 웹 브라우저에서 제공하는 API로 AJAX나 Timeout등의 비동기 작업을 실행
Task Queue: Callback Queue라고도 하며 Web API에서 넘겨받은 Callback함수를 저장
Event Loop: Call Stack이 비어있다면 Task Queue의 작업을 Call Stack으로 옮김

이유는 바로 쉬워서이다. 만약 자바스크립트가 멀티 쓰레드로 실행되는 언어였다면 웹페이지에서 발생하는 동시성 문제에 대해 해결해야 했다. 실제로 멀티 쓰레드로 구현된 서비스에서는 이 동시성 문제에 대해 정말 많은 신경을 쓴다. 하지만 자바스크립트는 단일 쓰레드로 실행되므로 인해 교착 상태와 같은 다중 쓰레드 환경에서 발생할 수 있는 복잡한 시나리오를 신경 쓸 필요가 없으며 비동기 처리를 통해 쉽게 여러 요청을 처리할 수 있다.

비동기 이유

기존 동기식 요청은 코드를 한줄 한줄 차례대로 실행한다. 그래서 하나의 작업에 걸리는 시간에 관계 없이 첫 번째 코드가 실행 된 뒤 다음 코드가 실행된다. 이렇게 되면 앞의 작업시간이 길수록 시간 및 자원의 낭비가 심해진다.
따라서
이미지 처리 또는 API 호출과 같은 네트워크를 통한 요청과 같은 작업을 수행해야 할 때 비동기 호출을 사용합니다.

느린동작이 스택에 남아있는 것을 보통 Blocking이라고 한다. 콜스택을Blocking하면 렌더링이나 다른 코드를 실행하지 못한다. (싱글쓰레드)
Blocking작업 동안은 이벤트루프가 자바스크립트 실행을 계속할 수 없다.
그렇다면 Non-Blocking은 Blocking과 반대로 자바스크립트 코드가 실행되기 위해 자바스크립트가 아닌 작업을 기다리지 않아도 되는 상황이다.

자바스크립트에서 Blocking 메서드는 동기적으로, Non-Blocking 메서드는 비동기적으로 실행된다.

Promise

Promise가 생성될때, executor는 자동적으로 실행된다.
사용자가 요구하지않은 불필요한 네트워크 통신이 일어날 수 있다.

핸들러 resolve, result / reject, Error
.then(value => {}) = 성공했을때 resolve 받아옴 / 값을 바로 전달하거나 비동기 Promise를 전달한다.
.catch(error => {}) = 실패했을때 reject를 받아옴
.fainally(() => {}) = 뭐가 나오든 반환함

async & await

async를 함수앞에 쓰면 Promise 코드블록이 자동 생성된것과 같다.
await은 async안에 쓴다.


20:00
promise(뒷방으로보낼것의 결과).then(뒷방에서가져온것을 처리(함수형태로 정의하고 콜백으로 넘긴다,그리고 끝나면 다른 함수로 만들어줘)

좋은회사고르는팁 기술스택을 봐라 너무 예전기술스택인지, 공고에 기술스택 설명이 없는지

회사에 IT부서가 있는것보다 근본 IT기업도 괜찮다. 개취

0개의 댓글