본문 바로가기

프로그래머스 풀스택 데브코스/데브코스 TIL

웹 풀사이클 데브코스 TIL 25일차

DB 모듈화

DB를 모듈화 해주기 위해서는 connection을 설정한 후 exports 해준다.

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

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

module.exports = connection

그 후 다른 모듈에서 이렇게 불러와서 사용한다.

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

DB 개별조회

이제 지난 시간에 했던 /users api를 db를 사용하는 것으로 수정해보겠다.

router
    .route('/users')
    .get(function(req, res){
        let {email} = req.body
        // 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 : "회원 정보가 없습니다."
                })
            }
        }
    );

    })

쿼리를 직접 작성하였는데 한가지 특이한 리터럴 문자열이 안되고 대신 '?' 를 사용하고 뒤에 변수를 따로 집어넣는 방식이라는 것이다.

DB 회원가입

회원가입 api를 db 사용으로 수정하였다.

//회원가입
router.post('/join', function(req, res){
    console.log(req.body)

    if(req.body == {}){
        res.status(400).json({
            message : `입력 값을 다시 확인해주세요.`
        })
    }
    else {
        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)
            }
        );
    }
})

?에 들어가는 값을 여러개 받을 경우 이를 배열로 전달해야한다. 또한 회원가입을 실행하면 postman에 아무 응답도 안뜨는 것을 알 수 있다.

이를 통해 INSERT의 경우에는 result가 반환되지 않는 것을 알 수 있다.

DB DELETE

    .delete(function(req, res){
        let {email} = req.body

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

실행을 하면 result로 여러가지 정보들이 뜨는 것을 알 수 있다.

이중 주목해야할 값은 affectedRows인데
우리가 따로 예외처리를 하지 않았기 때문에 없는 계정을 DELETE하라고 하면

이와같이 affectedRows 가 0이 되는 것을 알 수 있다. 프론트엔드에서 이 값을 신경써서 처리할건지 아니면 서버단에서 부터 404 에러를 띄울건지는 협의를 통해 정해야한다.

DB 로그인


//로그인
router.post('/login', function(req, res){
  // userId가 디에 저장된 회원인지 확인해야
  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 : `이메일 또는 비밀번호가 틀렸습니다.`
            })
        }
    }
);
})

데이터베이스를 사용하면 로그인 로직이 훨씬 간단해지는 것을 알 수 있다. 한가지 더 수정된 점은 이메일과 비밀번호를 따로 체크해서 이메일이 틀렸다, 비밀번호가 틀렸다 따로 알려주는 것이 아닌, 한꺼번에 체크해서 이메일 또는 비밀번호가 틀렸다고 알려주는게 요즘 트렌드라고 한다. 이 트렌드에 따라 조건문을 더 줄일 수 있었다.

채널 API

채널 전체 SELECT

.route('/')
    .get((req,res) =>{

        let {userId} = req.body

        let sql = `SELECT * FROM channels WHERE user_id = ?`

        if(userId) {
            conn.query(sql, userId,
                function(err, results) {
                    if(results.length)
                        res.status(200).json(results)
                    else
                        notFoundChannel(res)
                })
        }
        else {
            res.status(400).end() //값을 보내지 않고 끝내기
        }
    })

end()는 그냥 값을 보내지 않고 끝낸다는 뜻이다. 단축평가 란 것도 배웠는데 여기서는 우리가 원하는 방식으로 동작하지 않기때문에 제거하였다.

후기

DB를 모듈화하고 이를 다양하게 사용해보았다. 다음시간에는 유효성 검사를 학습한다고 한다.

키워드: 프로그래머스 데브코스, 국비지원교육, 코딩부트캠프