joi와 if를 사용한 유효성 검사의 차이
`Joi`를 사용하여 요청 데이터를 검증할 때는 먼저 `Joi` 스키마를 정의한 후, 그 스키마를 사용하여 데이터를 검증해야 합니다.
Joi 스키마를 정의하고 이를 validate 미들웨어로 사용하여 요청 데이터를 검증하는 방식입니다.
이렇게 하면 데이터의 유효성을 체계적으로 검증할 수 있습니다. 아래는 이 과정을 단계별로 설명하는 예제 코드입니다.
### 1. `Joi` 스키마 정의
먼저, 회원가입 요청에 필요한 데이터에 대해 `Joi` 스키마를 정의합니다.
```javascript
import Joi from 'joi';
// 회원가입 요청 본문 스키마 정의
const signUpSchema = Joi.object({
email: Joi.string().email().required().messages({
'string.email': '올바른 이메일 형식을 입력해주세요.',
'any.required': '이메일을 입력해주세요.',
}),
password: Joi.string().min(6).required().messages({
'string.min': '비밀번호는 최소 6자 이상이어야 합니다.',
'any.required': '비밀번호를 입력해주세요.',
}),
passwordConfirm: Joi.string().required().valid(Joi.ref('password')).messages({
'any.only': '비밀번호가 일치하지 않습니다.',
'any.required': '비밀번호 확인을 입력해주세요.',
}),
name: Joi.string().required().messages({
'any.required': '이름을 입력해주세요.',
}),
});
```
### 2. 유효성 검증 미들웨어 정의
`Joi` 스키마를 사용하여 요청 데이터를 검증하는 미들웨어를 정의합니다.
```javascript
const validate = (schema) => (req, res, next) => {
const { error } = schema.validate(req.body);
if (error) {
const message = error.details[0].message;
return res.status(400).json({ success: false, message });
}
next();
};
```
### 3. 라우터 설정
라우터에서 미들웨어를 사용하여 요청 데이터를 검증하고, 검증이 통과되면 다음 작업을 수행합니다.
```javascript
import express from 'express';
import bcrypt from 'bcrypt';
import { prisma } from '../utils/prisma.util.js';
const router = express.Router();
const saltRounds = 10; // 비밀번호 해싱을 위한 saltRounds 설정
/** 사용자 회원가입 API **/
router.post('/auth/sign-up', validate(signUpSchema), async (req, res, next) => {
try {
const { email, password, name } = req.body;
// 이메일 중복 체크
const user = await prisma.user.findFirst({
where: { email },
});
if (user) {
return res.status(400).json({ success: false, message: '사용할 수 없는 이메일입니다.' });
}
// 비밀번호 해싱
const hashedPassword = await bcrypt.hash(password, saltRounds);
// 새로운 사용자 생성
const newUser = await prisma.user.create({
data: {
email,
password: hashedPassword,
name,
},
});
// 응답
res.status(201).json({ success: true, message: '회원가입이 성공적으로 완료되었습니다.', user: newUser });
} catch (err) {
next(err);
}
});
export default router;
```
### 요약
1. **`Joi` 스키마 정의**: `signUpSchema`를 정의하여 요청 데이터의 유효성을 검사합니다.
2. **유효성 검증 미들웨어 정의**: `validate` 미들웨어를 정의하여 요청 데이터를 검증하고, 오류가 있을 경우 적절한 메시지와 함께 400 상태 코드를 반환합니다.
3. **라우터 설정**: `/auth/sign-up` 라우트를 설정하고, 요청 본문을 검증한 후, 이메일 중복 체크, 비밀번호 해싱, 사용자 생성 등의 작업을 수행합니다.
이렇게 하면 `Joi`를 사용하여 요청 데이터를 효율적으로 검증할 수 있습니다.
유효성 검사를 위한 코드가 길어질 수 있지만, 이를 모듈화하여 코드의 가독성과 유지보수성을 높일 수 있습니다. 예를 들어, 유효성 검사를 별도의 파일로 분리하여 관리하고, 이를 필요한 곳에서 불러와 사용할 수 있습니다. 이렇게 하면 라우터 파일의 복잡성을 줄이고, 코드의 재사용성을 높일 수 있습니다.