DB 모듈화
users.js와 channels.js 두 파일에서 DB에 접근할 수 있어야 하므로 중복된 코드를 줄이기 위해 DB를 모듈화 한다.
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'Youtube',
password: 'root',
dateStrings: true
});
module.exports = connection;
사용자
개별 조회
이메일로 사용자를 조회한다.
쿼리에 변수를 적는 정석적인 방법은 물음표를 사용하는 것이다. 변수가 들어가야 할 부분에 물음표를 쓰고, query 메서드의 두 번째 파라미터로 해당하는 물음표에 들어가야 할 변수명을 적는다.
쿼리 실행 결과가 배열이기 때문에 response 또한 배열 형태이다.
router.route('/users')
.get((req, res) => {
const { email } = req.body;
conn.query(
`SELECT * FROM users WHERE email = ?`,
email,
function (err, results, fields) {
if (results.length) {
res.status(200).json(results);
} else {
notFoundUser(res);
}
}
);
})
회원가입
이메일, 이름, 비밀번호, 연락처 모든 값이 요청으로 들어와야 데이터를 삽입한다.
쿼리에 여러 개의 변수를 넣어야 할 때는 변수들을 배열 안에 작성한다.
참고로 이메일을 유니크하다고 설정했기 때문에 동일한 이메일을 작성하면 삽입이 이루어지지 않고, results가 비어있는 것을 볼 수 있다.
router.post('/join', (req, res) => {
const { email, name, password, contact } = req.body;
const isValid = email && name && password && contact;
if (isValid) {
conn.query(
`INSERT INTO users(email, name, password, contact)
VALUES(?, ?, ?, ?)`,
[email, name, password, contact],
function (err, results, fields) {
res.status(201).json(results);
}
);
} else {
res.status(400).json({
message: "입력 값을 다시 확인해주세요."
})
}
})
계정 삭제
affectedRows는 해당 쿼리를 실행해서 영향을 받은 행이 몇 개인지를 나타낸다.
따라서 affectedRows가 0이면 존재하지 않는 계정이고, 1인 경우 존재하는 계정을 삭제했음을 의미한다.
router.route('/users')
.delete((req, res) => {
const { email } = req.body;
if (email) {
conn.query(
`DELETE FROM users WHERE email = ?`,
email,
function (err, results, fields) {
if (results.affectedRows) {
res.status(200).json(results);
} else {
notFoundUser(res);
}
}
);
} else {
res.status(400).json({
message: '로그인이 필요한 기능입니다.'
})
}
})
로그인
요청으로 들어온 이메일과 비밀번호가 비어있지 않은지 확인한 후 쿼리를 실행하고, 비밀번호를 비교한다.
이메일은 유니크하기 때문에 쿼리 실행 결과의 첫 번째 원소가 입력받은 이메일을 사용하는 사용자 정보이다.
router.post('/login', (req, res) => {
const { email, password } = req.body;
const isValidInput = email && password;
if (isValidInput) {
conn.query(
`SELECT * FROM users WHERE email = ?`,
email,
function (err, results, fields) {
const loginUser = results[0];
if (loginUser && loginUser.password === password) {
res.status(200).json({
message: `${loginUser.name}님, 로그인 되었습니다.`
})
} else {
res.status(404).json({
message: '이메일 또는 비밀번호가 틀렸습니다.'
})
}
}
);
} else {
res.status(400).json({
message: "입력 값을 다시 확인해주세요."
})
}
})
채널
개별 조회
존재하는 id에 대한 요청이면 조회 결과를 전송하고, 존재하지 않는 id라면 채널 정보를 찾을 수 없다는 메시지를 전송한다.
router.route('/:id')
.get((req, res) => {
let { id } = req.params;
id = parseInt(id);
const sql = `SELECT * FROM channels WHERE id = ?`;
conn.query(sql, id,
function (err, results, fields) {
if (results.length) {
res.status(200).json(results);
} else {
notFoundChannel(res);
}
}
);
})
전체 조회
사용자 아이디를 전송하면 그 사용자의 모든 채널 정보를 보여준다.
요청으로 사용자 아이디가 들어오지 않으면 상태 코드만 바꿔주고 별도의 메시지는 보내지 않는다.
router.route('/')
.get((req, res) => {
const { userId } = req.body;
if (userId) {
const sql = `SELECT * FROM channels WHERE user_id = ?`;
conn.query(sql, userId,
function (err, results, fields) {
if (results.length) {
res.status(200).json(results);
} else {
notFoundChannel(res);
}
}
);
} else {
res.status(400).end();
}
})
코드 리팩토링
- 주석은 코드를 봐도 기능을 알 수 없을 때 작성
- 조건문 중괄호, 세미콜론 등 통일시키기
- 문자열은 변수에 담아서 사용
'데브코스' 카테고리의 다른 글
[6주차 - DAY3] JWT를 이용한 인증 및 인가 (0) | 2024.04.03 |
---|---|
[6주차 - DAY2] 유효성 검사 (1) | 2024.04.02 |
[5주차 - DAY5] Workbench 사용 및 DB 연동 (0) | 2024.03.29 |
[5주차 복습 발표] DB 설계 및 실습 (0) | 2024.03.28 |
[5주차 - DAY4] DB 테이블 생성 (0) | 2024.03.28 |