동기, 비동기 호출에 대해서
영어로는 Synchronous, Asynchronous Call
들어가기에 앞서..
동기, 비동기 호출을 이해하기 위해서는 프로세스(스레드)에 대해서 알고있는 편이 좋다.
동기 호출
동기, 비동기 호출은 프로그램에서 멀티 프로세스(스레드) 환경에서 실행되는 경우 알아야하는 기본 개념이다.
동기 호출이란, 스레드(스레드나 프로세스, 본 문서에서는 두가지 개념을 동시에 나타냄) 가 하부 작업을 실행중일때(함수, 매서드, 이벤트 등) 스레드의 실행이 멈추게 되는 호출을 말한다. 따라서 하부 작업이 ‘완료’되기 전까지는 전체 스레드의 작업이 완료될 수 없다. 결론은 작업이 요청되는 순서대로 차근차근 빠르게 진행되지만 많은 작업을 동시에 실행할 수 없다는 단점이 있다.
비동기 호출
비동기 호출이란, 스레드에서 하부 작업을 요청시 하부 작업의 완료, 리턴에 상관 없이 스레드 실행이 계속 실행되고 있는 호출이다. 보통 이런 경우에는 상위 스레드가 하부 작업의 결과물이 언제 나올지 알 수 없으므로, 특정 시기(작업 진행 순서?)에 하부 작업의 결과 값을 호출하는 Callback매커니즘이 사용된다. 자바스크립트에서 변수를 만들고, 함수를 통해 특정값을 정하고 나중에 불러오는 방식을 뜻하는 것 같다.
Callback
비동기 호출로 실행되고 있는 스레드에서 리턴된 하부 작업의 결과물을 필요할때 불러오는 매커니즘이라고 생각하면 된다. 이걸 어떻게 쉽게 설명해야할지 모르겠다… 흠. func1 이라는 함수가 시작되었다고 보자. 중간에 특정 값이 필요해서 func2로 그 값을 구한다. func2가 값을 구하는 동안 func1은 그대로 코드를 진행해서 끝에 다다른다. func1 마지막에 func2를 통해 얻은 값을 불러와서 최종 값을 return하게 되는데 이때 func2 의 값을 불러오는 것을 callback이라고 한다.
이렇게 Callback은 코드를 매우 효율적으로 작성하는데 도움을 주지만 자칫 잘못하면 Callback Hell 이라는 늪에 빠지게 한다. (자매품 Dependency Hell) 콜백 헬에 대해서는 다음에 다뤄보도록 하겠다. Callback Hell을 해결하기 위해 Javascript Promise 라는 기능이 있는데, 이는 콜백 덩어리들을 한가지 덩어리로 묶는 작업이며, 자바스크립트 비동기 방식의 꽃이라고 불린다고 한다. 다음에 Promise에 대해서도 알아봐야겠다.
비동기적 자바스크립트
특정 함수(명령)이 실행됨과 동시에 다른 함수(명령)이 실행될 수 있다. Callback을 이용해 큰 도움을 받으면 된다.
JavaScript 코딩 시에는 서버쪽에 request를 날릴 일이 많은데 response를 받는 속도는 명령 실행속도보다는 훨씬 느리기 때문에 이걸 원래 짜왔던 대로 절차지향적으로 짜게 되면 문제가 생긴다. 따라서 JavaScript가 동기적으로 동작하길 원한다면 callback을 잘 이용해야 한다.
참고: 감성 프로그래밍 블로그, 데일리 엔지니어링 블로그, 바른모님 블로그, Harrison Jung님 미디엄