본문 바로가기

개발/프로그래머스 데브코스

프로그래머스 데브코스 25일차 with. TS 웹 풀스택

📚요약

지난 시간에 데이터베이스 연동을 테스트해 보고 마무리했습니다. 이번 시간에는 프로젝트의 코드를 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);
    });
 });

 

다음 시간에 계속...

 

출처 & 참고

김송아 강사님의 강의