Error handling 의 목적
개발자는 사용자가 서비스를 이용하는 동안 발생할 수 있는 에러를 미리 사전에 예측하여, 이용자의 사용 흐름이 막히지 않도록 유도해야합니다. 이런 과정을 에러 핸들링이라고 합니다.
에러 핸들링은 사용자로 하여금 서비스가 다시 안정화될 것이라는 믿음을 주고, 서비스 이용자의 이탈을 방지하기 위한 수단으로도 사용됩니다.
Error handling 의의
에러 핸들링은 엄밀히 말해, 에러 핸들링(Error Handling)과 예외 핸들링(Exception Handling) 두가지 종류로 구분됩니다. 에러와 예외 상황은 발생 상황과 발생 주체가 다릅니다. 에러는 컴퓨터가 내지만, 예외는 개발자가 의도적으로 발생시키는 것이죠.
에러는 언어의 문법 에러, 통신 장애로 발생하는 에러등 컴퓨터가 코드를 실행하는 과정 자체에서 발생하는 에러를 말합니다.consoe.log('오타') 를 보시면 console.log 가 아닌 다른 오타가 있기 때문에 Uncaught ReferenceError: consoe is not defined 라는 에러가 발생할 것입니다.실수로 오타를 내어서 컴퓨터가 자바스크립트 문법을 실행하는 과정 자체에서 더이상 진행할 수 없어서 발생한 에러입니다.
개발자가 의도적으로 발생시키는 예외상황
회원가입 상황을 예로 들자면 개발팀이 규칙 3개를 정했다고 가정해봅시다.
- 회원가입에 사용되는 이메일에는 @ 가 들어가야 한다.
- 비밀번호를 10자 이상 지정하도록 한다.
- 회원가입에 사용되는 계정은 중복될 수 없다.
이런 상황에서 유저가 비밀번호를 5자리만 설정하면 어떻게 될까요? 이런 경우, 개발자의 의도와는 다른 방향으로 유저가 서비스를 이용하고자 하므로 예외 상황에 해당합니다. 따라서, 개발자는 예상되는 예외 상황들을 나열하여, 잘못된 방법으로 서비스를 이용하는 것을 막아야 합니다.
아래와 같은 예외처리가 필요합니다.
- 회원가입에 사용되는 이메일에 @ 가 들어가지 않으면 에러 반환
- 비밀번호가 10자 미만이라면 에러 반환
- 이미 가입되어 있는 계정으로 가입 시도를 할 때 에러 반환
이와 같은 예외 상황은 엄밀히 말해 컴퓨터 언어 입장에서는 에러가 아닙니다. 문법이 틀리지 않았고, 함수를 정상적으로 호출했을 수 있기 때문입니다. 그러나 이런 예외 상황은 함수 내부에서 미리 if 문등으로 처리를 해두어야 합니다. 잘못된 방식으로 서비스를 이용하기 전에 예외 상황을 미리 일으켜 에러를 발생시키고, 클라이언트(프론트엔드) 개발자에게 에러 상황 에러 코드로 알립니다. 프론트엔드 개발자는 아래 에러를 반환받아서, 사용자(고객)에게 적절한 안내 문구를 띄워줍니다.
const { email, password } = req.body
if (!email.includes('@')) { return new Error('EMAIL_INVALID') }
if (password.length < 10) { return new Error('PASSWORD_INVALID') }
...
에러 발생 전 사전 처리, 발생한 에러를 잡아내고 처리하는 모든 과정을 에러 핸들링 이라 일컫습니다.
throw
위 예시에서는 특정 예외 상황에서 에러를 return 했는데, 이 방법은 에러를 발생시키는 일반적인 방법은 아닙니다. 자바스크립트 뿐만 아니라 여러 프로그래밍 언어에서 예외 상황에 에러를 발생시키는 방법은 throw 입니다. 아래와 같이 사용되는데, 어떤 예외 상황인지, 어떤 에러인지를 설명하기 위해서 ‘메세지' 부분이 필수로 들어갑니다.
throw new Error('EMAIL_INVALID')
new Error 문법은 따로 구글링해서 검색하시면 되는데, 그냥 간단하게 'EMAIL_INVALID'라는 message를 가진 에러를 생성한다 라고 이해하시면 됩니다.
try-catch
try-catch 문은 잠재적인 에러가 발생할 가능성이 있는 부분에서 에러를 처리하기 위한 용도로 사용합니다. try 블록에는 에러가 발생할 가능성이 있는 코드를 넣어두고, catch 블록에는 에러가 발생했을 때를 대비한 행동을 넣어둡니다.
try 블록에서 어떠한 예외 처리를 위해 에러를 throw하면 발생한 에러가 catch 블록으로 넘어가게 됩니다. 따라서 try 블록 내부에 throw 코드가 있거나, throw 코드를 내장하고 있는 다른 함수를 호출하는 부분이 있습니다.
try {
const { email, password } = req.body
if (!email.includes('@')) { const error = new Error('EMAIL_INVALID') error.statusCode = 400 throw error }
if (password.length < 10) { const error = new Error('PASSWORD_INVALID') error.statusCode = 400 throw error }
... }
catch (err) {
console.log(err) // 어떠한 형태의 에러가 발생하든, 에러를 콘솔에 찍어서 개발자에게 보여줍니다.
return res.json({error : err})
}
이렇게 에러 핸들링과 예외 핸들링에 대하여 공부해보았습니다.
try catch 문은 직접 코드를 작성하면서 공부하면 더 빠르게 습득할 수 있습니다.
'코딩 개발' 카테고리의 다른 글
RESTful API (0) | 2022.11.17 |
---|---|
Node - 각 layer 별 error handling (0) | 2022.11.14 |
MYSQL - WITH (0) | 2022.11.07 |
MYSQL - UNION (0) | 2022.11.07 |
Bcrypt & JWT (0) | 2022.11.07 |