동기
동기적 작업은 각 작업이 순차적으로 하나씩 실행되는 것을 말한다. 동기적 작업이 호출되면 프로그램은 해당 작업이 완료될 때까지 기다린 후 다음 작업으로 넘어간다. 이는 작업이 시간이 걸릴 때 해당 작업이 완료될 때까지 전체 프로그램이 일시중지됨을 의미한다. 동기적 작업은 이해하기 쉽고 다루기도 간단하지만, 시간이 오래 걸리는 작업을 기다려야 하는 애플리케이션에서 성능 병목 현상과 반응성 저하를 초래할 수 있다.
비동기
비동기적 작업은 작업을 순차적으로 실행하지 않고 병행적으로 실행할 수 있는 것을 의미한다. 비동기 작업이 시작되면 프로그램은 작업이 완료될 때까지 기다리지 않는다. 대신, 다른 작업을 계속하고 비동기 작업이 완료되면 콜백이나 다른 메커니즘을 사용하여 프로그램에 완료를 알린다. 이 접근 방식은 외부 소스에서 데이터를 가져오거나 I/O 작업을 수행하거나 사용자 입력을 기다리는 작업과 같이 시간이 오래 걸릴 수 있는 작업에 특히 유용하다.
블로킹
블로킹은 작업이 실행 중일 때 해당 작업이 완료될 때까지 다른 작업이나 프로그램이 기다려야 하는 상태를 말한다. 블로킹 작업을 호출하면 프로그램이 그 작업이 완료될 때까지 멈추고 대기하게 된다. 예를 들어 데이터를 기다리거나, 외부 리소스에 접근할 때 사용될 수 있다. 블로킹 작업을 수행 중인 동안 다른 작업은 실행되지 않고 대기 상태에 머무르게 된다.
논블로킹
논블로킹은 작업이 실행 중일 때 해당 작업의 완료 여부와 상관없이 다른 작업이나 프로그램이 계속 실행될 수 있는 상태를 말한다. 논블로킹 작업을 호출하면 작업이 완료되지 않아도 바로 다음 작업으로 넘어가며, 작업이 완료되면 알림 메커니즘을 통해 그 결과를 받을 수 있다. 이는 대기하지 않고 프로그램이 계속 진행되도록 하는 데 사용된다.
동기/비동기 와 블로킹/논블로킹의 차이점
블로킹 작업은 한 작업이 다른 작업의 완료를 기다리는 동안 작업이 멈추고 대기하는 상태이다. 이러한 작업은 주로 입출력 작업(파일 읽기, 네트워크 요청 등)에서 발생한다. 블로킹 작업은 해당 작업을 기다리는 동안 CPU 자원을 낭비하게 되며, 다른 작업은 멈춰있는 상태이다.
논블로킹 작업은 작업이 진행되는 동안 다른 작업을 계속할 수 있는 상태이다. 논블로킹 작업은 주로 비동기식 프로그래밍에서 사용된다. 작업의 상태나 결과를 주기적으로 체크하거나, 작업 완료 시 콜백 함수를 호출하여 처리한다.
동기적 작업은 한 작업이 다른 작업의 완료를 기다린 후에 실행된다. 동기적 작업은 코드의 순서대로 실행되는 것을 강조하며, 블로킹 작업일 수도 있고 논블로킹 작업일 수도 있다.
비동기적 작업은 한 작업이 다른 작업의 완료를 기다리지 않고 실행된다. 비동기적 작업은 작업이 완료될 때까지 기다리지 않고 다음 작업으로 넘어간다. 이때 작업은 백그라운드에서 동시에 실행되거나, 대기 시간이 필요한 작업에서도 블로킹을 피할 수 있도록 해준다.
동기 & 블로킹
파일을 읽는 작업 - 파일을 읽을 때까지 프로그램이 기다리며 다른 작업을 수행하지 않는다. 이 작업은 블로킹이며 동기적.
비동기 & 논블로킹
네트워크 요청을 보낸 후 결과를 기다리지 않고 다른 작업을 수행하는 것은 논블로킹이며 비동기적. 이 작업은 백그라운드에서 실행되거나 결과가 준비될 때까지 다른 작업을 계속할 수 있다.
블로킹 작업은 작업이 다른 작업의 완료를 기다리며 대기하는 상태를 말하고, 논블로킹 작업은 작업이 진행 중일 때 다른 작업을 계속할 수 있는 상태를 의미한다. 동기적 작업은 작업의 실행이 순차적으로 이루어지며 다른 작업의 완료를 기다리는 상황을 나타내고, 비동기적 작업은 작업이 진행 중일 때 다른 작업으로 넘어가는 상황을 의미한다.
동기 비동기의 결정은 아무래도 서비스에서 정확성이 중요한 부분이 어디인가에 초점을 맞추고 생각하게 되었다. 임의로 만든 포인트 결제 서비스이지만 실제 서비스로 대입해본다면 이러한 결제 부분은 동기적 접근이 필수라는 생각이 들었다. 주문이 요청되고 해당 주문에 따른 상품 가격을 포인트에서 차감하는 작업이 선행되어야 이후에 주문이 완료되는 방식이 보다 안전하고 신뢰도 있는 프로세스라고 생각했다. 반면 경매는 포인트와 직접적인 연관이 있는 부분도 없고, 이미 포인트 내에서 지불할 수 있는 예치금만 입찰이 가능하기 때문에 결제보다는 조금 덜 복잡하고 빠르게 비동기적으로 접근해도 괜찮을 거 같다는 생각이 들었다. 다만 관건은 해당 포인트의 유효성 검사를 동기적으로 받아와야할 것 같다는 고민이 생겼다. 어쨌든 입찰은 해당 입찰금액이 포인트보다 적어야한다는 게 입증되어야 진행되니까, 이 부분을 동기적으로 처리하는 법에 대해서는 생각해볼 필요가 있을 것 같다.
임시 저장을 하고 이를 실제로 저장하거나 삭제하는 부분에 있어서 여러 트랜잭션이 발생하여 성능적 저하가 발생하지 않을까 하는 의문이 들지만, 팀원들과 좀 더 얘기해보고 이 부분을 실제 코드로 작성하고 성능적 척도를 보고 수정해야할 것 같다는 느낌이 든다.앞으로 프로젝트를 진행하면서 변경사항이 있을 수 있겠지만, 일단은 지금은 동기, 비동기 접근을 이런 식으로 하는 게 좋지 않을까 싶다.
'실전 프로젝트 > 프로젝트 과정' 카테고리의 다른 글
실전 프로젝트 16 - 카프카 이벤트 처리(Auction Producer) (0) | 2023.08.21 |
---|---|
실전 프로젝트 15 - MVP 중간발표 (0) | 2023.08.19 |
실전 프로젝트 13 - 서비스 아키텍처 (0) | 2023.08.17 |
실전 프로젝트 12 - Axios (0) | 2023.08.16 |
실전 프로젝트 11 - @EnableScheduling, 테스트 코드 (0) | 2023.08.15 |