고양이와 코딩

[웹 풀사이클 데브코스 TIL] 6주차 Day 5 - 유효성 검사 본문

데브코스 TIL

[웹 풀사이클 데브코스 TIL] 6주차 Day 5 - 유효성 검사

ovovvvvv 2023. 12. 22. 22:22
728x90

유효성검사란 ?

유효성 검사는 웹 애플리케이션에서 사용자로부터 받은 데이터를 검증하여 예기치 않은 오류를 방지하고, 
데이터의 무결성을 유지하는 핵심적인! 과정입니다.

 

현재까지 작성한 users데이터 코드에서는 아래와 같은 유효성 검사를 할 수 있습니다

 

1. 로그인

  • 비밀번호 보안 강화 : 비밀번호는 해싱된 값으로 저장
  • 이메일 유효성 검사 : 올바른 형식의 이메일만 허용

2. 회원가입

  • 모든 필드의 입력 여부 확인 : 필수 필드인지 확인, 필드가 빈 값인지 검사
  • 비밀번호 보안 강화 : 해싱된 값을 저장

3. 사용자 정보 조회 및 삭제 

  • 인증된 사용자 확인 : 이메일, 또는 기타 인증을 통해 사용자가 요청한 작업을 수행할 권한이 있는지 확인
  • 입력 데이터의 유효성 확인 : 요청된 이메일이나 기타 식별자가 올바른지 확인

 

Express 미들웨어를 통해 유효성 검사 하기

'express-validator'와 같은 라이브러리를 사용하여 데이터의 유효성을 검사하고, 오류 메시지를 반환할 수 있습니다!

https://www.npmjs.com/package/express-validator

 

express-validator

Express middleware for the validator module.. Latest version: 7.0.1, last published: 8 months ago. Start using express-validator in your project by running `npm i express-validator`. There are 10048 other projects in the npm registry using express-validato

www.npmjs.com

 

 

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의 관계가 어떻게 이어져 있는지에 대해서도 
더 직접적으로 알 수 있었고! 코드도 깔끔하게 정리하면서 확인하니 머릿속에서도 정리가 되는 기분이었습니다 ㅎㅎ