오늘 에러핸들링 공부를 하다가
동기함수인 경우와 비동기함수인 경우에 에러핸들링의 방법이 다르다는 걸 알게되었다.
아직 동기/비동기의 개념이 명확하게 잡히지 않은 상태인지라,
개념을 짚고 넘어가보려한다.
동기/비동기의 키워드는 함수의 시작과 종료의 시점!
블로킹/논블로킹의 키워드는 제어권!
Blocking / Non-blocking 과 Sync / Async 는 얼핏 보면 비슷한 개념이지만,
관점에 따라 엄연히 다른 개념이므로
이러한 2:2 매트릭스도 있다....
IBM developerWorks 2:2 매트릭스
자주 쓰이는 두 가지 케이스만 살펴보면, 아래와 같다
- 블로킹 + 동기
호출한 함수는 다른 함수를 호출해도 제어권을 넘겨주지 않고 있다가,
(그동안 호출한 함수는 아무것도 하지 않고 기다림)
호출된 함수의 작업이 끝나고 나서야 제어권을 넘겨준 후 다음 작업이 시작됨
- 논블로킹 + 비동기
함수를 호출함과 동시에 제어권을 넘겨주고,
(그동안 호출한 함수는 다른 일을 함)
추후 호출된 함수가 작업이 끝나서 return해도 호출한 함수는 넘겨받은 콜백을 바로 처리하지 않을 수 있음 (이벤트 루프의 처리 순서에 따름)
자바스크립트는 싱글 쓰레드로 동작하기 때문에 한 번에 한 가지 일만 수행할 수 있고,
그렇기 때문에 동기적인 프로그램이라고 할 수 있는데...
현재의 웹처럼 복잡하고, 동시 다발적인 요청에 빠르게 응답하기 위해서는
비동기 처리가 필수적이다.
비동기처리를 하기 위한 방식으로는 아래 세가지 방법이 있다.
1. callback 함수
2. Promise
3. async / await
이름처럼 나중에 호출되는 함수로, 다른 함수의 인자로 이용되거나 어떤 이벤트가 발생했거나 특정 시점에 도달했을 때 시스템에서 호출하는 함수
프로미스는 비동기처리에 사용되는 객체로,
서버에 데이터를 요청할 때 데이터를 다 받아오기도 전에 데이터를 다 받아온것 마냥 화면에 오류가 발생하거나 빈 화면이 뜬다. (동기처리로 인해 발생한 오류)
이와 같은 문제점을 해결하기 위한 방법이 중 하나가 프로미스.
프로미스의 세가지 상태
: 프로미스의 상태(states)란 프로미스의 처리과정을 말한다.
new Promise()로 프로미스를 생성하고 종료될 때까지 3가지 상태를 갖는다.
이렇게 동기/비동기, 블로킹/논블로킹, 비동기처리로 진행하는 세 가지 방법을 살펴보았다.
앞으로 뗄레야 뗄 수가 없는 것들이니 잘 기억하고 적용할 수 있도록 해야겠다 - !!