π° λ©ν μ Blocking vs Non-Blocking, Sync vs Async
[10λΆ ν μ½ν‘] π° λ©ν μ Blocking vs Non-Blocking, Sync vs Async λ£κ³ μ 리.
Blocking VS Non-Blocking
λ€λ₯Έ μμ μ μννλ 주체λ₯Ό μ΄λ»κ² λ€λ£¨λμ§μ κ΄ν κ΄μ μ΄λ€.
Blocking
Blocking : μμ μ μμ μ μ§ννλ€κ° λ€λ₯Έ 주체μ μμ μ΄ μμλλ©΄ λ€λ₯Έ μμ μ΄ λλ λκΉμ§ κΈ°λ€λ Έλ€κ° μμ μ μμ μ μμνλ κ².

μ ν리μΌμ΄μ κ΄μ μμ, μ²μμλ μ ν리μΌμ΄μ μ΄ μμ μ μμ μ νλ€. κ·Έλ¬λ€κ° 컀λ μμ μ΄ μμλλ©΄ 컀λ μμ μ΄ μ§νλλ λμ μ¬κ³ μλ€. κ·Έλ¬κ³ 컀λ μμ μ΄ λλκ³ λλ©΄ λ€μ μ ν리μΌμ΄μ μ μμ μ΄ μ§νμ΄ λλ€.
Non-Blocking
Non-Blocking : λ€λ₯Έ 주체μ μμ μ κ΄λ ¨μμ΄ μμ μ μμ μ νλ κ².

λ Ό λΈλ‘νΉμ λ€λ₯Έ 주체μ μκ΄μμ΄ μμ μ μΌμ μ§ννλ€. 컀λμ΄ μμμ μμνλ μκ° λΉ μ Έλμμ λ€μ μμ μ μμ μ μ§ννκ² λλ€.
Synchronous VS Asynchronous
Synchronous
μμ μ λμμ μννκ±°λ, λμμ λλκ±°λ, λλλ λμμ μμν¨μ μλ―Έ β μ¦ μ£Όμ²΄λ€κ° μμ μνμ μκ°μ λ§μΆλ€

μμ μ μμ μ νλ€κ° λ€λ₯Έ 주체(컀λ)μ μμ μ μμ²νλ€. μμ²λ°μ μμ μ νμν μμ μ μννκ³ λ€μ κ²°κ³Όκ°μ 리ν΄νλ€. κ²°κ³Όλ₯Ό λ°μ νμμΌ μμ²μ λ³΄λΈ μμ μ λ€μ μμ μ μμ μ μ¬κ°νλ€.
Asynchronous
μμ, μ’ λ£κ° μΌμΉνμ§ μμΌλ©° λλλ λμμ μμμ νμ§ μμμ μλ―Έ β 주체λ€κ° μμ μνμ μκ°μ λ§μΆμ§ μλλ€.

μμ μ μννλ€ λ€λ₯Έ 주체(컀λ)μκ² μμ μ μμ²νλ€. Synchronousμ λ¬λ¦¬ 컀λ μμ μ κ²°κ³Όμ μ κ²½μ°μ§ μκ³ μμ μ μμ μ κ³μ μννλ€. 컀λμμ μ΄ λλκ³ κ²°κ³Όκ° λμμ€κ² λλ©΄ λμμ¨ κ²°κ³Όμ λν΄μ μν©μ μ²λ¦¬ν μ λ μκ³ μν μ λ μλ€.
λ€κ°μ§ μ‘°ν©μ λν΄μ
Blocking, Synchronous

Blockingμ κ΄μ μ μ μ΄κΆμ μλ€. λ€λ₯Έ μμ μ΄ μμλλ λμ λμνμ§ μλλ€.
Syncμ κ΄μ μ κ²°κ³Όμ μ²λ¦¬μ΄λ€. λ€λ₯Έ μμ μ΄ κ²°κ³Όλ₯Ό λ°νν λ, κ²°κ³Όκ°μ λ°κ³ λμ μμ μ μμ μ μ¬κ°νλ€.
μμ)
μμλ‘, νν μ°λ¦¬κ° μ¬μ©μμκ² μ λ ₯κ°μ λ°λ μ½λλ₯Ό λ€ μ μλ€.

