고양이와 코딩

[웹 풀사이클 데브코스 TIL] 6주차 Day 4 - 데이터베이스 연동, SQL 쿼리에서 파라미터화 된 값의 사용 본문

데브코스 TIL

[웹 풀사이클 데브코스 TIL] 6주차 Day 4 - 데이터베이스 연동, SQL 쿼리에서 파라미터화 된 값의 사용

ovovvvvv 2023. 12. 21. 19:12
728x90

SELECT (GET)

router
    .route ('/users')
    .get((req, res) => {
        let {email} = req.body;

        conn.query(
            `SELECT * FROM users WHERE email = ?`, email,
            function(err, results, fields) {
                    res.status(200).json(results)
            }
        );
    })

`SELECT * FROM users WHERE email = ?`, email,

 

INSERT (POST)

// 회원가입
router.post('/join', (req, res) => {
    console.log(req.body)

    if(Object.keys(req.body).length !== 0){
        const {email, name, password, contact} = req.body

        conn.query(
            `INSERT INTO users (email, name, password, contact)
                VALUES(?, ?, ?, ?)`, [email, name, password, contact],
            function(err, results, fields) {
                res.status(201).json(results)
            }
          );
          
    } else {
        res.status(400).json({
            message: "입력값을 다시 확인해주세요"
        })
    }
})

템플릿 리터럴 말고, "?" 를 사용해서 값들을 받아줍니다!
위 코드처럼 받아 올 데이터가 여러개인경우에는 기본적으로 배열에 담아줘요 

 

 

🍀 서버를 내렸다가 다시 개별 조회를 한 번 해봤는데 ,,, 원래는 서버 내리면 사라졌던 데이터들이 남아있는게

너무너무너무 신기합니다 !!! 🍀

 

DELETE

.delete((req, res) => {
    let {email} = req.body;

    conn.query(
        `DELETE FROM users WHERE email = ?`, email,
        function(err, results, fields) {
                res.status(200).json(results)
        }
    );
})

요 상태에서 현재 db에 없는 데이터를 삭제하면 

요렇게 200이 뜨면서 affectedRows : 0임을 알려주고 있어요 !!
몰랐던 새로운 사실인데, 이건 개발자에 성향에 따라 프론트엔드에서 404로 보내주세요 ~ 라고 할 수도 있고,

그냥 affectedRows를 보고 확인하는 경우도 있다고 합니다 !! ( •̀ .̫ •́ )✧

 

로그인 (POST)

// 로그인
router.post('/login',(req, res) => { 
    // email이 db에 저장된 회원인지 확인을 해야합니다
    const {email, password} = req.body
    var loginUser = {}

    conn.query(
        `SELECT * FROM users WHERE email = ?`, email,
        function(err, results, fields) {
            if(results.length) {
                loginUser = results[0]; 
                if(loginUser.password == password)
                    res.status(200).json({
                        message: `${loginUser.name}님 로그인 되었습니다.`
                    })
                else {
                    res.status(400).json({
                        message : "비밀번호가 틀렸습니다."
                     })
                }
            } else {
                res.status(404).json({
                     message : "회원 정보가 없습니다."
                  })
            }
        }
    );
})

 

이렇게 전에 임의로 데이터를 만들어서 넣은 것 말고, 제대로 db를 구축해서 데이터를 넣고, 삭제하고.. 하는 걸 해봤습니다

그리구 "?" 를 사용해서 데이터를 삽입하는 이유에 대해 좀 정리하려고 해요

 

SQL 쿼리에서 파라미터화된 값의 사용 ; 템플릿 리터럴 대신 ?

데이터베이스에서 SQL 쿼리를 실행 할 때, 사용자 개인정보와 같은 외부 데이터를 안전하게 사용하는 것이 중요한데요!
파라미터화 된 쿼리를 사용하는것이 좋은 방법입니다 !

이는 사용자 입력을 쿼리 안에 하드코딩하는게 아니라, 데이터를 전달할때 "?"와 같은 특수한 기호를 사용하는 방법인데요

 

1. SQL Injection 방지 : "?"를 사용하면 데이터베이스 드라이버가 값들을 안전하게 이스케이핑 하여 쿼리에 넣어주기 때문에 악의적인 SQL Injection 공격으로부터 안전하게 데이터를 보호 할 수 있습니다!

2. 쿼리 최적화 : 데이터베이스가 파라미터화된 쿼리를 미리 컴파일하여 캐싱하므로, 동일한 쿼리를 여러 번 실행하는 경우에 성능이 향상 될 수 있습니다.

3. 가독성과 유지보수성 : "?"를 사용하면 쿼리가 훨씬 더 간결해지고, 구문 자체가 명확해지며 유지보수가 쉬워집니다 !!

 

위의 코드에서도 'conn.query()' 메서드 내부의 SQL 쿼리에 "?"를 사용하고 있는데요, 입력 데이터가 템플릿 리터럴이 아닌 
"?"를 통해 쿼리에 전달되므로 데이터의 보안이 보장되는 장점이 있다고 합니다.