📚요약
지난 시간에 데이터베이스 연동을 테스트해 보고 마무리했습니다. 이번 시간에는 프로젝트의 코드를 Map으로 만든 db가 아닌 실제 데이터베이스에서 가져오는 코드로 바꿔보겠습니다.
📖미니 프로젝트(Library) 실습
지난 시간에 이어 실습을 진행하겠습니다.
📄db 모듈화
모듈화는 지난 시간에 연동했던 connection을 moudle.exports를 활용해 내보내고, require()를 통해서 불러서 사용해 보겠습니다.
// mariadb.js
module.exports = connection;
// librarians.js, books.js
const mariadb = require('../mariadb');
📄쿼리 요청 및 예외 처리
전에 데이터베이스에 연동해서 요청했을 때는 ``(템플릿 문자열)을 통해서 내부에 변수를 넣어서 요청하는 방식을 사용했습니다. 물론 지금도 가능합니다. 하지만 새로운 방식은 '?'를 사용하면 '?'에 원하는 변수를 편하게 넣을 수 있습니다.
// 이전 쿼리 요청
mariadb.query(sql, (err,results,fields)=>{});
// 현재 편해진 쿼리 요청
// 전달해야 하는 값이 하나일 경우
const sql = "SELECT * FROM librarians WHERE email = ?";
// `SELECT * FROM librarians WHERE email = "${email}"`
mariadb.query(sql, email, (err,results,fields) => {});
// 전달해야 하는 값이 여러 개일 경우
const sql = "INSERT INTO librarians (email,pw,name,ph_num) VALUES (?,?,?,?)";
const values = [email, pw, name, ph_num];
mariadb.query(sql, values, (err,results,fields) => {});
🍯tip! INSERT 문을 사용할 때 NULL 값이 가능한 컬럼(필드)은 빈 데이터를 보내면 알아서 NULL로 만들어준다. 설정한 DEFAULT 값이 있다면 해당 값으로 초기화된다.
예외 처리 또한 가상의 데이터베이스인 Map을 사용했을 때보다 훨씬 편하게 할 수 있게 되었습니다. 예를 들어 회원가입하는 경우에 기존 등록된 사서와 동일한 사서가 등록되지 못하게 하려고 forEach로 Map에 있는 데이터를 확인했었습니다. 하지만 실제 데이터 베이스를 이용하면 넘어오는 에러 메시지를 잡아서 예외처리를 해줄 수 있습니다.
router.post("/signup", (req, res) => {
if (req.body == {}) {
res.status(400).json({
message: `plz enter all data email, pw, name`,
});
} else {
const { email, pw, name, ph_num } = req.body;
const sql =
"INSERT INTO librarians (email,pw,name,ph_num) VALUES (?,?,?,?)";
const values = [email, pw, name, ph_num];
mariadb.query(sql, values, (err) => {
if (err?.code === "ER_DUP_ENTRY") { // err.code를 통해 email 중복 시 가입하지 못하게 막기
res.status(403).json({
message: `already exist id plz use other email`,
});
} else {
res.status(201).json({
message: `Welcome new librarian ${name}`,
});
}
});
}
});
실제 코드는 Github에 있습니다.
https://github.com/nulzi/ProgrammersSchool/tree/main/NORMAL-LIBRARY
ProgrammersSchool/NORMAL-LIBRARY at main · nulzi/ProgrammersSchool
프로그래머스 데브코스에서 학습하는 것들을 모아두는 레포. Contribute to nulzi/ProgrammersSchool development by creating an account on GitHub.
github.com
❔▪❓
오늘은 수업을 듣고 실습을 하면서 들었던 의문까지 적어보고 넘어가겠습니다. 앞으로 의문이 많이 생긴 날에는 해결과 상관없이 올리도록 하겠습니다. 해결이 되면 그때그때 수정해 보는 것으로 하겠습니다.
Q. 로그인 시 email과 pw를 한 번에 검색하면 안 되는 건가?
const sql = "SELECT name FROM librarians WHERE email=? AND pw=?";
Q. UPDATE의 경우 어떻게 처리해야 하는가?
.put((req, res) => {
const { bookName, publisher, publishDate, librarianId } = req.body;
const { id } = req.params;
const sql =
"UPDATE books SET name = ?, publisher = ?, publish_date = ?, librarian_id = ? WHERE id = ?";
const values = [
bookName,
publisher,
publishDate,
librarianId,
parseInt(id),
];
// Q. update시 필요없는 값을 그냥 빈 값으로 보내면 오류가 나는데 sql문을 각각 만들어줘야하나? 그러면 8가지로 너무 많은데...
// A1. 동적으로 필요한 경우에 맞게 sql을 추가해 나가는 방식
mariadb.query(sql, values, (err, results) => {
console.log(err);
console.log(results);
});
});
다음 시간에 계속...
출처 & 참고
김송아 강사님의 강의
'개발 > 프로그래머스 데브코스' 카테고리의 다른 글
| 프로그래머스 데브코스 26일차 with. TS 웹 풀스택 (0) | 2024.05.13 |
|---|---|
| 프로그래머스 6주차 회고 with. TS 웹 풀스택 (0) | 2024.05.13 |
| 프로그래머스 데브코스 24일차 with. TS 웹 풀스택 (0) | 2024.05.09 |
| 데브코스 스터디(알고리즘, 코테) 5회차 (0) | 2024.05.09 |
| 프로그래머스 데브코스 23일차 with. TS 웹 풀스택 (0) | 2024.05.09 |