꾸르빅 블로그
[디자인 패턴 바이블] 4장. 콜백을 사용한 비동기 제어 흐름 패턴 본문
4-1. 비동기 프로그래밍의 어려움
- Javascript는 클로저와 익명 함수로 인해 개발자가 코드베이스 지점을 옮겨다니지 않고 원할한 프로그래밍을 할 수 있게 해준다. 따라서 비동기 코드 작성 시 제어를 놓치는 일이 흔하게 발생한다.
4-1-1. 콜백 지옥
- 많은 클로저와 in-place 콜백 정의가 코드의 가독성을 떨어뜨리고 관리할수 없는 덩어리 형태로 만드는 것을 콜백 지옥이라고 한다.
- 콜백 지옥의 문제점
1) 가독성 하락
2) 스코프에서 사용되는 변수 이름 중복(ex. err). 어떤 이들은 각 스코프의 객체를 구분(err, err1, err2, error)하려고 하고, 어떤 이들은 항상 같은 이름(err)을 사용하려고 하는 등 코드컨벤션을 맞추기 어려워진다.
3) 성능 하락(클로저는 성능 및 메모리를 많이 점유한다) 및 메모리 누수 가능성

4-2-1. 콜백 규칙
1. 콜백을 정의할 때 in-place 함수 정의를 남용하지 않는다. 가급적 중첩없이 개별적인 함수를 작성한다.
2. 빠른 반환 원칙 : callback 실행 후에도 함수가 계속 동작하기 떄문에 나머지 함수의 실행을 차단하는 return 명령어를 삽입하는것을 잊지 말아야 한다! 자주 발생하는 실수!
// 비선호
if (err) {
cb(err)
} else {
}
// 선호
if (err) {
return cb(err)
}
4-2-3. 순차 실행
- 일련의 작업을 순차적으로 실행한다는 것은 한번에 하나씩 실행한다는 것. 즉, 실행 순서가 중요하고 이를 지켜야 한다.

- 직접방식의 블로킹API를 사용하여 구현할때는 비교적 간단하지만, 일반적인 비동기 API를 사용하는 경우 콜백 지옥의 주된 원인이 된다.
- 코드를 개발하는 경우 컬렉션을 이용하여 작업 목록을 순차적으로 반복하고, 완료 시 비동기 작업(콜백)을 수행하는 방식으로 개발할 수 있다. = reduce 알고리즘의 기본이 되는 패턴.

4-2-4. 무한 병렬 실행
- 비동기 작업들의 실행 순서가 중요하지 않고, 작업의 모든 실행이 끝났을 때 알림을 받으면 되는 작업
- Node.js의 블로킹 성질(내부적으로 동시 처리) 덕분에 단일 스레드임에도 불구하고 동시성을 달성할 수 있다.

- 각 작업이 완료되면 결과를 컬렉션에 모으거나, 배열에 매핑 후 완료되었다는 finish() 콜백을 호출하는 방식으로 구현할 수 있다. 이때 경쟁(competitive race)를 주의해야 한다.
- 병렬에서 다중 작업이 실행되고 있을 때, 외부 리소스에 대한 접근에 대한 경쟁 상태(race condition)을 가질 수 있기 떄문!
- Node.js는 단일 스레드에서 실행되고 병렬화를 일반적인 방법으로 사용하기 떄문에, 다중 스레드 프로그래밍에서 사용하는 동기화 메커니즘(lock, 뮤텍스, 세마포어) 같은 구조를 사용하지 않아도 된다.

4-2-5. 제한된 병렬 실행
- 무한 병렬 수행은 Dos(Denial-of-service) 공격에 취약하기 때문에 병렬 작업의 수를 제한하는 것이 복원력있는 애플리케이션을 만드는데 도움이 된다.

- 한번에 수행하는 동시성을 제한하는 방식으로 간단하게 구현할 수 있다(순차실행 + 병렬실행의 혼합). 이경우 작업 순서를 지정할 수도 있으며, 동시에 실행하는 수만 지정하고자 하는 경우 큐(Queue)를 사용하는 메커니즘으로 구현하면 된다.
- 큐 + EventEmitter를 혼합하여 관찰자 패턴을 조합하면, 에러가 발생한 경우에도 큐가 정상적으로 동작하며, 큐 기반 시스템에서 작업이 정지되지 않고 에러 발생 시 재시도 및 복구전략을 수립할 수 있다.
4-3. 비동기 라이브러리
- nodejs에서 주로 사용하는 async 라이브러리가 이와 같은 방식이다.
1) 컬렉션으로 비동기 함수 수행(순차적/제한된 동시성과 함께 병렬 수행)
2) 모든 함수의 출력이 다음 함수의 입력이 되는 비동기 함수 체인
3) Queue 추상화 사용.
'도서 > Node.js' 카테고리의 다른 글
| [디자인 패턴 바이블] 3장. 콜백과 이벤트 (2) (0) | 2024.03.24 |
|---|---|
| [디자인 패턴 바이블] 3장. 콜백과 이벤트 (1) (0) | 2023.06.04 |
| [디자인 패턴 바이블] 2장. 모듈 시스템 (0) | 2023.03.05 |
| [디자인 패턴 바이블] 1장. Node.js 플랫폼 (0) | 2023.03.05 |
| [디자인 패턴 바이블] 0. Design Pattern 공부 시작 (0) | 2022.10.09 |