If문 뒤에 Else문을 붙이지 않도록 개발하자. 이유를 한 번 알아보자.
아래 코드를 봤을 때 우리는 어떤 코드인지 단 번에 예측 가능하다.
if (x !== 0) {
return 10 / x;
}
그러나 아래의 코드만을 봤을 때 다음 코드가 무슨 말을 하는지는 모를 것이다.
else {
return 0;
}
왜 0을 리턴하는지? 일반적인 반환 형태인지? 문제가 있다는 것을 반환하는 것인지?
단 번에 이해하기 힘들다.
다양한 상황에서 어떤 변수의 값을 검증해야할 때가 많다. 다음 예시를 보자.
const doSomething = (err, something) => {
if (err) {
console.log(err);
} else {
if(something.OK) {
//Do Something
} else {
console.log('Invalid');
}
}
}
if
, else
가 뒤엉켜있다. 다음과 같이 바꿔보자
const doSomething = (err, something) => {
if (err) {
return console.log(err);
}
if (!something.OK) {
return console.log('Invalid');
}
//Do Something
}
검증이 필요한 경우 중요한 로직이 작동하기 전에 검사하고 리턴을 시켜주는 것으로 코드를 명확하게 작성할 수 있다.
비동기 처리의 경우 다음 예시처럼 작성할 수 있다.
const doSomething = async (err) => {
if (err) {
throw err;
}
//Do something
}
throw
를 적절하게 활용하여 검증을 빠르게 처리하고 함수를 중단시킬 수 있다.
내가 본 많은 사람들이 다음과 같은 문제를 간과한다.
app.get('/', (req, res, next) => {
res.send({});
console.log('hi'); // hi
});
res.send
메서드는 return
이나 throw
처럼 코드를 중지 시키지 않는다.
즉, console.log
함수는 그대로 실행된다.
아래 코드는 express에서 사용을 권장하는 에러 처리 handler
이다.
app.use((err, req, res, next) => {
// Error handler
// 에러 처리 로직...
});
이 handler
는 next
메서드의 파라미터가 비어있지 않을 경우에 작동한다. 즉 아래의 코드 처럼 handler
안에서 next
메서드의 에러를 집어넣어 사용하며 err
파라미터를 통해 에러를 전달받아 처리할 수 있다.
app.get('/', (req, res, next) => {
next(new Error('Error'));
});
하지만 위에서 언급했던 방식대로 next
함수는 return
과 throw
처럼 함수를 즉시 중단시켜주지 않기 때문에 다음과 같은 방식으로 사용해야 한다.
app.get('/', (req, res, next) => {
return next(new Error('Error'));
});
API 사용자로부터 데이터를 검증하거나 에러가 발생하면 즉시 에러 처리 handler
로 던져주면 된다. 다음 예시를 보자.
app.post('/auth', (req, res, next) => {
// from FE
const inputId = req.body.id;
if (!inputId) {
return next({ status: 400, message: 'Bad Request' });
}
// Do Something
});
코드가 깔끔해진다.
누군가는 당연한 것 아니냐고 물어본다. 하지만 필자는 이 내용을 개발 공부 시작한지 1년 6개월이 지나서야 깨달았다. 작동에 문제가 되지 않았으니 말이다.
return next
만 알았어도 여태 작성한 복잡한 로직들을 전부 단순하게 처리할 수 있었는데... 아쉬움이 많이 남아있다.
Else
쓰지 말라고 알려주신 창준님께 다시 한 번 감사인사 드립니다. 감사합니다.
잘 봤습니다. 좋은 글 감사합니다.