본문 바로가기

[자바스크립트] 블로킹과 논블로킹, 동기와 비동기

 

 

들어가며

여행을 떠나보면, 언젠가 왜 이 여행을 하려 했을까 하는 생각이 들 때가 있었습니다. 공부를 할 때도 마찬가지였습니다. Node.js를 활용해서 개발을 하고 있는데, 왜 Node.js를 활용하는지 문득 궁금했습니다. Node.js의 특징, 장단점, 그리고 다른 언어와의 차이를 알아보며 Node.js에 대해 이해해야겠다고 생각했습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Node.js는 무엇인가?

먼저 Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다. 즉 Node.js는 JavaScript를 실행할 수 있는 환경입니다. Node.js가 세상에 나오기 전까지는 JavaScript를 실행하는 환경은 브라우저뿐이었지만 Node.js를 이용해 브라우저 외에서도 JavaScript를 실행할 수 있습니다. 그렇다면 Node.js에 대해 조금 더 자세하게 살펴보겠습니다.

 

 

 

 

 

 

 

위에서 가볍고 효율적이라는 것은 알겠는데, 이벤트 기반, 논 블로킹 I/O 모델은 무엇이고 왜 효율적이라고 하는 것일까요? 일단 블로킹, 논블로킹, 동기, 비동기에 대해 먼저 알아보고, 그 후 왜 Node.js가 가볍고 효율적인지에 대해 알아보겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

블로킹과 논블로킹 

블로킹이란 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것이며, 논블로킹은 다른 주체의 작업에 관련 없이 자신의 작업을 하는 것을 말합니다. 

 

 

 

 

블로킹에 대해 예시를 통해 살펴보겠습니다. 예를 들어 A라는 직원이 서류를 작성해서 Blocking 상사에게 전달한다고 가정하겠습니다. Blocking 상사는 서류를 다 읽을 때까지 직원 보고 기다리라고 합니다. 그러면 해당 직원은 아무 일도 못하고 기다려야 합니다. 그리고 Blocking 상사는 서류를 다 읽고 나서 직원에게 돌아가라고 합니다. 그러면 이때부터 직원은 다시 자기 일을 처리할 수 있게 됩니다. 

 

 

 

 

그럼 논블로킹에 대해서도 예시를 통해 살펴보겠습니다. 이번에도 서류를 논블로킹 상사에게 전달한다고 가정하겠습니다. 논블로킹 상사는 서류를 받고 나서 직원에게 읽어볼 테니 돌아가세요라고 말합니다. 직원은 Blocking 상사와는 다르게 돌아가서 자기 일을 할 수 있게 되었고 상사는 직원이 일하러 간 사이에 서류를 읽고 있습니다.

 

즉 블로킹과 논블로킹은다른 주체가 작업할 때 자신의 제어권이 있는지 없는지로 차이를 살펴볼 수 있습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

동기와 비동기 

동기란 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미하고, 비동기란 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음을 의미합니다. 

 

이번에도 동기와 비동기를 예시를 통해 살펴보겠습니다. 먼저 동기 상사에게 서류를 전달한다고 했을 때 동기 상사는 블로킹 상사와 논블로킹 상사가 아니기 때문에 기다리거나 다른 일을 해도 신경 쓰지 않습니다. 사원은 동기 상사가 서류를 보고 전달해준 결과를 가지고 빠르게 업무를 처리하고 싶은데, 상사가 전달받은 서류를 다 읽고 나서 결과를 돌려주면 사원은 바로 처리하겠습니다 하고 처리를 합니다. 

 

그리고 비동기 상사에게 서류를 전달한다면, 비동기 상사는 동기 상사와는 다르게 일을 바로 처리해주지 않아도 괜찮아합니다. 블로킹 상사와 논블로킹 상사가 아니기 때문에 기다리거나 다른 일을 해도 신경 쓰지 않습니다. 비동기 상사는 서류를 다 읽고 나서 해야 할 일을 나중에 확인하라고 적어서 보내줍니다. 이 사원은 나중에 내용을 확인하고 언젠가 일 처리를 하면 됩니다.

 

즉 동기, 비동기는 결과를 돌려줬을 때 순서와 결과에 관심이 있는지 아닌지로 판단할 수 있습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

네 가지의 경우를 살펴보자

그렇다면, 위의 4 가지 경우에는 어떻게 동작하는지에 대해 살펴보겠습니다. 

 

 

 

 

 

1. 블로킹 동기

블로킹의 관점은 제어권에 있어서 다른 작업이 시작되는 동안 동작하지 않습니다. 그리고 동기의 관점은 결과의 처리입니다. 따라서 결과를 반환하면 해당 업무를 바로 처리하게 됩니다. 

 

이번에도 사원과 상사의 예시를 들어보면, 사원이 블로킹 동기 상사에게 서류를 전달했을 때, 블로킹 동기 상사는 사원에게 자신이 해당 서류를 다 읽을 때까지 기다리라고 합니다. 이는 블로킹의 동작에 따라 행동한 것이고, 상사가 서류를 다 읽고 나서 결과를 사원에게 전달하면 사원은 해당 업무를 바로 처리하게 됩니다. 이는 동기의 동작에 따라 행동한 것입니다. 

 

 

출처 :[10분 테코톡] 🐰 멍토의 Blocking vs Non-Blocking, Sync vs Async

 

 

예를 들어, 블로킹 동기는 입력 요청을 할 때 사용합니다. 제어권이 넘어갔기 때문에 아래 내용이 실행이 되지 않고 있다가 입력하면 제어권과 결과를 같이 받아서 처리합니다. 

 

 

 

 

 

 

 

 

