파워 J인 나에게 딱 좋은 일정관리 프로그램을 알게됐다.
바로 아이젠하워 매트릭스
중요도와 긴급성으로 일의 우선순위를 나누는 건데 내가 만들어 쓰면 딱 좋을 것 같다.
디비 설계 ERD
회원가입 후 사용 가능하게 Users 테이블과 실제로 일정을 넣을 Todos 테이블을 만들었다.
추가로 예약 기능이나 마감 기한 설정 같은 걸 만들면 좋을 것 같지만
우선 기본적인 기능부터 만들고 추가로 붙이는 게 좋을 것 같다.
참고로 현재 서버 구조는 이렇다.
가장 상단 database.js에 mysql db와 연결하는 기본 설정을 해준다.
const mysql = require('mysql2/promise')
exports.pool = mysql.createPool({
host: 'www.asha-success.shop',
user: 'asha',
port: '3306',
password: '비밀번호입력해라',
database: 'MyTodoDB',
})
그리고 database 폴더 안에 indexDatabase.js에
const { pool } = require('../../database')
exports.getUserRows = async () => {
try {
const connection = await pool.getConnection(async (conn) => conn)
try {
const selectUserQuery = 'SELECT * FROM Users;'
const [row] = await connection.query(selectUserQuery)
return row
} catch (err) {
console.log(error(` ##### getUserRows DB error #####`))
return false
} finally {
// db 과부화 되지 않게 연결 다시 끊어주기
connection.release()
}
} catch (err) {
console.log(error(` ##### getUserRows DB error #####`))
return false
}
}
이렇게 DB와 연결할 수 있는 connection을 만들었다.
finally로 release를 해줘야 과부화가 되지 않는다.
굳이 finally말고 try, catch 안에 각각 적어도 된다.
router에는 CRUD API가 들어갈 거고 controller에는 router에 실제로 사용할 함수들을 만들어 줄 것이다.
포스트맨으로 확인 잘 동작하고 있다.
서버 개발을 할 때 보수적으로 생각해야 됨. 모든 데이터가 제대로 오지 않을 때도 고려해야 한다.
콘텐츠는 50글자 이내, 타입도 설정해준 타입 외에 들어오지 않게
그 다음 디비에 insert 해주기
const insertTodoRow = await indexDatabase.insertTodo(userIdx, contents, type)
if (!insertTodoRow) {
return res.send({
isSuccess: false,
code: 403,
message: '요청에 실패했습니다. 관리자에게 문의해주세요.',
})
}
return res.send({
result: { userIdx, contents, type },
isSuccess: true,
code: 200,
message: '일정 추가 성공',
})
컨트롤러파일에서 프론트에서 날려준 req.body를 userIdx, contents, type으로 넣고
indexDatabase.insertTodo 함수에 넣어준다.
제대로 값이 안 들어올 경우 403 에러코드와 요청 실패 메세지를 띄우고
잘 되면 일정 추가 성공 메세지를 띄워준다.
exports.insertTodo = async (userIdx, contents, type) => {
// DB 연결 검사
try {
const connection = await pool.getConnection(async (conn) => conn)
// insert query
try {
const insertTodoQuery = 'insert into Todos (userIdx, contents, type) values (?, ?, ?);'
const insertTodoParams = [userIdx, contents, type]
const [row] = await connection.query(insertTodoQuery, insertTodoParams)
return row
} catch (err) {
console.log(error(` ##### insertTodo DB error ##### \n ${err}`))
return false
} finally {
// db 과부화 되지 않게 연결 다시 끊어주기
connection.release()
}
} catch (err) {
console.log(error(` ##### insertTodo DB error ##### \n ${err}`))
return false
}
}
indexDatabase 파일에서 userIdx, contents, type을 인자로 받는 insertTodo 함수를 만들어준다.
db에 연결하는 것이기 때문에 async, await 필수
쿼리에 mysql insert문을 넣어주는데 이때, ?를 넣으면 변수처럼 작동해서 mysql에서 알아서 값을 매칭해준다.
params에 userIdx, contents, type을 넣고
connection.query에 insertTodoQuery와 insertTodoParams를 넣어주면 알아서 매칭
값이 잘 나오는 걸 확인할 수 있다.
workbench를 통해 db를 확인해봐도 잘 들어가 있다.
'Project' 카테고리의 다른 글
[아이젠하워 매트릭스] CRUD, Update, Delete / DB 서버 완료 (0) | 2023.07.08 |
---|---|
[아이젠하워 매트릭스] CRUD, Read (0) | 2023.07.05 |
🪴Plant Planet Project (WEB3.0 커뮤니티 만들기 / 정리 / 회고) (0) | 2022.12.16 |
NFT 마켓플레이스 제작 (정신차려보니 프로젝트 마지막 날이었던 건에 대하여) (0) | 2022.05.30 |
프로젝트1 - OpenSea 클론 코딩!_1일차 (0) | 2022.04.08 |