Post

데브코스 TIL - Day 25

23년 12월 21일 강의를 들은 내용과 추가로 학습한 내용을 기록한 글입니다.

db 모듈화하기

  • mysql 모듈 가져오고, db연결하는 코드를 모듈화 시키기
1
2
3
4
5
6
7
8
9
10
11
12
const mysql = require("mysql2");

// create the connection to database
const connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  database: "yotube",
  password: "1234567a",
  dateStrings: true
});

module.exports = connection;
  • 모듈화된 db를 users 파일에 가져와서 사용하기
1
2
3
4
5
6
7
const express = require("express");
const router = express.Router();

// db 받아오기
const conn = require("../mysql");

// ... 중략

유저 정보 가져오는 코드 수정하기

API 설계 수정

회원 정보 조회 (GET, SELECT, /users)

  • req: req.body (email)
  • res: id, name

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
router.route("/users").get((req, res) => {
  const { email } = req.body;
  conn.query(
    "SELECT * FROM users WHERE email = (?)",
    [email],
    (err, results, fields) => {
      if (results.length > 0) {
        res.status(200).send(results[0]);
      } else {
        res.status(404).send({ message: "일치하는 아이디가 없습니다." });
      }
    }
  );
});

결과

회원가입 코드 수정하기

API 설계 수정

회원가입 (POST, INSERT, /join)

  • req: body(email, pwd, name, contact)
  • res:
    • ${name}님 환영합니다.
    • 로그인페이지 출력

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
router.post("/join", (req, res) => {
  if (req.body == {}) {
    res
      .status(400)
      .send({ message: "잘못된 요청입니다. 입력값을 다시 확인해주세요" });
  } else {
    const { email, pwd, name, contact } = req.body;
    conn.query(
      "INSERT INTO users (email,name,password,contact) VALUES (?,?,?,?)",
      [email, name, pwd, contact],
      (err, results, fields) => {
        res.status(201).send({ message: `${name}님, 환영합니다.` });
      }
    );
  }
});
  • INSERTresults값을 넘겨주지 않는다.

회원 탈퇴 코드 수정

API 설계 수정

회원 탈퇴 (DELETE, DELETE, /users/:id)

  • req: body(email)
  • res:
    • ${name}님 탈퇴가 완료되었습니다.
    • 메인페이지 출력

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
router.delete((req, res) => {
  const { email } = req.body;

  conn.query(
    "DELETE FROM users WHERE email = ? ",
    [email],
    (err, results, fields) => {
      if (results.affectedRows > 0) {
        res.status(200).send(results);
      }
    }
  );
});
  • results.affectedRows를 가지고 성공여부를 판단
  • 프론트엔드와 이야기를 나눠야 함 (경우마다 다름)

결과 - 성공했을 때

1
2
3
4
5
6
7
8
9
ResultSetHeader {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 0,
  info: '',
  serverStatus: 2,
  warningStatus: 0,
  changedRows: 0
}

결과 - 실패했을 때

1
2
3
4
5
6
7
8
9
ResultSetHeader {
  fieldCount: 0,
  affectedRows: 0,
  insertId: 0,
  info: '',
  serverStatus: 2,
  warningStatus: 0,
  changedRows: 0
}

로그인 코드 수정

API 설계 수정

로그인 (POST, SELECT, /login)

  • req: body(email, pwd)
  • res:
    • ${name}님 환영합니다.
    • 메인페이지 출력

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
router.post("/login", (req, res) => {
  const { email, pwd } = req.body;

  conn.query(
    "SELECT * FROM users WHERE email = ?",
    [email],
    (err, results, fields) => {
      const [isMatchedEmail] = results;
      if (isMatchedEmail) {
        if (isMatchedEmail.password === pwd) {
          res
            .status(200)
            .send({ message: `${isMatchedEmail.name}님, 환영합니다.` });
        } else {
          res.status(400).send({ message: "비밀번호가 일치하지 않습니다." });
        }
      } else {
        res.status(400).send({ message: "일치하는 이메일이 없습니다." });
      }
    }
  );
});
  • 요즘 트렌드는 아이디와 비밀번호 일치여부를 각각 알려주지 않고, 한꺼번에 알려줌
  • 하지만… 사용자 입장에서는 어느게 틀렸는지 모르기때문에 아이디 찾기 -> 비밀번호 찾기 순으로 틀린 정보를 찾는데 시간을 더 소비함..
  • 나는 요즘 트렌드를 따르는 코드 말고 코드는 더 길지만 디테일한 예외처리를 선택함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
router.post("/login", (req, res) => {
  const { email, pwd } = req.body;

  conn.query(
    "SELECT * FROM users WHERE email = ?",
    [email],
    (err, results, fields) => {
      const [matchedEmail] = results;
      if (matchedEmail && matchedEmail.password === pwd) {
        res
          .status(200)
          .send({ message: `${matchedEmail.name}님, 환영합니다.` });
      } else {
        res
          .status(400)
          .send({ message: "이메일 또는 비밀번호가 일치하지 않습니다." });
      }
    }
  );
});

전체 코드 - users.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
const express = require("express");
const router = express.Router();
const conn = require("../mysql");

router.use(express.json());

router.post("/join", (req, res) => {
  if (req.body == {}) {
    res
      .status(400)
      .send({ message: "잘못된 요청입니다. 입력값을 다시 확인해주세요" });
  } else {
    const { email, pwd, name, contact } = req.body;
    const sql =
      "INSERT INTO users (email,name,password,contact) VALUES (?,?,?,?)";
    const values = [email, name, pwd, contact];

    conn.query(sql, values, (err, results, fields) => {
      res.status(201).send({ message: `${name}님, 환영합니다.` });
    });
  }
});

router.post("/login", (req, res) => {
  const { email, pwd } = req.body;
  const sql = "SELECT * FROM users WHERE email = ?";

  conn.query(sql, [email], (err, results) => {
    const [matchedEmail] = results;
    if (matchedEmail) {
      if (matchedEmail.password === pwd) {
        res
          .status(200)
          .send({ message: `${matchedEmail.name}님, 환영합니다.` });
      } else {
        res.status(400).send({ message: "비밀번호가 일치하지 않습니다." });
      }
    } else {
      res.status(400).send({ message: "일치하는 아이디가 없습니다." });
    }
  });
});

router
  .route("/users")
  .get((req, res) => {
    const { email } = req.body;
    const sql = "SELECT * FROM users WHERE email = (?)";
    conn.query(sql, [email], (err, results) => {
      if (results.length > 0) {
        res.status(200).send(results[0]);
      } else {
        res.status(404).send({ message: "일치하는 아이디가 없습니다." });
      }
    });
  })
  .delete((req, res) => {
    const { email } = req.body;
    const sql = "DELETE FROM users WHERE email = ? ";
    conn.query(sql, [email], (err, results) => {
      if (results.affectedRows > 0) {
        res.status(200).send(results);
      }
    });
  });

module.exports = router;
This post is licensed under CC BY 4.0 by the author.