2. 논 블로킹 동기

논 블로킹은 다른 작업이 있어도 자신의 제어권을 가지고 일을 하는 것이라 했습니다. 그런데 동기는 결과에 관심이 있는 거라고 했습니다. 그래서 중간중간마다 작업이 끝났는지 물어보게 됩니다. 만약 결과가 안 나왔다면 돌아가게 됩니다. 바쁜 대기 현상이 나타나게 되는데, 만약 결과를 받을 수 있으면 이제 해당 결과를 가지고 와서 업무를 처리하게 됩니다. 

 

이번에도 사원과 상사의 예시를 살펴보면, 이번에는 사원이 논블로킹 동기 상사에게 서류를 전달합니다. 논블로킹 동기 상사는 사원에게 다른 업무를 보라고 합니다. 그런데 사원은 블로킹 싱크 상사에게 너무 시달린 나머지 상사가 전달해준 일을 바로 처리해야 된다는 강박관념이 생겼습니다. 그래서 중간중간 물어봅니다. 작업이 끝났냐고 상사에게 묻는데, 아직 처리가 안됐다는 답변을 받습니다. 사원은 다시 자신의 업무를 보고 있다가 상사에게 끝났냐고 다시 물어봅니다. 다행히 상사는 서류를 다 읽어서 결과를 전달하면, 사원은 해당 결과를 가지고 바로 처리를 합니다.

 

논블로킹 동기와 블로킹 동기의 차이가 거의 나지 않는데 논 블로킹 동기는 언제 사용할까요? 예를 들어 게임에서 맵을 넘어갈 때를 예시로 들 수 있다고 생각했습니다. 해당 데이터를 가져올 때까지 유저의 정보의 로드율이 얼마만큼인지를 보여줘야 할 때가 있는데 이럴 때 사용할 수 있습니다. 

 

 

 

 

 

 

 

 

3. 블로킹 비동기

이번에는 블로킹 비동기에 대해 살펴보겠습니다. 블로킹이기 때문에 자신의 작업에 대한 제어권이 없는데, 비동기이기 때문에 결과를 바로 처리하지 않아도 됩니다. 이 조합은 굳이 비동기인데 블로킹을 써야 할까? 이상하다고 생각할 수 있습니다. 보통 논블로킹 비동기로 하려다가 개발자의 실수로 혹은 기타 이유로 위와 같이 동작하는 경우가 있다고 합니다. 이 부분도 예시를 살펴보겠습니다.

 

이번에는 서류를 블로킹 비동기 상사에게 전달합니다. 이 상사는 자신이 일하는 동안 옆에 사람을 두는 걸 좋아해서 기다리라고 합니다. 그래서 직원은 결과에 크게 관심이 없는데도 불구하고 기다려야 합니다. 그리고 일이 끝나면 블로킹 비동기 상사는 결과를 메일로 남겨주고 가라고 합니다. 사원은 돌아가서 일하고 시간이 될 때 아까 받은 결과를 통해서 일을 처리할 것입니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4. 논 블로킹 비동기

마지막은 논블로킹 비동기에 대해 알아보겠습니다. 논블로킹은 다른 작업이 시작되어도 자신이 하던 작업은 멈추지 않는 것이라 양쪽에서 서로 각자 작업을 처리하게 됩니다. 그리고 비동기는 결과를 바로 처리하는 게 아니기에, 다른 작업에서 끝난 결과를 바로 처리하지 않고 자신의 일이 끝나게 되면 그때야 처리를 하게 됩니다. 

 

이번에는 서류를 논블로킹 비동기 상사에게 전달합니다. 논 블로킹이기 때문에 상사는 사원에게 돌아가서 자기 일을 하라고 합니다. 그리고 서류를 다 읽고 나면 비동기이기 때문에 메일에 결과를 담아 전달합니다. 사원은 나중에 메일을 확인하고 처리를 합니다. 

 

 

 

 

 

논블로킹 비동기 조합은 대표적인 예시로 자바스크립트에서 API 요청을 하고 다른 작업을 하다가 콜백을 통해서 추가적으로 작업을 처리할 때 사용하는 게 대표적인 예시로 볼 수 있습니다.  

 

마지막으로 정리해보면, 블로킹과 논 블로킹, 동기와 비동기. 둘은 비슷한데 바라보는 관점에서 차이가 있습니다. 블로킹과 논블로킹은 제어의 관점에서 바라보는 것이었고, 싱크와 어싱크는 결과의 관점과 순서의 관점에서 바라보는 것이었습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

마치며

자바스크립트에 대해 공부하면서, 항상 타입 스크립트를 공부하는 것도 좋지만, 먼저 자바스크립트의 기초부터 제대로 알아야겠다고 생각합니다. 이렇게 기초적인 부분을 습득하다 보면, 어느 순간 타입 스크립트로 넘어갔을 때 훨씬 잘 이해할 수 있으리라 믿습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처

 

블로킹 Vs. 논블로킹, 동기 Vs. 비동기

와 드디어 이해했다 속이 후련~

velog.io

 

Node.js란? Node.js 특징 정리(이벤트 기반, 논 블로킹 I/O 모델)

평소 Node.js를 이용해 백엔드를 개발했지만... NodeJS에 대해 단순히 이벤트 기반이고 비동기식이다라고 밖에 모르고 사용했었던 것 같아 자신에게 반성하며 장단점과 특징에 대해 자세하게 정리

node-js.tistory.com

 

 

비동기(Asynchronous) 논블로킹(Non-Blocking) 처리 방식

 

junhyunny.github.io