brunch

You can make anything
by writing

C.S.Lewis

by 김영빈 Jul 01. 2024

비동기 작업 환경

구조가 기능을 결정한다

비동기 작업을 알기 전에 동기 작업을 알아보자. 동기 작업은...      

순차적 실행: 모든 작업이 순서대로 실행되며, 하나의 작업이 끝나야 다음 작업이 시작된다.

블로킹(Blocking): 현재 작업이 완료될 때까지 다음 작업을 기다린다. 작업이 완료될 때까지 프로그램의 다른 작업이 실행되지 않는다. 작업 시간이 긴 경우 전체 프로그램이 멈추게 되는 비효율이 있다.

단순성: 코드가 직관적이고 이해하기 쉽다. 디버깅도 비교적 간단하다.

예측 가능성: 작업이 정해진 순서대로 실행되므로, 실행 순서를 예측하기 쉽다.

그리고 비동기 작업은...      

논 블로킹(Non-Blocking): 특정 작업을 시작한 후 그 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속 수행할 수 있도록 하는 프로그래밍 기법이다. 이를 통해 프로그램은 동시에 여러 작업을 처리할 수 있다.

병렬 처리: 여러 작업을 병렬로 수행할 수 있어 프로그램의 전체 수행 시간이 단축된다. 시간이 오래 걸리는 작업을 병렬적으로 처리하면 CPU를 더 효율적으로 사용할 수 있다.

복잡성: 작업이 정해진 순서대로 실행되고 완료되는 것이 아니기 때문에, 작업의 순서가 복잡하고 디버깅이 쉽지 않다.

콜백(Callback): 작업이 완료되면, 보통 콜백 함수를 통해 완료된 지를 알 수 있다. 콜백 함수는 작업이 완료 된 후에 처리되어야 할 추가 작업을 미리 기술한 것과 비슷하다. 콜백 함수는 이후 적절한 시점에 실행된다.

 이를 통해서 비동기 작업은 동기 작업의 단점을 상쇄하여 프로그램 전체의 성능을 끌어 올릴 수 있지만, 관리의 어려움이 있을 수 있다. 


 우리의 업무가, 특히 사무실에서, 동기적이어서 불편함을 겪거나 처리 성능의 부족함을 겪는다면 이러한 비동기 작업 방식을 도입하면 도움이 될 수 있다고 생각한다. 비동기 작업을 업무 환경에 적용하기에 앞서서, 비동기 작업을 활용해 성공한 기술인 node.js를 알아보자. 그리고 node.js를 차용해서 업무 환경에 적용해보자(성공사례를 적용하려고 한다). 

node.js는 ...      

javascript로 서버 서비스를 할 수 있도록 해주는 환경(런타임)이다.

2009년 Ryan Dahl이 만들었다. 2015년에는 재단이 설립됐다.

이후 커뮤니티의 확장과 함께 폭발적인 성장으로 지금은 백엔드 표준 기술 중 하나로 자리잡았다.

node.js의 주요 특징으로는 ...

비동기 처리      

비동기 이벤트 기반 아키텍처로 서버가 대규모로 동시 연결을 처리 할 수 있다.

병렬처리가 가능하여 높은 성능을 보여준다.

단일 스레드로 스케줄링      

태스크들끼리 충돌될 위험이 적다. 비동기 작업의 단점인 복잡성에 의한 리스크를 크게 줄여준다.

서로 다른 프로그램 및 함수 간의 블로킹에서 벗어날 수 있어, 다양한 서비스로 확장하는데 유연하다.

 비동기 처리와 단독 스케줄링이라는 node.js의 특징을 어떻게 현실 업무 세계에 적용할 수 있을까? 현재의 업무 구조를 비동기 작업이 적용될 수 있도록 알맞게 변경해야 한다. 구조가 기능을 결정한다!

기존 작업들을 비동기 작업으로 만들자      

작업이 비동기적으로 구성이 되어야, 비동기적으로 처리할 수 있다(구조가 기능을 결정한다). 비동기적으로 구성된 작업들은 여러 조직원들에게 분산되어서 동시에 처리될 수 있고, 이는 팀 전체의 처리 성능을 높힌다.

작업을 분해하자: 분열하여 정복하라(링크). 기존의 동기 작업을 비동기 작업과 콜백 함수로 나누자. 좀 더 현실적인 개념으로 접근하면 '순수 작업'과 '권한이 필요한 작업(이하 요권 작업)'으로 분리하자(작업 = 비동기 작업 + 콜백 함수 = 순수 작업 + 요권 작업). 비동기 작업이 완료되고 나서 콜백 함수가 실행되 듯, 순수 작업이 끝나고 요권작업을 실행하자.

요권 작업의 종류: 요권 작업은 결정과 평가가 있다. 작업이 지속될 것인지 종료될 것인지 결정하는 것과 이를 위해서 평가하는 작업이다. 이러한 작업은, 당연하게, 권한이 필요하고 조직장이 담당할 것이다.

업무 스케줄링의 단일 문맥(context)      

조직장은 요권 작업을 하고 조직원은 순수 작업을 한다: 조직원이 순수 작업을 완료하고 요권 작업을 조작장에게 전달한다. 조직장은 자신의 권한으로 요권 작업을 실행한다. 권한과 책임에 따라서 각자 해야 할 일을 한다.

조직장은 스케줄링을 한다: 조직장은 node.js의 단일 스레드의 역할을 하여, 단독 문맥을 갖는다. 스케줄링에 책임을 가지고 태스크들끼리 충돌하지 않도록 한다. 이를 통해 태스크 간의 충돌, 블로킹 리스크를 줄인다. 또한 이를 통해서 다양한 성격의 서비스끼리의 충돌도 피할 수 있어서 확장성이 보장된다.

이를 통해서 회사의 업무 환경을 비동기 작업이 가능하도록 구성할 수 있다. 추가로 작업을 순수작업과 요권작업으로 어떻게 분리하면 좋을까? 작업을 분해하기 위한 관점 3가지 포인트를 제시한다.      

작업의 정의: 작업을 분명하게 정의해야 작업의 목적을 정할 수 있다.

작업에 필요한 권한: 작업에 어떤 권한들이 필요한지 확인해야 한다. 그래야 일반 작업과 요권 작업을 분리하는 경계를 지을 수 있다.

작업자의 권한과 책임: '해당 작업자의 권한'과 '작업에 필요한 권한'을 비교해서 일반 작업과 요권 작업의 경계를 짓고 분리한다. 그리고 일반 작업에 대한 작업자의 책임을 명시한다.



 서비스가 성장할 수록       

높은 처리 속도

다양한 비지니스 시장의 접촉

추가적으로 필요한 새로운 서비스

를 감당해 내어야 한다. 이러한 새로움에 대응하기 위해서는 유연함과 확장성 그리고 성능이 당연하게 필요할 것이다. 하지만 자원의 확장은 쉽지 않다. 새로운 동료, 새로운 인프라, 새로운 사무실 등은 비용도 많이 들고 적응하는데도 큰 시간이 들어간다(그리고 시간도 자원이다). 싸고 빠르고 좋은건 없기 때문에 기존 방식대로 한다면 한계가 명확하다. 이럴 때, 새로운 구조를 고민해 보자. 비동기 작업 환경을 통해서 적은 비용(자원)으로 높은 효율을 달성하는 것이다. 구조가 기능을 결정한다. 걱정의 구조도 바꿔서 고민해 보자 :-)

작가의 이전글 회사는 주니어의 성장을 책임져야 할까?
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari