joi

joi와 if를 사용한 유효성 검사의 차이

momomoo 2024. 5. 29. 13:12

`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`를 사용하여 요청 데이터를 효율적으로 검증할 수 있습니다.



유효성 검사를 위한 코드가 길어질 수 있지만, 이를 모듈화하여 코드의 가독성과 유지보수성을 높일 수 있습니다. 예를 들어, 유효성 검사를 별도의 파일로 분리하여 관리하고, 이를 필요한 곳에서 불러와 사용할 수 있습니다. 이렇게 하면 라우터 파일의 복잡성을 줄이고, 코드의 재사용성을 높일 수 있습니다.