티스토리 뷰
Node.js 또는 자바스크립트는 동기식, 비동기식으로 동작하는 API를 지원합니다. 절차 지향, 객체 지향 프로그래밍 언어인 C/C++, Java로 애플리케이션을 개발한 사람은 비동기식으로 동작하는 API를 사용하는 것이 낯설게 느껴질 수 있습니다. 하지만, 비동기 처리 API는 코드 작성이 어렵지만, 메인 스레드 이외 별도의 스레드 풀에서 동작하므로 병렬 처리가 가능하여 작업의 효율을 높일 수 있습니다. 비동기 API가 어떻게 동작하는지 이해한다면, 비동기 처리 로직을 손쉽게 작성하실 수 있습니다. 이번 포스팅에서는 Node.js 환경에서 비동기로 동작하는 API를 실행 원리를 분석하여, 비동기식 처리 로직을 이해하는 방법을 알아보겠습니다.
비동기식 처리와 동기식 처리 비교
동기식(Synchronous) 처리와 비동기식(Asynchronous) 처리 방식에 관하여 간단하게 알아보겠습니다. 동기식 처리란, 프로그램 실행 중 외부 시스템에 연결 또는 다른 함수를 호출하였을 때, 결과 값이 반환될 때까지 기다리는 방식입니다. 동기식 처리는 메인 스레드의 실행 흐름이 중단되므로, Blocking 방식이라고 부릅니다. 다음으로, 비동기식 처리란, 프로그램 실행 중 외부 시스템에 연결 또는 다른 함수를 호출한 이후 결과 값이 반환되기를 기다리지 않고 메인 스레드의 실행을 계속 진행하는 방식입니다. 비동기식 처리 로직을 작성할 때, 결과 값이 반환될 경우 호출될 함수를 별도로 작성해야 하는데, 이러한 함수를 콜백 함수라고 부릅니다. 비동기식 처리는 실행 흐름이 중단되지 않으므로, Non-Blocking 방식이라고 부릅니다.
동기식으로 처리하는 로직은 구현하기 쉽지만, 선행 로직이 완료되지 않을 경우 후행 작업이 진행되지 않아 작업 처리효율이 좋지 않습니다. 비동기식 처리 로직은 선행 로직이 완료되지 않아도, 후행 작업을 시작할 수 있어 작업의 효율이 좋습니다. 단, 동기식보다 비동기식 로직을 구현하는 것이 조금 더 어렵게 느껴질 수 있습니다.
코드로 알아보는 비동기 처리 실행 원리 분석
자바 스크립트는 실행 중, 비동기 요청 처리 완료되었을 때 실행 흐름이 바로 변경되는 것이 아니고, 함수 단위로 실행 분기가 결정됩니다. 즉, 자바스크립트는 CallStack에 쌓인 순서대로 함수를 순차적으로 실행합니다. 예제 코드를 실행하여, 비동기 처리 함수가 언제 실행되는지 확인해보겠습니다.
- 제일 먼저 console.log('main start') 함수가 실행됩니다. (Line 11)
- asyncFunc 함수가 호출되고, Promise 안에 작성된 setTimeout 함수를 실행합니다. setTimeout은 비동기 API이므로, 별도의 스레드에서 실행이 되고, 1초 뒤 setTimeout에 정의한 CallBack함수가 CallStack에 저장됩니다. (Line 4, 12)
- sleep(10000) 함수는 10초 동안 for문을 실행하는 함수이므로, 10초간 대기합니다. (Line 21)
- Async.js 파일을 실행한 메인 함수가 종료된 후, CallStack에 저장된 setTimeout의 Callback함수를 실행합니다. (Line 4)
- Promise에 정의 Callback함수에서 resolve함수가 호출되어, asyncFunc()의 then 함수가 실행됩니다. (Line 3, 12, 14)
Async.js 파일 실행결과를 보면, sleep 함수가 호출된 후 10초 대기한 뒤 바로 'setTimeout Call'이 출력된 것 결과를 확인할 수 있습니다. Sleep함수에서 10초 동안 반복문을 실행하는 동안 setTimeout함수는 별도의 스레드로 동작하여 1초 후 callback함수를 callstack에 저장하여 다음 실행 흐름을 저장한 것입니다. Sleep함수가 종료되자마자, callstack에 settimeout, then에서 정의한 콜백 함수가 호출되었습니다.
비동기 실행의 핵심 원리는 바로 스레드(Thread)입니다. 비동기로 처리되는 API는 프로그램을 실행하는 담당하는 메인 스레드 이외의 별도의 스레드 풀에서 동작되어 병렬 처리가 가능합니다. 자바스크립트에서 병렬로 작업을 처리해야 할 경우, 작업량을 분배(Load balancing) 한 후 비동기 API를 호출합니다. 그리고 Callback함수로 비동기 처리결과를 합치면, 병렬 처리가 구현되는 것이죠.
지금까지 Node.js에서 비동기 처리 로직의 실행 원리를 알아보았습니다.
'IT 기술' 카테고리의 다른 글
디자인 패턴 - 책임 연쇄(Chain of Responsibility) (0) | 2022.09.16 |
---|---|
구글 애드센스 승인 후기 (22년 6월 기준) (0) | 2022.09.13 |
[Node.js] 멀티 쓰레드, 멀티 프로세스로 병렬 처리하기 (0) | 2022.09.13 |
[Node.js] 설치 및 서버-클라이언트 예제 작성하기 (0) | 2022.09.13 |
JUnit 기반 Java 테스트 코드 작성방법 (1) | 2022.09.13 |
- Total
- Today
- Yesterday
- AWS
- springboot build
- OSI 7계층
- python
- 디자인패턴 구조패턴
- 클린코드작성원칙
- C++
- springboot restapi
- 디자인패턴
- 코드스멜 유형
- 스프링부트 restapi
- SPA
- 멀티코어 멀티프로세서
- oracle pga sga
- springboot 실행
- notion 업무일정관리
- 스프링부트빌드
- iframe 태그 찾기
- codesmell 유형
- 스프링부트실행
- notion
- springboot rest api 서버
- MPA
- 클린코드작성법
- oracle 메모리
- TCP/UDP
- API Gateway 캐싱
- selenium
- token
- 테스팅 자동화
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |