본문 바로가기

Programming/Web

[JavaScript] 동기와 비동기 / blocking과 Non-blocking

 

Vue를 접하면서, 아니 프론트를 공부하면서 계속 나오는 비동기! 감이 잡히지만 확실히 알고 넘어가자.

동기 Vs 비동기 처리 방식의 차이까지 정리하자.

 

동기와 비동기는, 프로세스 수행 순서에 대한 메커니즘이며,

 

동기/blocking - 비동기/Non-blocking 으로 연관지을 수 있다. 

 

 

 

동기와 비동기 처리 방식 처리 단계

 

동기(Synchronous)

 

 

  1.  동기(Synchronous) 방식의 정의

 

    -  프로그래밍에서 말하는 동기는, '동시에 발생해야 하는 조건'으로, 

 

    -  JavaScript에서 작성한 코드는 위에서 -> 아래로 순차적으로 실행이 되며,

 

    -  상위 코드가 완료되지 않는다면 ? - 하위 코드 역시 실행이 디지 않는다는 것이다.

 

   -> 즉, 동기 = [모든 코드가 '순서'를 가지고 실행이 되는 것]

 

동기(Synchronous) 방식

 

 

  2.  동기방식의 처리 순서

 

    -  Thread1이 작업을 시작시키고 -> Task1이 끝날 때까지 기다렸다가 -> Task2를 시작한다.

 

    -  작업 요청 시, 요청의 결과값(return)을 '직접' 받는 것이다.

 

    -  요청의 결과값을 직접 받는 것이므로, 요청의 결과값 = return값

 

 

 

비동기(Asynchronous)

 

  1.  비동기(Asynchronous) 방식의 정의

 

    (1)  정의

 

      -  비동기 방식은, [응답에 관계없이 바로 다음 동작이 실행되는 것] 을 의미한다.

 

     -> 현재 작업의 응답과, 다음 작업의 요청이 동시에 진행도지 않아도 되는, 즉 기다리지 않아도 되는 것이다.

 

      -  특정 작업을 시작(Request 보내기) ->  완벽하게 처리(Response 받아 처리) 하기 전에!

 

          다음 코드로 넘어가고 -> [나중에 콜백이 실행되는 것]

 

    + )  성격이 급해서 뭔가 일단 다 해결하고 봐야하는 그런 느낌이다.

 

 

 

  2.  콜백 함수(Callback Function)

 

      (1)  콜백 함수의 정의

 

        -  콜백함수란, 파라미터(매개변수)로 함수를 전달받아 -> 함수의 내부에서 실행하는 함수이다.

 

        -  매개변수로 넘겨받은 함수는 일단 넘겨 받고 -> '때가 되면, 나중에 호출' 한다는 것이다.

 

      (2)  콜백 함수 사용 목적

 

        -  콜백 함수는, 비동기 방식으로 작성된 함수를 -> 동기 처리 하기 위해 주로 사용한다.

 

        -  비동기 방식을 기본 처리 방식으로 하지만, 일부 구간에서는 순차적인 처리가 필요할 수 있기 때문이다.

 

           즉, 비동기 방식이 응답을 받기 전에도 다음 동작이 실행되지만, '응답을 받은 이후 처리해야 하는, 종속된 관계

 

의 작업'이 존재할 수도 있기 때문이다.

 

        + )  일종의,, 사고 방지용 이런건가?

 

      (3)  콜백 함수 사용 형태  

 

        -  함수를 선언하고 -> 함수 타입 파라미터를 가장 마지막에 하나 더 선언

 

     

function checkAge(age, name, gender) {
    age < 20 ? name() : gender();
}
function checkName() {
    console.log('이름은 무엇인가요?');
}
function checkGender() {
    console.log('성별은 무엇인가요?');
}
checkAge(23, checkName, checkGender)

 

 

      (4)  콜백 함수 사용 원칙  

 

        1)  익명 함수 사용

 

        2)  함수의 이름만 넘기기

 

        3)  전역변수, 지역변수 콜백함수의 파라미터로 전달 가능

 

 

      (5)  콜백 함수 사용 시 주의점

 

        1)  this를 사용한콜백함수

 

        2)  콜백 지옥(Callback Hell)

 

 

  + ) 콜백 함수(Callback Function) 내용은 다른 게시글에 해당 목록 상세 기재.

 

 

 

  3.  비동기 처리 순서

 

비동기(Asynchronous) 방식

 

 

    -  Thread1이 작업을 시작시키고 -> Task1이 완료되지 않아도 -> Thread1은 다른 일을 처리한다.

 

    -  작업 요청 시, 요청의 결과값(return)을 '간접적으로' 받는 것이다.

 

    -  [요청의 결과값 != return값] or [요청의 결과값 == return값]

 

    -  해당 요청 작업이 별도의 스레드에서 실행

 

    -  콜백을 통한 처리 = 비동기 처리 -> 호출된 함수가 작업 완료를 신경쓴다.

 

 

  4.  웹 통신에서의 비동기

 

    -  자바스크립트 웹 통신에서는 통신이 비동기 실행으로 진행된다.

 

       Ex)  웹 페이지가 로딩되거나, 어떤 이벤트의 소요시간이 길어질 경우, 화면이 나타나지 않거나, 의도하지 않은 동작

 