μ λ ₯μ μμ²ν λ, μ μ΄κΆμ΄ μ λ ₯λ°λ 주체(컀λ)μκ² λμ΄κ°λ€. λ°λΌμ scanner.nextLine()μ΄νμ βλΈλ‘νΉ λκΈ°βλ₯Ό μΆλ ₯νλ μ½λλ μ λ ₯λ°λ 컀λμ μμ μ΄ λλ λ κΉμ§ μ€νλμ§ μλλ€.
컀λμ μ λ ₯ μμ μ΄ λλκ³ , κ²°κ³Όλ₯Ό λ°ννκ² λλ©΄, μ μ΄κΆκ³Ό κ²°κ³Όλ₯Ό κ°μ΄ λ°μμ μ΄ν μμ μ μ¬κ°νκ² λλ€.
Non-Blocking Sync

Non- Blocking μ λ€λ₯Έ μμ μ 주체μκ² μμ μ μμ²ν΄λ μμ μ μ μ΄κΆμ κ·Έλλ‘ λ€κ³ μκ³ , κ³μ μμ μ μμ μ μννλ€.(Non-Block)
νλ° Syncλ κ²°κ³Όμ κ΄μ¬μ΄ μλ κ΄μ μ΄λΌκ³ νλ€. λ°λΌμ, μ μ΄κΆμ κ°μ§κ³ μμ μ μ½λλ₯Ό μννκΈ°λ νμ§λ§ μ€κ°μ€κ°μ κ³μ μμ²ν μμ μ 주체μκ² μμ μλ£ μ¬λΆ, μ¦ κ²°κ³Ό(λ°ν)κ°μ΄ λ¬Όμ΄λ³Έλ€.
λ¬»κ³ μμ μ΄ μμ§ μλ£λμ§ μμλ€λ©΄ λ€μ λμμ μμ μ μμ μ μννλ€. μ΄κ°μ κ³Όμ μ λ°λ³΅νλ€.
κ²°κ΅ μμ²ν μμ 주체μ μμ μ΄ λλ κ²°κ³Όλ₯Ό λ°μ μ μμΌλ©΄ μ΄μ ν΄λΉ κ²°κ³Όλ₯Ό λ°μμ μμ μ μ²λ¦¬νλ€(Sync)
μμ)
Non-blocking syncλ blocking syncμ κ±°μ ν° μ°¨μ΄κ° μλ€.
μ νν λ§νλ©΄, Non-blocking Syncλ Syncλ₯Ό μν΄ μμ²ν μμ μ κ²°κ³Όλ₯Ό κΈ°λ€λ¦¬λ©΄μλ, μμ μ μ μ΄κΆμ μ¬μ ν μ§λ μ κ³μ μμ μ μμ μ μ§ννλ€λ μ°¨μ΄κ° μλ€. μ΄λ€ μμκ° μμκΉ?
β κ²μμμ λ§΅μ λμ΄κ°λ μ½λλ₯Ό μμλ‘ λ€ μ μλ€.

κ²μμμ λ§΅μ μ ν ν λ, λ§΅μ λ‘λ©μ κΈ°λ€λ¦¬λ©΄μλ μ μ μκ² λ§΅ λ°μ΄ν°λ₯Ό κ°μ§κ³ μ¬λ μ§ν μλ£μ¨μ 보μ¬μ£Όλ μν©μ λ€ μ μκ² λ€.
Blocking Async

