[웹 풀사이클 데브코스 TIL] 6주차 Day 4 - 데이터베이스 연동, SQL 쿼리에서 파라미터화 된 값의 사용
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 쿼리에 "?"를 사용하고 있는데요, 입력 데이터가 템플릿 리터럴이 아닌
"?"를 통해 쿼리에 전달되므로 데이터의 보안이 보장되는 장점이 있다고 합니다.