본문 바로가기
javascript/모던 자바스크립트

동기 처리와 비동기 처리

by choi-dev 2024. 3. 21.

처음엔 단순히 비동기 처리는 뭐다! 하고 자바스크립트에선 setTimeout, Promise, async/await이 있다라고 이해하고 넘어가려 했다. 하지만 스프링 부트를 가지고 공부를 했을 당시에 내부에서 비동기 처리를 해본 적이 없으니 명확한 차이를 알고 싶어졌다.

 

스프링부트에서 처리했던 방식

내가 스프링부트를 사용해 서버 단에서 데이터를 처리했던 방식은 대부분 동기적인 방식이었다. 동기 처리에 대한 개념은 순차적으로 데이터를 처리하는 것이라 생각하면 되는데 순차적으로 처리하기에 처리하던 부분이 완료될 때까지 기다려야되는 상황이 생긴다.

 

그러면 동기 처리는 별로인가?

그렇다는 것은 아니다. 상황에 따라서 동기 처리가 좋을지 비동기 처리가 좋을지는 경험을 통해서 알아가야 할 것이라고 생각하고 있다. 동기 처리가 좋은 예시는 무엇이 있을까? 내가 생각하는 동기 처리에 대한 좋은 예시는 상품을 구매하고 났을 때 일어나는 트랜잭션에 대한 예시가 좋을 것이라고 본다.

 

무슨 소리인지 좀 더 구체적으로 설명해주자면, 먼저 상품을 구매하고 났을 때 일어나는 비즈니스 로직부터 생각해보자. 우리가 한 쇼핑몰 사이트에서 물건을 구매했을 때 클라이언트 단에서는 단순히 구매가 완료되었다고 보이겠지만 서버에서는 그렇지 않다. 가장 먼저 해당 상품에 대한 재고 수를 빼주어야 하고 사용자가 주문한 상품에 대한 정보와 생성된 주문 정보를 저장하고 또한 결제에 대한 정보를 저장하는 등의 다양한 서비스 로직이 동작할 것이다.

 

여기서 생각을 조금 더 해보자. 만약 order_product라고 하는 테이블이 있고 orders라는 테이블이 있는데 order_product 테이블에 먼저 주문번호를 생성해 저장해주고 orders에 그 주문번호를 저장해준다 했을 때, 이를 비동기적으로 구성했다면 어떤 문제가 발생할 수 있을까? 

 

내가 생각한 것은 불특정 상황으로 인해 order_product에 저장하는 비즈니스 로직 안에서 주문번호를 생성해주는 부분이 완료되기 전에 orders에 주문번호가 없이 저장되는 경우가 생겨버릴 수도 있다. 이 경우는 운영에 있어서 큰 문제가 될 수도 있는 부분이다. 이처럼 트랜잭션이 발생하는 상황에서 순차적으로 처리해야할 경우는 비동기 처리보다는 동기 처리가 프로세스에 더 알맞을 수도 있다.

 

정리하자면

비동기 처리라는게 스레드를 병렬적으로 업무를 처리하게 해주어 하나의 동작 완료를 기다리지 않고 다음 동작을 실행시켜주는 어떻게 보면 효율적인 방식이라고도 볼 수 있다. 하지만 무조건적으로 비동기 처리를 채택하는 방식은 아니라고 생각한다. 

 

상황에 따라서 동기적으로 처리할지 비동기적으로 처리할지에 대해 생각할 필요성이 있고 신중히 선택해야할 것이라고 생각한다.