Blockingμ΄κΈ° λλ¬Έμ μμ μ μμ μ λν μ μ΄κΆμ μλ€. νμ§λ§ Asyncμ΄κΈ° λλ¬Έμ μμ²ν μμ μ κ²°κ³Όλ₯Ό κΈ°λ€λ¦΄ νμκ° μλ€. μ λ§ μ΄μν μ‘°ν©μ΄λ€.
λ€μ μκ°ν΄λ³΄λ©΄, μμ²ν μμ μ κ²°κ³Όλ₯Ό κΈ°λ€λ¦΄ νμκ° μλλ°λ μ μ΄κΆμ κ°μ§μ§ μμμ μμ μ μμ μ μννμ§ λͺ»νλ€. λκΈ°, λΈλ‘νΉκ³Ό λ€λ₯Ό λ°κ° μλ€. κ΅³μ΄ μ΄λ° μν©μ μ¬μ©ν νμκ° μμκΉ?
β κ±°μ μμ°μ΄λ μ‘°ν©μ΄λΌκ³ 보면 λλ€. λ³΄ν΅ μ΄ μ‘°ν©μ, Non-Blocking/Asyncλ‘ λμνκ² νλ €λ€κ° κ°λ°μμ μ€μλ‘ νΉμ κΈ°ν λ±λ±μ μ΄μ λ‘ μμκ°μ΄ λμνλ κ²½μ°κ° μλ€κ³ νλ€.
μλνκ³ μ¬μ©νκΈ° 보λ€λ μ€μλ‘ μ¬μ©λλ€. μλ₯Ό λ€μ΄, λΉλκΈ°λ‘ λ€λ₯Έ μμ μ μ€ννμ§λ§, λ€λ₯Έ μμ μ΄ λ΄λΆμ μΌλ‘ (DB λ±λ±) λΈλ‘νΉμΌλ‘ μνλλ€λ©΄ μ΄λ° μν©μ΄ μμ μ μλ€.
Non-Blocking Async

Non-blockingμ λ€λ₯Έ μμ μ΄ μμλμ΄λ μμ μ΄ νλ μμ μ λ©μΆμ§ μλλ€. (μ μ΄κΆμ κ·Έλλ‘ λ€κ³ μκΈ° λλ¬Έ)
λ°λΌμ μμͺ½μμ μλ‘ κ°μ μμ μ μ²λ¦¬νλ€.
κ·Έλ¦¬κ³ , Asyncλ μλ‘μ κ²°κ³Όμ κ΄μ¬μ΄ μλ€. λ€λ₯Έ μμ μ΄ λλ ν κ²°κ³Όλ₯Ό κΈ°λ€λ¦° ν λ°λ‘ λ°μμ μ²λ¦¬νλ κ²μ΄ μλλΌ μμ μ μμ μ΄ λλ νμ μ²λ¦¬λ₯Ό νλμ§, νΉμ μμ μ²λ¦¬λ₯Ό μν μ λ μλ°. ( νΉμ μμ²νλ μμ μ 주체μκ² μμ² κ²°κ³Όλ¬Όμ μ΄λ€μμΌλ‘ μ²λ¦¬νλΌκ³ μ½λ°±ν¨μλ₯Ό μ λ¬ν μλ μλ€.)
μμ)
λνμ μΈ μμλ‘ μλ°μ€ν¬λ¦½νΈμμ API μμ²μ νκ³ (fetch) λ€λ₯Έ μμ μ νλ€κ° μμ²μ κ²°κ³Όκ°μ λ°μΌλ©΄, μ½λ°±μ ν΅ν΄μ μΆκ°μ μΈ μμ μ μ²λ¦¬ν λλ₯Ό λ€ μ μλ€.
μ 리
λΈλ‘νΉ/λ ΌλΈλ‘νΉμ λ€λ₯Έ μμ 주체μ λν μ μ΄κΆμ μ΄λ»κ² μ²λ¦¬νλκ°μ κ΄μ . β μ μ΄μ κ΄μ
μ±ν¬/μ΄μ±ν¬λ μμμ κ²°κ³Ό(μ²λ¦¬)μ κ΄μ μ΄λ€.
λΈλ‘νΉκ³Ό λ ΌλΈλ‘νΉ, λκΈ°μ λΉλκΈ°μ λ€κ°μ§ μ‘°ν©μ μ¬μ€ μ νν λκ° μ΄λ λ€ λΌκ³ λ± μ§μ΄μ ννν μ μλ€.
μμ£Ό κ΅μ§μ μΈ κ΅¬μμΌλ‘ λ΄€μ λλ κ·Έ ꡬλΆμ΄ κ°λ₯ν μλ μμ§λ§ μ 체μ μΈ μ½λμ λ‘μ§μ νλ¦μμ μ΄λ€ μ‘°ν©μ΄λ€ λΌκ³ λͺ νν ꡬλΆμ§κΈ°λ λΆκ°λ₯νλ€.

