LHJ

I'm a FE developer.

14.2.3 오류 우선 콜백

20 May 2020 » js_lj

14.2.3 오류 우선 콜백

노드가 점점 인기를 얻어가던 시기에 오류 우선 콜백(error-first callback)이라는 패턴이 생겼습니다.
콜백을 사용하면 예외 처리가 어려워지므로(곧 이에 관해 살펴봅니다), 콜백과 관련된 에러를 처리할 방법의 표준이 필요했습니다.
이에 따라 나타난 패턴이 콜백의 첫 번째 매개변수에 에러 객체를 쓰자는 것이었습니다.
에러가 null이나 undefined이면 에러가 없는 것입니다.

오류 우선 콜백을 다룰 때 가장 먼저 생각할 것은 에러 매개변수를 체크하고 그에 맞게 반응하는 겁니다.
노드에서 파일 컨텐츠를 읽는다고 할 때, 오류 우선 콜백을 사용한다면 다음과 같은 코드를 쓰게 됩니다.

const fs = require('fs');

const fname = 'may_or_may_not_exist.txt';
fs.readFile(fname, function(err, data) {
    if (err) return console.error(`error reading file ${fname}: ${err.message}`);
    console.log(`${fname} contents: ${data}`);
})

콜백에서 가장 먼저 하는 일은 err이 참 같은 값인지 확인하는 겁니다.
err이 참 같은 값이라면 파일을 읽는 데 문제가 있다는 뜻이므로 콘솔에 오류를 보고하고 즉시 빠져나옵니다(console.error는 어떤 값으로 평가되지는 않지만, 반환값을 사용할 필요가 있는 것도 아니므로 문 하나로 결합했습니다).
오류 우선 콜백을 사용할 때 가장 많이 벌어지는 실수는 아마 이 부분일 겁니다.
에러 객체를 체크해야 한다는 사실을 기억하고, 아마 로그를 남기기도 하겠지만, 빠져나와야 한다는 사실은 잊는 사람이 많습니다.
콜백을 사용하는 함수는 대개 콜백이 성공적이라고 가정하고 만들어집니다.
그런데 콜백이 실패했으니, 빠져나가지 않으면 오류를 예약하는 것이나 다름없습니다.
물론, 콜백을 만들 때 실패하는 경우도 염두에 두고 만들었다면 에러를 기록하기만 하고 계속 진행해도 됩니다.

프로미스를 사용하지 않으면 오류 우선 콜백은 노드 개발의 표준이나 다름없습니다.
콜백을 사용하는 인터페이스를 만들 때는 오류 우선 콜백을 사용하길 강력히 권합니다.