Base/개념정리

동기/비동기, 블로킹/논블로킹, 동시성/병렬성

findmypiece 2021. 7. 8. 16:07
728x90

Spring 환경에서 역사가 깊고 가장 흔하게 사용되는 @Async 를 생각해보자. 우리는 이를 통해 논블로킹/비동기 로직을 만들 수 있다.

 

사실 비동기라는 표현이 대중적으로 사용되지만 논블로킹이라는 표현도 적지 않게 사용된다. 일반적으로 블로킹==동기, 논블로킹==비동기 공식은 성립하지만 용어가 다른만큼 각각이 의미하는 바도 다르므로 이를 정확하게 이해하고 넘어갈 필요가 있다. 

 

일반적으로 어떠한 test_1(), test_2(), test_3() 이라는 메소드를 순차적으로 호출하면 직전 메소드의 실행이 종료된 뒤에야 다음 메소드가 실행되고 이를 블로킹 방식이라 한다. 하지만 @Async를 사용하면 별도의 스레드에서 작업을 처리하기 때문에 직전 메소드의 종료와 무관하게 곧바로 다음 메소드가 실행되도록 할 수 있고 이를 논블로킹 방식이라 한다.

 

동기/비동기는 어떠한 작업의 결과를 어떻게 확인하는지에 따라 구분된다. DB insert 작업을 생각해보자. jdbc 스팩상 insert 메소드에서는 insert된 행수를 리턴하지만 이를 활용하는 경우도 있고 활용하지 않는 경우도 있다. 하지만 이 리턴값을 활용하든 말든 DB에 데이터가 등록되었다는 결과는 존재한다.

 

여기에 @Async 를 적용했다고 가정해보자. 메소드의 리턴타입을 void 로 할 경우 응답값을 확인하지 않고 메인 스레드는 종료되겠지만 어느 순간 DB에 데이터가 등록되었다는 결과가 생겨난다. 최초 요청과 연결이 끊어진 상태에서 비동기적으로 결과가 생겨난 것으로 이를 비동기 방식이라 한다.

 

반대로 메소드의 리턴타입을 Future 로 해서 메인스레드에서 get() 으로 확인할 경우 최초요청의 연결이 유지된 상태에서 동기적으로 결과가 생겨난 것으로 이를 동기방식이라 한다.

 

그렇다면 동시성과 병렬성은 뭘까? 이는 우리가 식사를 하는 환경을 생각해보면 쉽게 이해할 수 있다. 우리는 식사를 할 때 음식을 먹으며 대화도 나눌 수 있다.

 

그런데 음식이 입에 있는 상태에서는 말을 할 수가 없기 때문에 음식을 먹는 일과 대화를 하는 일은 각각 다른 시점에 자연스럽게 활용하게 된다. 하지만 우리는 음식을 먹으며 대화를 했다고 표현하고 이를 동시성이라 한다.

 

병렬성은 음식을 먹는 것과 대화를 하는 것이 완전히 동일한 시점에 수행되는 것을 말한다. 이게 가능하려면 사람(스레드)가 두명이어야 한다. 즉, 나는 음식을 먹고 말은 옆의 비서가 해주는 것이다. 이를 병렬성이라 한다.

728x90