import Joi from 'joi';
import { MESSAGES } from '../../constants/message.constant.js';
import { MIN_RESUME_LENGTH } from '../../constants/resume.constant.js';
// 조이 오브젝트라는 메서드 이용해서 타이틀과 컨텐트를 검증할 스키마를 만든다.
const schema = Joi.object({
title: Joi.string().required().messages({
'any.required': MESSAGES.RESUMES.COMMON.TITLE.REQUIRED,
}),
content: Joi.string().min(MIN_RESUME_LENGTH).required().messages({
'any.required': MESSAGES.RESUMES.COMMON.CONTENT.REQUIRED,
'string.min': MESSAGES.RESUMES.COMMON.CONTENT.MIN_LENGTH,
}),
});
// createResumeValidator 를 진짜로 실행할 수 있는 벨리데이트 함수를 만들었다.
export const createResumeValidator = async (req, res, next) => {
try {
await schema.validateAsync(req.body);
next();
} catch (error) {
next(error);
}
};
Joi를 사용해 요청 데이터의 유효성을 검사하는 방법을 학습했다. 이를 바탕으로 createResumeValidator 함수를 구현하여 특정 필드의 데이터 형식과 조건을 검증할 수 있다. 주요 내용은 아래와 같다.
Joi.object() 메서드를 사용해 title과 content 필드의 유효성을 정의한다.
title 필드
required)이다.MESSAGES.RESUMES.COMMON.TITLE.REQUIRED 메시지가 반환된다.content 필드
MIN_RESUME_LENGTH 이상이어야 한다.MESSAGES.RESUMES.COMMON.CONTENT.REQUIRED: 필드가 비어 있을 때.MESSAGES.RESUMES.COMMON.CONTENT.MIN_LENGTH: 최소 길이를 충족하지 못했을 때.const schema = Joi.object({
title: Joi.string().required().messages({
'any.required': MESSAGES.RESUMES.COMMON.TITLE.REQUIRED,
}),
content: Joi.string().min(MIN_RESUME_LENGTH).required().messages({
'any.required': MESSAGES.RESUMES.COMMON.CONTENT.REQUIRED,
'string.min': MESSAGES.RESUMES.COMMON.CONTENT.MIN_LENGTH,
}),
});
createResumeValidator 함수는 요청(req)의 body를 검증하며, 성공하면 다음 미들웨어로 넘어가고, 실패 시 에러를 next 함수로 전달한다.
schema.validateAsync(req.body)를 호출해 req.body를 스키마에 따라 검증한다.next()를 호출해 다음 미들웨어로 이동한다.error)를 next(error)로 전달하여 에러 처리 미들웨어에서 처리하도록 한다.export const createResumeValidator = async (req, res, next) => {
try {
await schema.validateAsync(req.body);
next();
} catch (error) {
next(error);
}
};
MESSAGES 상수에서 관리되므로 일관성을 유지할 수 있다.validateAsync 메서드를 사용해 비동기 검증을 수행한다.앞으로는 다양한 스키마 검증 규칙을 추가적으로 학습하고, 실무에 적용할 때 어떻게 커스터마이징할 수 있는지 더 살펴볼 예정이다.
import Joi from 'joi'; // 데이터 유효성 검사를 위한 Joi 라이브러리
import { MESSAGES } from '../../constants/message.constant.js'; // 응답 메시지 상수
import { MIN_RESUME_LENGTH } from '../../constants/resume.constant.js'; // 이력서 내용의 최소 길이 상수
// Joi 스키마 정의: 이력서 업데이트를 위한 데이터 유효성 검사
const schema = Joi.object({
// 제목 (title): 문자열 (필수 아님)
title: Joi.string(),
// 내용 (content): 문자열이며 최소 길이 요구
content: Joi.string().min(MIN_RESUME_LENGTH).messages({
// 내용의 최소 길이 미만일 경우 에러 메시지 설정
'string.min': MESSAGES.RESUMES.COMMON.CONTENT.MIN_LENGTH,
}),
})
.min(1) // 최소 1개 이상의 필드가 요청 본문에 포함되어야 함
.messages({
// 본문이 비어 있을 경우 에러 메시지 설정
'object.min': MESSAGES.RESUMES.UPDATE.NO_BODY_DATA,
});
// 이력서 업데이트 요청을 검증하는 미들웨어 함수
export const updateResumeValidator = async (req, res, next) => {
try {
// 요청 본문(req.body)을 정의된 스키마를 통해 비동기로 검증
await schema.validateAsync(req.body);
// 검증 성공 시 다음 미들웨어로 이동
next();
} catch (error) {
// 검증 실패 시 오류를 다음 미들웨어로 전달
next(error);
}
};
Joi 라이브러리를 사용해 이력서 업데이트 요청 데이터를 검증하는 방법을 학습했다. 이를 통해 특정 필드가 조건을 만족하도록 보장하며, 요청 데이터의 형식적 일관성을 유지할 수 있다.
이력서 업데이트를 위해 Joi.object()를 활용하여 데이터 검증 스키마를 정의했다. 업데이트 요청은 모든 필드가 필수가 아니며, 최소 한 개 이상의 필드가 포함되어야 한다.
title 필드
string()) 타입.content 필드
string()) 타입.MIN_RESUME_LENGTH로 제한된다.MESSAGES.RESUMES.COMMON.CONTENT.MIN_LENGTH 메시지가 반환된다.요청 본문
.min(1)).MESSAGES.RESUMES.UPDATE.NO_BODY_DATA 메시지가 반환된다.const schema = Joi.object({
title: Joi.string(),
content: Joi.string().min(MIN_RESUME_LENGTH).messages({
'string.min': MESSAGES.RESUMES.COMMON.CONTENT.MIN_LENGTH,
}),
})
.min(1)
.messages({
'object.min': MESSAGES.RESUMES.UPDATE.NO_BODY_DATA,
});
updateResumeValidator 함수는 요청 데이터(req.body)를 스키마에 따라 검증한다. 요청 데이터가 유효한 경우에만 다음 미들웨어로 넘어간다.
schema.validateAsync(req.body) 호출:next()를 호출하여 다음 미들웨어로 이동한다.next(error)로 전달하여 에러 처리 미들웨어에서 처리한다.export const updateResumeValidator = async (req, res, next) => {
try {
await schema.validateAsync(req.body);
next();
} catch (error) {
next(error);
}
};
이 코드는 RESTful API에서 이력서를 업데이트하는 엔드포인트에 사용될 수 있다. 예를 들어, 아래와 같은 요청이 있을 경우:
PATCH /resumes/1
{
"content": "Updated resume content."
}
content 필드가 MIN_RESUME_LENGTH 이상인 경우에만 성공적으로 처리된다. 데이터가 유효하지 않으면 적절한 에러 메시지가 반환된다.
validateAsync를 통해 비동기로 데이터를 검증하며, 요청 데이터의 처리 흐름을 방해하지 않는다.앞으로 더 복잡한 검증 규칙이나 동적 조건을 추가해 실무 프로젝트에서 활용할 계획이다.