μλ₯Ό λ€μ΄ μ΄ μ½λλ₯Ό 보μ.
2~7μ€ μ 체μ μΌλ‘ 보μμ λλ factorial ν¨μμ μ μ½λλ λκΈ°μ μΌλ‘ λμνλ€. μλλ©΄ line 7, long result = futureTask.get()μΌλ‘ factorialν¨μμ μμ μ΄ λλκΈ°λ₯Ό κΈ°λ€λ Έλ€κ° κ·Έ κ²°κ³Όλ¬Όμ λ°μμ€κ³ λ€μ μμ μ μ¬κ°νκΈ° λλ¬Έμ΄λ€.
νμ§λ§ κ·Έ κ³Όμ μμμλ λΉλκΈ°μ λ Ό λΈλ‘νΉ λ±μ κ°λ μ μ μ©μν¬ μ μλ€. μλ₯Ό λ€μ΄ whileλ¬Έμ 쑰건μμμ futureTask.isDone()μΌλ‘ factorialν¨μμκ² μμ μ μλ£ μ¬λΆλ₯Ό 체ν¬νκ³ μλλ° μ΄λ sync/non-blockingμ‘°ν©μ΄λΌκ³ λ³Ό μ μλ€.
νμ§λ§ μ¬κΈ°μμ μ‘°μ°¨λ λ κΉκ² λ€μ΄κ°λ³΄μ. μ΄ λ§μ λ, futureTask.isDone()μ΄λΌλ ν¨μκ° μ€νλ λ μκ°μ μΌλ‘ blocking/syncκ° μΌμ΄λλ€.(isDone()ν¨μλ₯Ό μ€νμν΄κ³Ό λμμ μ μ΄κΆμ΄ λμ΄κ°κ³ λ³Έ μ½λλ μ€νμ μ€μ§, κ·Έλ¦¬κ³ isDone()μ λ°νκ°μΈ λΆλ¦°μ λ°μλκΉμ§ Syncνκ² λμν¨)
λ€κ°μ§ κ°λ μ λ§λ‘ λλλ €λ©΄ λλ μ μμ§λ§ λͺ¨λ μν©μμ λλ Ένκ² λλ μ§μ§ μλλ€.
μλ°μ€ν¬λ¦½νΈμ await/asyncλ μ΄κ² κ³Όμ° λκΈ°/λΉλκΈ°λΌκ³ ν μ μμκΉ? μ 체μ μΌλ‘ λ΄€μ λ μ½λμμ awaitμ κ±Έμ΄λ νλ©΄μ 보μ΄κ³ μ΄λ²€νΈλ£¨νλ λμνλ€. μ¦ λΉλκΈ°μΈ κ²μ΄λ€. awaitμ ν¨μκ° μ°μ΄λ κ΅μ§μ μΈ κ΄μ μμλ λ¬Όλ‘ Syncμμ λ§λ€.
νμ§λ§ μλ°μ€ν¬λ¦½νΈ μ 체μ μΈ κ΄μ μμλ λΉλκΈ°μ μΌλ‘ μλνλ λ‘μ§λ€μ΄ λ§€μ°λ§μ κ²μ΄λ€.

μ°Έκ³
λκΈλ¨κΈ°κΈ°