클라이언트(사용자)가 보낸 데이터는 절대 믿으면 안 됩니다. 나이를 실수로 문자로 보내거나 이메일 형식이 아닌 엉뚱한 데이터를 DB에 넣으려다 서버가 터지는 것을 막기 위해, 백엔드 컨트롤러 입구에서 데이터를 깐깐하게 검문하는 필수 절차입니다. 주로 Joi 라이브러리를 사용합니다.
💡 핵심 비유: 클럽 가드의 체크리스트 (Schema)
클럽 가드(서버)가 미리 "성인일 것, 슬리퍼 금지, 마스크 착용" 이라는 체크리스트(Schema)를 들고 있습니다. 손님(Data)이 들어올 때 이 체크리스트와 대조해서 하나라도 어긋나면 입구컷 (400 Bad Request)을 시켜버리는 원리입니다.
🛡️ Validation 성공 vs 실패 흐름
📐 Joi 주요 스키마 규칙
메서드
설명
예시
.string() / .number()
데이터의 기본 자료형 검사
Joi.number()
.min(n) / .max(n)
글자 수 또는 숫자의 최소/최대 길이 지정
Joi.string().min(4)
.required()
반드시 제출해야 하는 필수 값 지정 (없으면 에러)
Joi.string().required()
.email() / .pattern(RegExp)
정확한 이메일 형식인지, 혹은 특정 정규식에 맞는지 패턴 검사
Joi.string().email()
Joi 검증(Validation) 시뮬레이션
클라이언트가 잘못된 데이터를 보냈을 때 백엔드 스키마가 어떻게 걸러내고 400 Bad Request를 띄우는지 테스트해 보세요.
validator.js (Joi 스키마 적용)
const express = require('express');
const Joi = require('joi'); // Joi 라이브러리 임포트
const app = express();
app.use(express.json());
// 1. 체크리스트 (Schema) 정의
const signupSchema = Joi.object({
// username: 3~15자 영문/숫자 조합, 필수
username: Joi.string().alphanum().min(3).max(15).required(),
// age: 숫자만 허용, 필수 아님
age: Joi.number(),
// email: 이메일 형식, 필수
email: Joi.string().email().required()
});
app.post('/signup', (req, res) => {
// 2. req.body를 미리 정의해둔 스키마와 대조하여 검문
const { error, value } = signupSchema.validate(req.body);
// 3. 하나라도 규칙에 어긋나면? -> DB 접근 차단 및 에러 반환!
if (error) {
return res.status(400).json({
success: false,
message: error.details[0].message // Joi가 알려주는 친절한 에러 이유
});
}
// 검문 통과 시 정상 로직 수행 (DB 저장 등)
// ...
res.status(201).json({ success: true, message: '회원가입 완료' });
});