2024년 9월 23일

✏️ db 모듈화

  • db를 모듈화해보자
  • 파일 이름 바꾸고, connection을 모듈화 시킴
// mariadb.js

// get the client
const mysql = require("mysql2");

// create the connection to database
const connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "root",
  timezone: "Asia/Seoul",
  database: "Youtube",
  dateStrings: true,
});

// 쿼리문 삭제

module.exports = connection;
  • users에 db모듈 불러오기 & 쿼리문 넣기
// users.js

const express = require("express");
const router = express.Router();
const conn = require('../mariadb');

conn.query(
"SELECT * FROM `users`", 
	function (err, results, fields) {
		const { id, email, name, created_at } = results[0];
		console.log(id);
		console.log(email);
		console.log(name);
		console.log(created_at);
	}
);

router.use(express.json());

... 생략 ...
  • app.js에서 서버 재생 -> 콘솔창 확인

✏️ 개별 조회

  • conn.query를 실제로 API에 넣어보자

  • 개별 조회 쿼리 : SELECT / email 데이터로 회원 정보 조회
    - 마이 페이지의 회원 정보 조회 API -> id 데이터 대신 email 데이터로 정보 보여줄 예정
    - email를 body에서 받아오기

         // users.js
    
         const express = require("express");
         const router = express.Router();
         const conn = require("../mariadb");
    
         router.use(express.json()); 
    
         let db = new Map();
         let id = 1;
    
         // 개별 조회
         router
           .route("/users")
           .get(function (req, res) {
             let { email } = req.body;
    
             conn.query(
                 `SELECT * FROM users Where email = ${email}`, 
                 function (err, results, fields) {
                     if(results.length) {
                         res.status(200).json(results);
                     } else {
                         res.status(404).json({
                         message: `회원 정보가 없어요`,
                       });
                     }
                     }
                 );
           })
           ... 생략 ...
      ```
    POSTMAN) GET + localhost:7777/users + {”email” : “song@email.com”}

✏️ 개별 조회 오류 해결(select sql 쿼리 형식)

  • socket : 서버와 클라이언트가 통신할 때 데이터를 담아보내는 배 + hang up : 끊김 => 통신이 끊긴 것임
  • hang up : 서버가 죽지 않았을까 확인해야함 -> 실제로 서버 죽음
  • 콘솔창 에러를 확인할 수 있음

  • SQL문을 바꿔야함
// users.js

// 개별 조회
router
  .route("/users")
  .get(function (req, res) {
    let { email } = req.body;
    
    conn.query(
	    `SELECT * FROM users Where email = ?`, email, 
	    function (err, results, fields) {
		    if(results.length) {
			    res.status(200).json(results);
		    } else {
			    res.status(404).json({
		        message: `회원 정보가 없어요`,
		      });
		    }
			}
		);
  })
  ... 생략 ...

그래도 에러 발생

  • host 변경해줘야함
// mariadb.js

// get the client
const mysql = require("mysql2");

// create the connection to database
const connection = mysql.createConnection({
  host: "127.0.0.1",
  user: "root",
  password: "root",
  timezone: "Asia/Seoul",
  database: "Youtube",
  dateStrings: true,
});
module.exports = connection;

json array 형태로 데이터 잘 받아오는 것을 확인함

✏️ 회원 가입

  • 회원 가입 쿼리: INSERT / requestbody로 email, pwd, name, contact를 받아 회원가입
// users.js

// 회원 가입
router.post("/join", function (req, res) {
  if (req.body == {}) {
    res.status(400).json({
      message: `입력값을 다시 확인해주세요`,
    });
  } else {
    const {email, name, password, contact} = request.body;
    
    conn.query(
	    `INSERT INTO users (email, name, password, contact) VALUES (?, ?, ?, ?)`,
	     [email, name, password, contact], function(err, results, fileds) {
		     res.status(201).json(results);
	     }
    );
  }
});

POSTMAN) POST + localhost:7777/join + {”email” : “kong@email.com”, name: “kong”, “password” : 1234, “contact” : “010-6666-6666”}

✏️ 회원 삭제

  • 회원 삭제 쿼리 : DELETE / requestbody로 email를 받아 회원 삭제
// users.js

.delete(function (req, res) {
    const {email} = req.body;
    conn.query(
	    `DELETE FROM users WHERE email = ?`, email,
	     functon(err, results, fields) {
		     res.status(200).json(results);
	     }
    );
  });

✏️ 회원 로그인

  • 회원 로그인 쿼리 SELECT / requestbody로 email, pwd 받아 회원 로그인
// users.js

router.post("/login", function (req, res) {
	// 이메일이 db에 저장된 회원인지 확인 
  const { email, password } = req.body;
  let 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: `회원 정보가 없어요`,
			   });
		   }
	   }
   );
});

POSTMAN) POST + localhost:7777/login + {”email” : “ko@email.com”, “password”: 1111}

  • 코드 깔끔히 하기
// users.js

router.post("/login", function (req, res) {
  const { email, password } = req.body;
  
  conn.query(
	  `SELECT * FROM users WHERE email = ?`, email,
	   function(err, results, fields) {
		   let loginUser = results[0];
		   if(loginUser && loginUser.password == password) {
				   res.status(200).json({
			       message: `${loginUser.name}님 로그인 되었어요`,
		       });
		   } else if(loginUser && loginUser.password != password) {
			    res.status(400).json({
			       message: `비밀번호가 틀렸어요`,
		        });
		   } else {
			    res.status(404).json({
				    message: `회원 정보가 없어요`,
			    });
		   }
	   }
   );
});

그런데 깔끔히 해보았는데 이전의 코드가 더 좋아보임 → 이전으로 돌리기(리팩토링하는데 의미를 둠)

그리고 요즘에는 아이디 또는 비밀번호를 한번에 틀렸다고 하는게 트렌드임

// users.js

router.post("/login", function (req, res) {
  const { email, password } = req.body;
  
  conn.query(
	  `SELECT * FROM users WHERE email = ?`, email,
	   function(err, results, fields) {
		   let loginUser = results[0];
		   if(loginUser && loginUser.password == password) {
		       res.status(200).json({
			       message: `${loginUser.name}님 로그인 되었어요`,
		       });
		   } else {
		       res.status(404).json({
			       message: `이메일 또는 비밀번호가 틀렸습니다`,
			   });
		   }
	   }
   );
});

✏️ user.js 리팩토링

: 코드 정리를 해보자

  • 필요 없는 부분 날리기
  • 주석 반드시 필요할까? : 무조건 필요한건 아님 => 코드로 설명이 안되는 것만 주석(만약 설명이 안된다 ? 다시 코드 짜야함)
  • 개행은 최대 2줄 까지만
  • 문자열은 틀리면 아무도 모름 => 변수에 따로 빼서 사용
// users.js

const express = require("express");
const router = express.Router();
const conn = require("../mariadb.js");

router.use(express.json());

router
  .route("/users")
  .get(function (req, res) {
    let { email } = req.body;
    
    let sql = `SELECT * FROM users WHERE email = ?`;
    conn.query(
      sql,
      email,
      function (err, results) {
        if (results.length) {
          res.status(200).json(results);
        } else {
          res.status(404).json({
            message: `회원 정보가 없어요`,
          });
        }
      }
    );
  })
  .delete(function (req, res) {
    const { email } = req.body;
    
    let sql = `DELETE FROM users WHERE email = ?`;
    conn.query(
      sql,
      email,
      function (err, results) {
        res.status(200).json(results);
      }
    );
  });

router.post("/join", function (req, res) {
  if (req.body == {}) {
    res.status(400).json({
      message: `입력값을 다시 확인해주세요`,
    });
  } else {
    const { email, name, password, contact } = req.body;
    
    let sql = `INSERT INTO users (email, name, password, contact) VALUES (?, ?, ?, ?)`;
	  let values = [email, name, password, contact]
    conn.query(
      sql,
      values,
      function (err, results) {
        res.status(201).json(results);
      }
    );
  }
});

router.post("/login", function (req, res) {
  const { email, password } = req.body;

	let sql = `SELECT * FROM users WHERE email = ?`;
  conn.query(
    sql,
    email,
    function (err, results) {
      let loginUser = results[0];
      
      if (loginUser && loginUser.password == password) {
        res.status(200).json({
          message: `${loginUser.name}님 로그인되었어요`,
        });
      } else {
        res.status(404).json({
          message: `이메일 또는 비밀번호가 틀렸습니다`,
        });
      }
    }
  );
});

module.exports = router;

결과는 똑같이 잘 작동됨

✏️ channels.js

  • 채널 생성 : INSERT(body-name, user_id)
  • 채널 수정 : UPDATE(url-id, body-name)
  • 채널 삭제 : DELETE(url-id)
  • 채널 전체, 개별 조회 : SELECT(전체-(body-user_id), 개별-{url-id})

📍 채널 개별 조회

// channels.js

const express = require("express");
const router = express.Router();
const conn = require("../mariadb.js");

router.use(express.json());

router
  .route("/:id")
  // 채널 개별 조회
  .get((req, res) => {
    let { id } = req.params;
    id = parseInt(id);

    let sql = `SELECT * FROM channels WHERE id = ?`;
    conn.query(sql, id, function (err, results) {
      if (results.length) {
        res.status(200).json(results);
      } else {
        notFoundChannel(res);
      }
    });
  })

POSTMAN) GET+localhost:7777/channels/1

📍채널 전체 조회

// channels.js

const express = require("express");
const router = express.Router();
const conn = require("../mariadb.js");

router.use(express.json());

router
  .route("/")
  // 채널 전체 조회
  .get((req, res) => {
    const { userId } = req.body;

    let sql = `SELECT * FROM users WHERE user_id = ?`;
    conn.query(sql, userId, function (err, results) {
      if (results.length) {
        res.status(200).json(results);
      } else {
        notFoundChannel(res);
      }
    });
  })

POSTMAN) GET+localhost:7777/channels + {”userId” : 1}

  • userId 넣지 않으면

  • 오류 해결 -> 단축 평가 이용

// channels.js

const express = require("express");
const router = express.Router();
const conn = require("../mariadb.js");

router.use(express.json());

router
  .route("/")
  // 채널 전체 조회
  .get((req, res) => {
    const { userId } = req.body;

    let sql = `SELECT * FROM users WHERE user_id = ?`;
    userd && conn.query(sql, userId, function (err, results) {
      if (results.length) {
        res.status(200).json(results);
      } else {
        notFoundChannel(res);
      }
    });
    res.status(400).end();
  })

  • 그리고 다시 body에 {"userId" : 2} 를 넣어서 다시 조회해보면

결과 : userId 값이 있으면 단축평가 뒤의 내용과 res.status(400).end()를 모두 읽어 덮어 쓰기 됨

강의에서는 어떻게 하면 좋을까? 생각 해보라고 했는데 내 생각에는 return을 넣어야 할 것 같음.. (나중에 알려주신다고 함!)

  • 그래서 그냥 if else문으로 간단히 고침!
// channels.js

const express = require("express");
const router = express.Router();
const conn = require("../mariadb.js");

router.use(express.json());

router
  .route("/")
  // 채널 전체 조회
  .get((req, res) => {
    const { userId } = req.body;

    let sql = `SELECT * FROM users WHERE user_id = ?`;
    if(userId) {
	    conn.query(sql, userId, function (err, results) {
	      if (results.length) {
	        res.status(200).json(results);
	      } else {
	        notFoundChannel(res);
	      }
	    });
    } elese {
	    res.status(400).end();
    }
  })

✏️ 채널 생성

// channels.js

// 채널 개별 생성
  .post((req, res) => {
    if (req.body.name) {
      const { name, userId } = req.body;
      let sql = `INSERT INTO channels (name, user_id) VALUES (?, ?)`;
      let values = [name, userId];
      conn.query(sql, values, function (err, results) {
        res.status(201).json(results);
      });
    } else {
      res.status(400).json({
        message: `요청 값을 다시 보내주세요`,
      });
    }
  });

POSTMAN) localhost:7777/channels + {”name” : “bbang”, “userId” : 3}

그런데, userId 값이 이상해도 성공됨(그런데 데이터는 들어가지 않음)

  • 예외처리를 잘 해야 함!
    • if (name && userId) 넣어서 처리 → 그런데 잘못된 값이라도 성공됨
    • 사실 이런 경우, name과 userId를 유효성 검사해야함!

🍏🍎 오늘의 느낀점
: db 연동을 해서 users.js와 channels.js를 쿼리문을 넣어서 해보는 실습을 가졌다..! 배열을 이용했을 때보다 코드가 조금 더 쉽게(?) 느껴지기는 했지만, 예외 처리를 잘 처리해야할 것 같다. 요번에 같이 실습을 같이 해보고 다른 사이드 프로젝트를 해보면서 익숙해져야겠다. 다음 강의도 화이팅..!

profile
프론트엔드개발자가 되고 싶어서 열심히 땅굴 파는 자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN