back/JAVA

[JAVA] 자바에서 (동기 , 비동기) (Blocking, Non-Blocking)이란 무엇일까?

Min_dev 2022. 11. 29. 14:59
반응형

동기, 비동기를 이해하기 위해서는 먼저 쓰레드(Thread)라는 단어를 알아야 합니다.

쓰레드란 실행되고 있는 프로그램이라고 볼 수 있는 프로세스의 내부에서 실행되는 흐름의 단위라고 볼 수 있습니다.

Java 프로그램이 실행되면, java를 실행시킬 때 사용하는 main() 메서드로부터 main 쓰레드가 실행되며 이 main 쓰레드의 흐름이 곧 프로그램의 흐름이 되는 것 입니다.

main 쓰레드만 있는 상황이라면 싱글 쓰레드를 사용하는 것으로 어렵지 않게 흐름을 예측할 수 있지만 자바는 멀티 쓰레드(multi thread)를 지원하는 언어입니다. 멀티 쓰레드와 싱글 쓰레드의 차이는 몆명의 사람이 일을 하느냐로 이해하면 좋습니다. 싱글 쓰레드는 혼자 일을 하는 것이고, 멀티 쓰레드는 두명 이상의 사람이 함께 일하는 것으로 이해할 수 있습니다.

 

이제 쓰레드에 대해서 알았으니 동기, 비동기에 대해서 알아봅시다.

동기

동기 방식은 요청과 결과가 항상 동시간에 발생하게 됩니다. 
어떠한 요청을 받으면 그 요청에 대해서 얼마나 시간이 걸리던간에 결과를 받을 때까지 기다려야 합니다.

 

비동기

비동기 방식은 요청과 결과가 동시에 일어나지 않습니다. 동기 방식은 요청을 보내면 결과를 받을때까지 기다려야 하지만

비동기 방식은 여러 작업이 동시에 진행될 수 있으며, 모든 요청이 별개로 진행됩니다.

 

아래 사진을 보면서 좀 더 자세히 이해해보겠습니다.

왼쪽 그림은 동기 방식으로 요청이 처리되는 과정이고, 오른쪽 사진은 비동기 방식으로 요청이 처리되는 과정입니다.

 

동기 방식으로 요청이 처리되는 사진을 보면 client에서 요청을 보내고 server에서 응답을 보내는데 시간이 얼마나 걸리든지 client에서는 응답이 올때까지 기다리기 때문에 요청을 보낸 Thread는 응답이 오기 전까지는 아무것도 하지 못하는 Block 상태가 됩니다.

 

비동기 방식은 동기식과는 반대로 client에서 요청을 보내더라도 응답을 언제 받든지 다른 요청을 보낼 수 있으며, 요청1과 요청2는 별개의 작업단위(2개 이상의 쓰레드)로 움직이게 됩니다. 비동기식에서는 동기식과는 반대로 응답을 기다리지 않고 있으니 요청을 보낸 Thread는 다른 일을 할 수 있습니다. 요청을 보낸 후 응답을 기다리지 않고 다른 일을 하는 이러한 상태를 Non-Block 상태라고 합니다.

 

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

 

 

동기식 통신의 장 단점

1) 장점

  • Thread는 Request를 보내고 Response를 받고 Request를 다시 보내는 작업을 수행하기 때문에 요청과 응답값의 순서를 보장하게 된다.
  • 보낸 Request에 대한 처리 결과 값을 보장 받을 수 있다.

2) 단점

  • Response가 지연되게 된다면 Request를 보낸 Thread는 해당 Response를 계속 기다리는 상태가 된다는 단점이 있다.
  • 순차적으로 Response를 받고 Request를 받는 구조로 Response가 계속 지연되게 된다면 뒤에 들어오는 요청들은 Connection 가능한 Thread가 없어 연결을 맺지 못 해 성능이 떨어질 수 있다.

 

비동기식 통신의 장 단점

1) 장점

  • Response를 기다리지 않고 Non-Block 상태로 계속 자기일을 하는 Async(비동기식) 방식은 Sync(동기식) 방식에 비해 성능이 좋다.
  • 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있다.

2) 단점

  • Thread가 Response를 받지 않고 여러가지 요청 보냈을 때 뒤에 보낸 요청이 먼저 처리가 되었다면 뒤에 요청값에 대한 응답값이 먼저 올 수도 있다. 즉, 순서를 보장하지 않는다.
  • Response에 대한 처리 결과를 보장받고 처리해야 되는 서비스에는 적합하지 않다.

 

 

Blocking

자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것

 

 

Non-Blocking

다른 주체의 작업에 관련없이 자신의 작업을 하는 것

Blocking과 Non-Blocking의 차이는 
다른 주체가 작업할 때 자신의 제어권이 있는지 없는지로 볼 수 있습니다.

 

 

Blocking Vs Non-Blocking   ==>   제어의 관점

동기 vs 비동기  ==>  순서와 결과(처리)의 관점 

 

 

동기 & Blocking, 동기 Non-Blocking, 비동기 & Blocking, 비동기 Non-Blocking 조합

동기 비동기를 공부한다면 빠질 수 없는 표인데요.

 

 

다음 예시는 동기 & Blocking, 동기 Non-Blocking, 비동기 & Blocking, 비동기 Non-Blocking을 조합한 예시입니다.

(좋은 예시가 있어 다른분이 작성한 예시를 가져왔는데 출처는 아래쪽에 남기겠습니다.)

Blocking & Synchronous

나 : 대표님, 개발자 좀 더 뽑아주세요..
대표님 : 오케이, 잠깐만 거기 계세요!
나 : …?!!
대표님 : (채용 공고 등록.. 지원자 연락.. 면접 진행.. 연봉 협상..)
나 : (과정 지켜봄.. 궁금함.. 어차피 내 일 하러는 못 가고 계속 서 있음)

Blocking & Asynchronous

나 : 대표님, 개발자 좀 더 뽑아주세요..
대표님 : 오케이, 잠깐만 거기 계세요!
나 : …?!!
대표님 : (채용 공고 등록.. 지원자 연락.. 면접 진행.. 연봉 협상..)
나 : (안 궁금함.. 지나가는 말로 여쭈었는데 붙잡혀버림.. 딴 생각.. 못 가고 계속 서 있음)

Non-blocking & Synchronous

나 : 대표님, 개발자 좀 더 뽑아주세요..
대표님 : 알겠습니다. 가서 볼 일 보세요.
나 : 넵!
대표님 : (채용 공고 등록.. 지원자 연락.. 면접 진행.. 연봉 협상..)
나 : 채용하셨나요?
대표님 : 아직요.
나 : 채용하셨나요?
대표님 : 아직요.
나 : 채용하셨나요?
대표님 : 아직요~!!!!!!

Non-blocking & Asynchronous

나 : 대표님, 개발자 좀 더 뽑아주세요..
대표님 : 알겠습니다. 가서 볼 일 보세요.
나 : 넵!
대표님 : (채용 공고 등록.. 지원자 연락.. 면접 진행.. 연봉 협상..)
나 : (열일중..)
대표님 : 한 분 모시기로 했습니다~!
나 : 😍

 

 

 

🐹 Reference

 

[Network] 동기와 비동기

소프트웨어를 개발할 때 동기 또는 비동기적으로 코드를 작성하는 일은 매우 중요하다. 용도나 방식에 따라서 올바른 방식을 적절히 선택해야하는데 이러한 동기와 비동기에 대해 개념을 정리

velog.io

 

[Java] java에서 동기, 비동기란 무엇인가?

요즘 자료구조를 공부하는데 계속해서 나타나는 단어가 있습니다. 그게 바로 동기화 라는 단어인데 굉장히 유사한 기능을 가진 두 가지의 자료구조간의 차이점이 무엇인가 라고 찾아보았을 때

fftl.tistory.com

 

동기와 비동기, 그리고 블럭과 넌블럭

무릇 모든 개발자들, 아니 비단 개발자가 아니라 할지라도 컴퓨터 관련 산업계 종사자들이라면 오다 가다 한 번씩은 꼭 들어보고, 또 익혔음직한 내용이겠습니다. 이름하야, 동기(Synchronous)와 비

musma.github.io

 

반응형