고양이와 코딩
[웹 풀사이클 데브코스 TIL] 6주차 Day 4 - 데이터베이스 연동, SQL 쿼리에서 파라미터화 된 값의 사용 본문
[웹 풀사이클 데브코스 TIL] 6주차 Day 4 - 데이터베이스 연동, SQL 쿼리에서 파라미터화 된 값의 사용
ovovvvvv 2023. 12. 21. 19:12SELECT (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 쿼리에 "?"를 사용하고 있는데요, 입력 데이터가 템플릿 리터럴이 아닌
"?"를 통해 쿼리에 전달되므로 데이터의 보안이 보장되는 장점이 있다고 합니다.
'데브코스 TIL' 카테고리의 다른 글
[웹 풀사이클 데브코스 TIL] 7주차 Day 1 - 쿠키, 세션, JWT, 그리고 httpOnly (0) | 2023.12.25 |
---|---|
[웹 풀사이클 데브코스 TIL] 6주차 Day 5 - 유효성 검사 (2) | 2023.12.22 |
[웹 풀사이클 데브코스 TIL] 6주차 Day 3 - MySql workbench를 사용해 보자 (0) | 2023.12.20 |
[웹 풀사이클 데브코스 TIL] 6주차 Day 2 - 데이터베이스 생성 실습 (0) | 2023.12.19 |
[웹 풀사이클 데브코스 TIL] - 6주차 Day 1 - DBMS 알아보기 (0) | 2023.12.18 |