🚦 Blocking/Non-Blocking & Sync/Async 개념 정리
1. 🔑 Blocking vs Non-Blocking: 제어권 관점
1.1. 🚫 Blocking
- 함수 A가 함수 B를 호출 시, ==제어권을 B에게 넘김==.
- B가 완료될 때까지 A는 ==대기==.
- A는 B가 종료되고 ==제어권을 반환받은 후에야 다음 코드 실행.==
sequenceDiagram participant A participant B A->>B: 호출 activate B B-->>A: 완료 및 제어권 반환 deactivate B A->>A: 나머지 코드 실행
1.2. ✅ Non-Blocking
- 함수 A가 함수 B를 호출 시, ==제어권을 잠시 B에게 넘겼다가 즉시 반환받음==.
- A는 ==B의 완료를 기다리지 않고 자신의 코드 실행.==
- B는 A와 ==병렬적==으로 실행될 수 있음.
sequenceDiagram participant A participant B A->>B: 호출 B-->>A: 즉시 제어권 반환 A->>A: 자신의 코드 실행 B->>B: 호출된 코드 실행
2. ⏱️ Sync vs Async: 시간 관점
2.1. 🤝 Synchronous (Sync)
- 함수 호출의 종료 시점과 결과값 전달 시점이 ==일치==.
- A는 B를 호출 후 ==B가 종료될 때까지 기다림==.
- 프로그램 흐름상 ==A는 B의 완료에 종속적==.
sequenceDiagram participant A participant B A->>B: 호출 activate B B-->>A: 완료 및 결과 반환 (동시에) deactivate B A->>A: 다음 작업 수행
2.2. ⏳ Asynchronous (Async)
- 함수 호출의 종료 시점과 결과값 전달 시점이 ==불일치==.
- A는 B를 호출 후 ==B의 완료 여부에 상관없이 자신의 코드 실행.==
- A는 B의 결과에 ==관심 없음 (또는 나중에 콜백 등을 통해 처리).==
sequenceDiagram participant A participant B A->>B: 호출 A->>A: 즉시 다음 작업 수행 B->>B: 백그라운드 작업 B-->>A: (나중에) 결과 반환 (콜백 등)
3. 🧩 조합 및 예시
| Synchronous (Sync) | Asynchronous (Async) | |
|---|---|---|
| Blocking | 제어권 넘기고 기다림 + 결과 즉시 필요 ==예시==: ==Console.readLine() I/O 작업== | 제어권 넘기고 기다림 + 결과 나중 필요 (거의 사용 X, 안티패턴) |
| Non-Blocking | 제어권 바로 받음 + 결과 즉시 필요 ==예시==: 게임 로딩 화면 | 제어권 바로 받음 + 결과 나중 필요 ==예시==: AJAX 통신 (JavaScript) |
3.1. 🧱 Blocking + Sync
- A가 B를 호출하고, B가 종료될 때까지 A는 아무것도 하지 않고 ==대기==.
- B의 종료 시점과 결과값 전달 시점이 ==동일==.
- ==예시==: Java의 기본적인 I/O 작업 (==
Console.readLine()==). 사용자의 입력이 완료될 때까지 프로그램은 멈춤.
3.2. 🔄 Non-Blocking + Sync
- A가 B를 호출하고, 제어권을 ==바로 반환받음==.
- A는 다른 작업을 수행하면서 B의 완료 여부를 ==주기적으로 확인==.
- B가 완료되면 결과를 가져옴.
- ==예시==: 게임 로딩 화면. 로딩 바가 진행되는 동안 게임은 멈추지 않고 다른 UI 요소들을 보여줌.
3.3. ❌ Blocking + Async
- A가 B를 호출하고, B가 종료될 때까지 A는 ==대기==.
- B의 결과는 ==나중에 필요 (바로 사용하지 않음).==
- ==일반적으로 안티 패턴으로 간주==. 기다리는 행위와 비동기적 특성이 모순됨.
3.4. ⚡ Non-Blocking + Async
- A가 B를 호출하고, 제어권을 ==바로 반환받음==.
- A는 다른 작업을 수행하며, B의 결과는 ==나중에 콜백 등을 통해 처리==.
- ==예시==: JavaScript의 AJAX 통신. 서버에 요청을 보내놓고, 응답이 오면 콜백 함수를 실행하여 결과를 처리.
4. 🤔 결론
- Blocking/Non-Blocking과 Sync/Async는 ==관점의 차이==일 뿐, 프로그램 흐름 관점에서는 유사하게 보일 수 있음.
- ==제어권 관점에서 보면 Blocking/Non-Blocking, 시간 관점에서 보면 Sync/Async.==
대본
안녕하세요 저는 Blocking과 Non-Blocking그리고 Sync와 Async에 대해발표를 하게 된 우아한테크코스 6기 호기입니다반갑습니다다들 아마 이 개념을 한 번쯤 흘리듯이 들어보셨을 거예요근데 이 개념이 좀 헷갈리는 내용들이 많고많은 부분에서 오용이 되는 부분들이 많아서이번 제 발표를 통해서한번 잡고 넘어가셨으면 좋겠습니다제 발표는 다음과 같이 진행이 될 것 같습니다처음에는 Blocking과 Non-Blocking에 대해설명을 드리려고 하고요그 다음 Sync와 Async,저희가 흔히 알고 있는 동기와 비동기에 대해설명을 드릴 겁니다그리고 마지막으로 이 네 가지의 개념들은실제로 프로그램 세상에서 좀 조합이 되어서많이 사용이 돼요그래서 이 조합들이 어떤 방식으로 동작을 하고어떤 예시가 있는지설명드리면서 발표 마치도록 하겠습니다첫 번째로는 Blocking과 Non-Blocking을한번 살펴보려고 합니다Blocking과 Non-Blocking을 이해하기 위해서제가 키워드를 하나 가지고 왔어요그 키워드는 제어권이라는 키워드인데요제어권이 누구에게 있는지에 따라서Blocking과 Non-Blocking을 구별할 수 있습니다여기서 제어권은함수를 실행할 수 있는 권리라는 정의를 가지고 있는데조금 쉽게 생각해서지금 이 함수의 실행권이 누구에게 있는지 생각하시면서따라와 주시면 감사하겠습니다먼저 Blocking 한번 알아볼게요Blocking은 단어에서 주는 어감이 있듯이막혀 있다, 기다린다 라는 의미를 가지고 있는데요간단한 흐름도를 하나 가지고 왔습니다함수 A와 함수 B가 있고함수 A가 실행을 하다가 B를 호출을 합니다그럼 B는 자신의 코드를 다 수행을 하고완료가 됐을 때이제 A가 다시 자신의 코드를 실행하는간단한 흐름도를 하나 가지고 왔는데요이를 제어권 관점에서 한번 살펴볼게요맨 처음에 제어권은 A에게 있습니다그래서 A가 자기의 코드를 실행을 하다가이제 B를 호출하는 상황이 돼요그러면 이 제어권을 B에게 넘겨줍니다그러면 A의 제어권을 받은 B는이제 자신의 코드를 실행을 하고B 실행이 끝냈을 때이 제어권을 다시 A에게 넘겨줍니다그리고 제어권을 다시 돌려받은 A는이제 자신의 남은 코드를 실행하러 가게 돼요이렇게 동작하는 게 Blocking 방식인데요조금 멀리서 보게 되면결국 A가 B에게 제어권을 넘기고B가 끝날 때까지A가 기다리는 형태를 띠는 것이바로 Blocking입니다그럼 이제 반대로 Non-Blocking에 대해서 한번 알아볼게요앞에 Blocking에 Non이 붙어 있으니까약간 막혀 있지 않다 혹은 기다리지 않는다 라고해석을 할 수 있을 것 같은데요아까와 똑같이A가 B를 호출하는 상황을 하나 가지고 와봤어요처음에는 제어권이라는 게 A에게 있겠죠그리고 A가 B를 호출하는 상황이 될 때A가 B에게 제어권을 잠시 넘겨줍니다근데 거의 바로 B가 제어권을 다시 A에게 돌려줘요이게 거의 제어권을 안 넘겼다시피 할 수 있는데요이때 A는 넘겨줬던 제어권을 다시 받았기 때문에자신의 코드를 실행을 하고요호출 받은 B는 이제 자신이 호출을 받았기 때문에자신의 코드를 실행을 합니다어떻게 보면 동시에 실행되는 것처럼 보일 수 있고조금 더 크게 보면Non-Blocking은 어떤 함수로 호출을 했을 때자신은 기다리지 않고자기 자신의 코드를 실행할 수 있다는특징을 가지고 있습니다그럼 다음으로 Sync와 Async동기, 비동기에 대해서 한번 알아보려고 하는데요저희가 흔히 동기라고 부르는 Sync의 영단어는Synchronous라는 단어예요Synchronous는 앞에 Syn이 함께,그리고 뒤에 chronous라는 단어가 시간을 의미하게 되는데요이를 직역하게 되면시간을 함께하다 라는 뜻을 가지고 있어요여기서 각자의 사람들이 이 시간이라는 것을어떻게 정의하느냐에 따라서각자 생각하는 Synchronous라는 개념이조금 달라지게 돼요그래서 어떤 사람들은 난 여기까지도 동기라고 본다하지만 일부 사람들은 난 여긴 동기라고 보지 않는다와 같은 제각각의 관점들이 많이 존재를 해요그래서 저는 이번 시간에Synchronous라는 것을 깊이 파기보다는Sync와 Async가 어떤 차이가 있고어떻게 동작하는지에초점을 맞춰서 진행할 예정이기 때문에가장 보편적이고 이해하기 쉬운 시간이라는 개념을 가지고Synchronous를 정의해 보려고 합니다그 시간은 함수의 종료 시점과 결과값이 전달되는 시점,이 두 가지의 시점을 함께하는 것을Synchronous라고 부릅니다여기까지만 들어서는 이 이야기가 조금 힘드니까뒤에 예제와 함께 같이 Synchronous를 살펴볼게요Synchronous는 아까 말씀드렸듯이함수의 종료와 그리고 결과값의 전달이일치하는 것인데요아까와 같은 흐름도를 가지고 왔습니다A가 B를 호출하는 그런 상황인데요여기 보시면B의 함수가 종료되는 이 시점과B의 결과가 전달되는A에게 전달되는 시점이 일치하는 것이Synchronous예요조금 더 크게 생각을 해보면A 입장에선 B가 끝나자마자 결과를 가지고 와야 해요그래서 B를 계속 지켜보면서얘가 언제 끝나는지 지켜보고 있습니다그래서 프로그램 흐름의 관점에서 보게 되면A는 B가 끝나길 기다리고 있다는 형식으로프로그램의 흐름이 동작을 하게 돼요이게 Synchronous 방식이고요그럼 반대로 Asynchronous는또 아까 말했던 synchronous에 반대되는 개념이겠죠그래서 또 A가 B를 호출하는코드를 가지고 왔는데요Asynchronous는 함수의 결과와이 결과에 전달되는 이 시점이 일치하지 않는 겁니다다르게 말하면A 입장에선 B가 언제 끝나든지 관심이 없는 거예요그래서 A는 B를 호출한 다음에B가 언제 끝나든 관심이 없어서그냥 자기가 자기 할 일을 하러 갑니다그래서 또 프로그램 흐름을 관점에서 보았을 때는Asynchronous 방식은A가 어떤 함수 호출을 하고그리고 기다리지 않고자기 할 일을 하러 가는 걸Asynchronous라고 볼 수도 있어요그럼 저는 여기까지 공부했을 때 좀 의문점이 들더라고요그러면 Blocking과 Sync가 똑같은 거고Non-blocking과 Async가 똑같은 거지 않을까라는 저는 궁금증이 좀 들었는데요결과부터 말씀드리자면이 두 가지는 관점의 차이를 가지고 있어요사실 Blocking과 Sync 어차피 기다리는 거고Non-Blocking과 Async 어차피 안 기다리고자기 할 거 하러 가는 애들 똑같네?라는 흐름으로 이어질 수 있을 것 같은데요사실 이 두 가지의 개념은 되게 추상적인 개념이에요뭔가 이분법적으로 딱 가를 수가 없는 내용이거든요그래서 하나의 코드를 보더라도어떤 관점에서 보느냐에 따라 Blocking이 될 수도 있고요또 다른 관점에서 보면 Sync가 될 수도 있어요그럼 어떤 관점에서 봐야 Block이냐?제어권이라는 키워드를 가지고지금 함수에 실행을 할 수 있는 권리가 누구에게 있는지라는 관점으로 코드를 바라봤을 땐Blocking과 Non-Blocking이라고 구별을 할 수 있고반대로 시간이라는 키워드를 가지고하나의 코드의 시간을 함께 하는지와 같은 개념으로코드를 바라본다면Sync와 Async로 나뉠 수 있을 것 같습니다그래서 두 가지는 프로그램 관점에서 보면흐름은 거의 동일하지만관점에 따라다른 개념으로 존재한다는 거알아주셨으면 좋겠습니다이제 마지막으로 Blocking과 Non-Blocking그리고 Sync, Async를 보게 되면이런 표를 많이 보셨을 거예요그래서 이 조합들이 어떻게 동작을 하고어떤 예시가 있는지 살펴보면서발표 마무리하도록 하겠습니다먼저 Blocking과 Sync를 한번 알아볼게요우선 Block 방식 먼저 한번 생각을 해볼게요Block 방식은 상대에게 제어권을 넘기고 기다리는 애입니다Sync도 똑같이상대가 나한테 결과를 전달해주는 게 중요하기 때문에어차피 기다리는 동작을 하는 애예요조합이 되게 잘 맞는 친구들이 만난 것 같은데요얘네의 동작 과정은 다음과 같습니다A가 B로 호출을 했을 때 제어권을 넘기게 되고요그리고 B가 끝났을 때제어권을 다시 반환을 받게 됩니다이동안 다른 일은 불가능하고요그리고 호출한 B의 함수가 끝나는 시점그리고 결과값이 전달되는 시점을 일치하기 때문에다음과 같이 동작을 합니다이런 Block과 Sync조합을 사용하는 대표적인 예시가기본적인 자바 언어에서 위와 같이 동작을 하고요이렇게 사용하는 예시가 뭐가 있을까 라고 했을 때는저희가 레벨 1 때 많이 사용을 했었던이 Console.readLine이라는메서드를 들 수 있을 것 같아요Console.readLine이라는 메서드를실행을 하게 되면 이런 콘솔 창이 나오게 되는데요이때 저희가 결과값을저희 입력이 끝나지 않으면프로그램이 동작되지 않고그리고 저희가 어떤 값을 입력하고엔터를 치자마자 남은 코드들이 실행이 되죠그래서 Block과 Sync 조합의 대표적인 예시로이런 I.O 작업을 들 수 있을 것 같습니다두 번째로 Non-Blocking과 Sync 조합에 대해 한번 살펴볼게요Non-Block은 상대에게 제어권을 넘기지 않고 기다리지 않고내 할 걸 하는 애입니다Sync는 근데상대가 결과를 전달해 주는 게 되게 중요해요얘가 끝나자마자 결과를 가져와야 하기 때문에얘가 언제 끝나는지를 계속 주의깊게 보거든요그래서 동작 방식은 다음과 같습니다A가 맨 처음에 B를 호출하고제어권을 바로 돌려받습니다이 이후에 A는 다른 일을 할 수 있는데요반대로 Sync로 동작을 하기 때문에얘가 끝나는 시점에 맞추어서 결과를 가지고 와야 해요그래서 중간중간 다 했니? 다 했어?와 같이 계속 물어봅니다이렇게 Non-Block과 Sync는 동작을 하게 되고요그럼 대체 이런 조합이 어디에 쓰일까? 라고 했을 때게임 로딩 창을 하나 가지고 왔습니다이제 롤이라는 게임을 해보신 분들은 아실 텐데챔피언을 누르게 되면 레벨이 뜬다든지숙련도가 뜬다든지여러가지 정보들이 뜨거든요이 말은 프로그램이 현재 막혀있다는 뜻이 아니에요프로그램은 정상적으로 동작을 하고 있는 상태고저 밑에 있는 저 게이지게이지가 100이 되기를 기다리면서100이 됐을 때이 100이라는 결과가 전달이 됐을 때게임이 바로 시작이 되죠그래서 이런 게임의 로딩 화면을Non-Block과 Sync의 대표적인 예시로들 수 있을 것 같습니다세 번째로 Blocking과 Async에 대해서 한번 알아볼게요Blocking은 상대에게 제어권을 넘기고 기다리는 애입니다Async는 어차피 지금B가 끝나는 게 중요하지 않아요바로 결과를 받아올 거가 아니기 때문이죠그래서 흐름은 이렇게 진행이 되는데요A가 호출을 했을 때 제어권을 넘기고요B가 끝날 때 제어권을 가지고 옵니다근데 B가 언제 끝나는지B의 결과는 중요하지 않아요B의 결과가 중요하지 않은데기다린다 라는 개념이되게 상충되는 개념이기도 하거든요그래서 일부 개발자들은Block과 Async의 조합을안티 패턴이라고 부르기도 해요사실 안티 패턴은 둘이 조합을 했을 때딱히 맞는 얘기가 없는 것 같고결과가 중요하지 않고 끝도 기다리지 않는데기다린다는 개념이 이상하기 때문에사실 이런 동작 방식으로진행하는 프로그램이 뭐가 있을까찾아봤는데 나오지 않더라고요보통 이런 패턴이 개발자들의 실수 때문에나온다는 것밖에 없더라고요그래서 Block과 Async는 딱히 좋은 게 없구나안티 패턴일 수도 있겠구나정도만 가지고 가시면 좋을 것 같습니다이제 마지막으로 Non-Blocking과 Async에 대해 알아볼게요Non-Blocking은 상대에게 제어권을 넘기지 않고 기다리지 않고내가 할 걸 하러 가는 애입니다Async는 어차피 결과가 중요하지 않기 때문에함수로 호출해 놓고자기 할 걸 하러 가요얘네 둘은 좀 조합이 잘 맞는 것 같죠?동작 방식은 이렇게 진행을 하는데요A가 B로 호출했을 때바로 제어권을 돌려받고 다른 일을 할 수 있습니다그리고 B가 끝나는 시점을 중요하게 보지 않기 때문에이것과 상관없이 다른 일을 할 수 있어요이렇게 동작하는 것이자바스크립트가 보통 이런 방식으로 동작을 한다고 해요그래서 AJAX 통신 같은 걸로 어떤 요청을 보내 놓고나중에 필요하다면콜백을 통해서 가져오는 자바스크립트가다음과 같이 동작을 한다고 볼 수 있을 것 같습니다그래서 총 정리를 하자면Blocking과 Non-Blocking,Sync와 Async는 프로그램의 흐름 관점에서 보면동작하는 게 거의 같아요그래서 사람들이 두 개 같은 거 아니냐고 많이 헷갈리는데사실 어떤 관점에서 보느냐에 따라서이 두 개는 다른 개념이 될 수 있습니다Blocking과 Non-Blocking은제어권이라는 관점에 맞춰서 그대로 바라보는 것이고요반대로 Sync와 Async는 시간이라는 관점에 맞추어서코드를 바라보는 것이라고 정리하고발표 마치도록 하겠습니다