이다.  따라서, 비동기 방식을 토해 페이지 현재 로딩 상태를 알 수 있게 한다.

 

 

 

 

blocking Vs Non-blocking

 

  -  blocking과 Non-blocking은 주로 IO의 읽기, 쓰기에서 사용된다.

 

  -  주로 직접 제어할 수 없는 대상의 처리 방법에 따라 나뉘며, 

 

  -  그 대상의 예시로는, I/O 장치, 멀티스레드 동기화가 있다.

 

 

  1.  blocking

 

    -  직접 제어할 수 업슨 대상의 작업이 끝날 때까지 제어권을 넘겨주지 않는 것

 

    -  즉, 요청한 작업을 마칠 때까지 계속 대기

 

    -  즉시 return 하며, return 값을 받아야 끝이 난다.

 

    -  따라서, 작업이 순차적으로 진행되는 것이 보장되고, 따라서 어떤 작업의 진행 중에는 다른 작업의 동시 진행이 불가능하다.

 

    -  Thread 관점에서, 요청한 작업을 마칠 때까지 계속 대기하여 -> return 값을 받을 때까지 한 Thread를 계속 사용 및 대기한다.

 

 

  2.  Non-blocking

 

    -  직접 제어할 수 없는 대상의 작업 처리 여부와 관계없이, 자신의 작업을 진행하는 것

 

    -  요청한 작업을 즉시 마칠 수 없다면 -> 즉시 return

 

    -  Thread 관점에서, 하나의 Thread가 여러 개의 IO 처리가 가능하다.

 

 

 

동기와 비동기 - blocking과 Non-blocking 차이

 

  -  동기와 비동기 / blocking과 Non-blocking의 차이는 두 그룹의 관심사가 다르다는 것이다. 

 

 

  1.  동기와 비동기

 

    -  호출되는 함수의 [작업 완료 여부]를 [누가] 신경쓰는가?

 

 

비동기 동기
호출되는 함수에게 Callback 전달
-> 호출되는 함수의 작업이 완료되면,
-> 호출되는 함수가 전달받은 Callback 실행
-> 호출한 함수는 작업 완료 여부를 신경쓰지 않는다.
1. 호출하는 함수가 호출되는 함수의 작업 완료 후 return 기다리기거나

2. 호출되는 함수로부터 바로 return을 받아도 작업 완료 여부를 호출한 함수 스스로 확인하며 신경쓴다.

 

  2.  blocking과 Non-blocking

 

    -  호출되는 함수가 [바로 return] 하느냐 마느냐?

 

 

Non-blocking blocking
호출된 함수가 [바로 return]
-> 호출한 함수에게 제어권을 넘겨주고
-> 호출한 함수가 다른 일을 할 기회를 준다.
호출된 함수가 자신의 작업을 모두 마칠 때까지
-> 호출한 함수에게 제어권을 넘겨주지 않고
-> 대기하게 만든다.

 

 

Combinaton of Synchronous/Asychronous - blocking/Non-blocking

 

Combinaton of Synchronous/Asychronous - blocking/Non-blocking

 

 

  1.  blocking + Synchronous(동기) / Non-blocking + Asynchronous(비동기)

 

    (1)  blocking + Synchronous

 

      -  결과 처리까지 기다렸다가 -> return 값으로 결과 전달

 

    (2)  Non-blocking + Asynchronous

 

      -  작업 요청을 받아 -> 별도의 프로세서에서 진행하게 하고 + 바로 작업 return

 

    ->  결과는 별도의 작업 후 간접적으로 전달(Callback)

 

locking + Synchronous /&amp;nbsp;Non-blocking&amp;nbsp; + Asynchronous

 

 

  2.  Non-blocking + Synchronous(동기)

 

Non-blocking + Synchronous(

 

     -  결과가 없다면 -> 바로 return

 

    -  결과가 있으면 -> 바로 return

 

   -> 결과가 생길 때까지 완료 확인    

 

 

  3.  blocking + Asynchronous(비동기)

 

 

blocking + Asynchronous

 

    -  호출되는 함수가 바로 return X

 

    -  호출하는 함수는 작업의 완료 여부를 신경쓰지 X

 

 

 

 

참고

 -  https://bigtop.tistory.com/35 (Callback)

 -  https://velog.io/@minidoo/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%BD%9C%EB%B0%B1-%ED%95%A8%EC%88%98Callback-Function  (Callback)

 -  https://velog.io/@wonhee010/%EB%8F%99%EA%B8%B0vs%EB%B9%84%EB%8F%99%EA%B8%B0-feat.-blocking-vs-non-blocking

 -  https://goplanit.site/94.%20Synchronous_asynchronous/

 -  https://velog.io/@lsj8367/Javascript-%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0%EB%B0%A9%EC%8B%9D%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90