고양이와 코딩
[웹 풀사이클 데브코스 TIL] 6주차 Day 5 - 유효성 검사 본문
728x90
유효성검사란 ?
유효성 검사는 웹 애플리케이션에서 사용자로부터 받은 데이터를 검증하여 예기치 않은 오류를 방지하고,
데이터의 무결성을 유지하는 핵심적인! 과정입니다.
현재까지 작성한 users데이터 코드에서는 아래와 같은 유효성 검사를 할 수 있습니다
1. 로그인
- 비밀번호 보안 강화 : 비밀번호는 해싱된 값으로 저장
- 이메일 유효성 검사 : 올바른 형식의 이메일만 허용
2. 회원가입
- 모든 필드의 입력 여부 확인 : 필수 필드인지 확인, 필드가 빈 값인지 검사
- 비밀번호 보안 강화 : 해싱된 값을 저장
3. 사용자 정보 조회 및 삭제
- 인증된 사용자 확인 : 이메일, 또는 기타 인증을 통해 사용자가 요청한 작업을 수행할 권한이 있는지 확인
- 입력 데이터의 유효성 확인 : 요청된 이메일이나 기타 식별자가 올바른지 확인
Express 미들웨어를 통해 유효성 검사 하기
'express-validator'와 같은 라이브러리를 사용하여 데이터의 유효성을 검사하고, 오류 메시지를 반환할 수 있습니다!
https://www.npmjs.com/package/express-validator
const {body, validationResult} = require('express-validator');
// 채널 개별 생성 == db에 저장
.post(
[body('userId').notEmpty().isInt().withMessage('숫자로 입력해주세요'),
body('name').notEmpty().isString().withMessage('문자로 입력해주세요')]
, (req, res) => {
const err = validationResult(req)
if(!err.isEmpty()) {
return res.status(400).json(err.array())
}
const {name, userId} = req.body
let sql = `INSERT INTO channels (name, user_id) VALUES(?, ?)`
let values = [name, userId]
conn.query(sql, values,
function(err, results) {
res.status(201).json(results)
}
)
})
채널 개별 등록 (POST) 코드를 if,else문에서 → express-validator로 유효성 검사 한 뒤,
에러가 발생하면 바로 return 시켜 구문을 끝내도록 작성했습니다!
Validate 구문 미들웨어 모듈화 시키기
유효성 검사를 하면서,
, (req, res) => {
const err = validationResult(req)
if(!err.isEmpty()) {
return res.status(400).json(err.array())
}
위 코드가 각 구문에서 에러를 처리할 때마다 반복되기 때문에, 이걸 모듈화 시켜서 가져다 쓰려고 합니다!
// 모듈화
const validate = (req, res) => {
const err = validationResult(req)
if(!err.isEmpty()) {
return res.status(400).json(err.array())
}
}
// 함수화
function validate (req, res) {
const err = validationResult(req)
if(!err.isEmpty()) {
return res.status(400).json(err.array())
}
}
validate(req, res)
일반 함수로 작성한 코드를 가져다 쓰면 함수 호출시 이렇게 호출하면 되고,
validate
화살표 함수로 모듈화를 시키면 요것만 호출해주면 되는데요 !
문제는 이 경우 유효성 검사를 해서 에러가 발생하지 않는 경우,
그 다음 if문으로 내려가지 않아 제대로 데이터를 출력 하지 않는다는 것입니다 .. (´-﹏-`;)
그래서 ! next() 함수를 사용해서 다음 실행할 코드를 전달 해 주어야 합니다 (미들웨어 공부할때 봤던 익숙한 친구 ~)
const validate = (req, res, next) => {
const err = validationResult(req)
if(!err.isEmpty()) {
return res.status(400).json(err.array())
} else {
return next(); // 다음 할 일
}
}
// 채널 전체 조회
router
.route('/')
.get(
[
body('userId').notEmpty().isInt().withMessage('숫자 입력 필요'),
],
(req, res, next)=> {
validate // 유효성 검사가 이루어지고 에러가 난다면, 이 모듈까지
let { userId } = req.body
let sql = `SELECT * FROM channels WHERE user_id = ?`
conn.query(sql, userId,
function(err, results) {
if (results.length) {
res.status(200).json(results);
} else {
notFoundChannel(res);
}
});
}
)
이렇게 사용할 수 있어요 (´ . .̫ . `)
오늘 유효성 검사 + 테스트를 하면서 채널을 많이 만들고 userId를 입력해서 회원 탈퇴를 하려고 하니
외래키 제약 조건때문에 삭제가 안되는 등... 여러 오류들을 접해보면서 db의 관계가 어떻게 이어져 있는지에 대해서도
더 직접적으로 알 수 있었고! 코드도 깔끔하게 정리하면서 확인하니 머릿속에서도 정리가 되는 기분이었습니다 ㅎㅎ
'데브코스 TIL' 카테고리의 다른 글
[웹 풀사이클 데브코스] 7주차 Day 2 - 면접 관련 질문 정리 (0) | 2023.12.26 |
---|---|
[웹 풀사이클 데브코스 TIL] 7주차 Day 1 - 쿠키, 세션, JWT, 그리고 httpOnly (0) | 2023.12.25 |
[웹 풀사이클 데브코스 TIL] 6주차 Day 4 - 데이터베이스 연동, SQL 쿼리에서 파라미터화 된 값의 사용 (1) | 2023.12.21 |
[웹 풀사이클 데브코스 TIL] 6주차 Day 3 - MySql workbench를 사용해 보자 (0) | 2023.12.20 |
[웹 풀사이클 데브코스 TIL] 6주차 Day 2 - 데이터베이스 생성 실습 (0) | 2023.12.19 |