Fail fast 원칙을 적용한 코드의 가장 큰 장점은 Indentation이 적용되는 범위를 줄일 수 있다는 것이다. 보통 에러 케이스는 throw new Error
만하고 끝나니까 위쪽에서 일찌감치 처리해두고 중요한 본문에 집중할 수 있다.
적용 예시
function printUserProfile(user) {
// 에러 케이스들만 빠르게 처리한다.
if(!user) {
throw new NotFoundException();
}
if(!user.profile) {
throw new BadRequestException('프로필을 입력하지 않았습니다.');
}
// print하는 로직 ...
}
종만북에서 기저사례부터 처리하는 것을 보고 영감을 받아 자주 사용하던 기법인데 이렇게 정식 명칭이 있는줄은 몰랐다!
참고할만한 글
되도록 마지막 단계에서 Error handling을 하자. 초반 단계에서의 error handling은 읽는 이에게 예상치 못한 컨텍스트가 될 수 있다. 쓰는 쪽에서 exception 대응이 충분히 되어있다면 넘어가자.
예시
// BAD: initializeGa를 읽으며 에러 발생을 예측하기 어렵다.
const getGaId = () => {
const result = process.env.GA_ID;
if (!result) {
throw new Error('GA ID 없다!');
}
return result;
}
const initializeGa = () => {
const tId = getGaId();
// ...
}
// GOOD
const getGaId = () => {
return process.env.GA_ID;
}
const initializeGa = () => {
const gaId = getGaId();
if (!gaId) {
throw new Error('GA ID 없다!');
}
// ...
}
물론 무작정 이 방법을 적용해야하는 것은 아니다. 각 계층 및 빌딩블록의 용도에 맞게 로직을 배치하는게 더 중요하다! 상황에 따라 잘 적용하자.