#기타
비동기(Async) 처리와 코르박(Callback) 함수


개발자들과 함께 일하다 보면 가끔씩 '비동기로 처리 해주세요' 또는 '이거 Async하게 코드 짜세요' 와 같은 말들을 들을 수 있습니다. 인문학도였던 저는 '비동기'라는 단어를 처음 접했을때 코드가 사심없이 돌아간다라는 건가? 라는 생각을 했습니다. 동기를 목적 또는 사심의 의미로 이해했지요. 

하지만 프로그래밍 세계에서 동기와 비동기의 차이는 시간 흐름에 따른 작업 방식의 차이 입니다. 동기로 처리하든 비동기로 처리하든 결과는 같지만 실행의 흐름이 다릅니다. 이번에도 편의점 예시를 통해 이해를 try 하고 catch해 봅시다.

매니저는 손님의 주문을 받고 있습니다. 이 때 손님은 편의점 치킨 닭다리 1개와 담배 1개를 주문 하였습니다. 닭다리는 판매 전 매니저가 전자렌지에 3분 데웁니다. 한가한 시간에는 문제가 되지 않지만 손님이 몰리는 바쁜 시간에는 사정이 다릅니다. 만약 이 편의점의 포스기가 한대라고 가정한다면 주문을 가장 빨리 처리하는 방법은 어떤 것이 있을까요?

편의점의 상황상 매니저가 한번에 하나의 주문을 처리할 수 밖에 없습니다. 하지만 매니저가 치킨이 데워지고 있는 3분 동안에는 전자레인지 앞에 하릴없이 서있을 필요는 없습니다. 매니저의 주문 처리와 전자레인지의 실행은 독립적으로 처리 될 수 있습니다. 아래 시나리오를 살펴봅시다.

* 동기 처리 방식(Sync)
편의점 매니저는 고객의 주문을 처리합니다. 고객이 치킨을 주문 하였으므로 전자레인지에 3분동안 치킨을 데웁니다. 매니저는 전자레인지의 실행이 끝날 때까지 전자레인지 앞에서 대기 합니다. 이때 계산 대기열은 Blocking 됩니다. 전자레인지의 실행이 매니저를 점유하고 있기 때문이지요. 
이 경우 포스기는 CPU로 생각해 볼 수 있습니다. 그리고 전자레인지는 하드디스크로도 생각해 볼수가 있지요. CPU는 컴퓨터의 가장 중요한 정보 처리 장치 입니다. 하드디스크의 작업이 CPU의 작업을 Block 한다면 이보다 안타까운 일은 또 없겠죠? 
마찬가지로 전자레인지 앞에서 멀뚱히 기다리는 편의점 매니저를 보는 점주의 답답함은 이루 말로 표현할 수 없을 것입니다. 

* 비동기 처리 방식(Async)
일잘하는 에이스 알바생은 해당 주문을 다른 방법으로 처리합니다. 전자레인지의 실행이 끝날때 까지 대기 하지 않고 전자레인지를 실행 시킨 후 고객의 결제를 처리 합니다. 그리고 해당 고객을 주문 대기열에서 제거 한 뒤 다음 고객의 주문을 처리합니다. 
이 때 중요한 것은 다른 고객의 주문을 처리하는 와중에도 전자레인지의 실행이 끝난다면 다시 작업의 Context를 변경하여 완료된 치킨을 이전의 고객에게 전달해야 한다는 것입니다. 그리고 다시 이전 작업 Context로 돌아와서 진행했던 주문을 처리해야 합니다. 
비동기 작업은 항상 작업이 끝나면 실행 될 Callback 함수가 필요합니다. 작업에 대한 처리의 요청과 완결의 흐름이 연속적이지 않기 때문입니다. 이 예시에서 Callback 함수는 데워진 치킨을 고객에게 전달하고 감사 인사를 하는 작업으로 표현될 수 있습니다. 즉 Callback이란 비동기 처리 작업이 완료된 이후에 수행될 작업을 의미하는 것이지요.

실제 프로그래밍 세계에서 치킨을 전자레인지에 데우는 작업과 같은 예시는 아래와 같습니다.

- 디스크에서 파일을 읽는 작업
- 네트워크를 통해 데이터를 다운로드 하는 작업
- 화면에 이미지를 출력하는 작업

개발자는 위와 같은 작업을 처리할때 프로그램이 Blocking 되지 않도록 비동기로 처리 합니다. 작업이 처리하는데 오래 걸리며 전자레인지 처럼 작업을 처리하는 주체가 다를 경우 이지요. 

컴퓨터 세계와 현실 세계는 많은 부분 닮아 있는 듯 합니다. 다음 포스트에서는 Storage에 대한 내용을 알아보도록 하겠습니다. 감사합니다. 

아티클을 더 읽고 싶다면?
이오플래닛에 가입해주세요.
로그인 후 모든 아티클을 무료로 볼 수 있어요.
로그인/회원가입
링크 복사

댓글 0
댓글이 없습니다.
이번주 인기 아티클
추천 아티클
0