[DAY - 109] Node / MySQL 연결

2023. 8. 7. 22:30·🔥 부트캠프-웹 개발 🔥/Node

오늘은 MySQL을 연결하여 db를 업데이트, 관리하는 것을 배웠다.

결국 동적 서버에 업로드하고 실시간으로 데이터를 주고받으려면 sql이 필요하기 때문에 서버에 올리기 전에 로컬에서 사용법을 배웠다.

 

1) SQL db 생성

MySQL에서 database와 초기 데이터 출력을 위한 table을 생성했다.

 

create database todo;
use todo; 

create table todos (
	id int primary key auto_increment,
    text varchar(100) not null ,
    isChk boolean  not null
);

insert into todos (id, text, isChk ) value
(1,'친구만나기', true),
(2,'점심먹기',false),
(3,'공부하기',true),
(4,'커피마시기',false),
(5,'운동하기',false);

select * from todos;

mysql

 

2) MySQL 연결

mysql2 라이브러리 설치

 

yarn add mysql2

https://www.npmjs.com/package/mysql2

 

mysql2

fast mysql driver. Implements core protocol, prepared statements, ssl and compression in native JS. Latest version: 3.6.0, last published: 3 days ago. Start using mysql2 in your project by running `npm i mysql2`. There are 3758 other projects in the npm re

www.npmjs.com

 

로컬의 MySQL 연결

db의 비밀번호와 이름을 정확하게 작성한다.

 

const mysql = require('mysql2');
const connection = mysql.createConnection({
    user: "root",
    host: "localhost",
    password: "12345",
    database: "todo",
});

module.exports = connection;

 

3) controllers.js

todos.controllers.js 파일을 아래와 같이 수정해 준다.

제일 먼저 database를 db 변수에 담아주고 현재 db의 내용을 출력해 주는 getTodos를 작성한다.

 

let db = require('../models')

const getTodos = (req, res) => {
    const sql = 'SELECT * FROM todos'

    db.query(sql, (error, result) => {
        if (error) {
            console.log(`---${error}---`);
        } else {
            res.send(result)
        }
    })
}

 

sql문을 호출하는 문법은 아래와 같다.

 

db.query(쿼리형식, [전달값], (에러, 쿼리결과)=>{})

 

slice의 내용은 변함이 없다.

 

export const getTodos = createAsyncThunk(
    'todos/getTodos',
    async () => {
        const res = await axios.get(`http://localhost:3000/todos`)
        return res.data
    }
)

4) 삭제

삭제 버튼을 눌렀을 때의 로직은 

삭제 버튼 클릭(front)

-> Slice함수 호출(front)

-> controllers 호출(back)

-> 성공시 Slice함수 호출(front)

-> Slice extraReducers 호출

이런 식으로 흘러간다.

 

수정을 해주어야 할 부분은 controllers 함수와 extraReducers이다.

삭제의 경우 클릭한 아이템의 id만 넘겨주면 되기 때문에 params로 넘겨주었다.

 

const deleteTodos = (req, res) => {
    const id = Number(req.params.id)
    const sql = `
    DELETE 
    FROM todos
    WHERE id = ${id}
    `
    db.query(sql, (error, result) => {
        if (error) {
            console.log(`---${error}---`);
        } else {
            res.send(result)
        }
    })
}

 

delTodos가 성공적으로 실행되었을 때 이후 동작을 나타내는 addCase를 수정해 준다.

 

            .addCase(delTodos.fulfilled, (state, { payload: id }) => {
                state.data = state.data.filter(item => item.id !== id)
            })

 

5) 추가

추가의 경우 sql문에서 INSERT를 사용하면 된다.

 

const postTodos = (req, res) => {
    const text = req.body.text
    const sql = `
    INSERT INTO todos (text, isChk) 
    VALUES (?,false);
    `
    db.query(sql, [text], (error, result) => {
        if (error) {
            console.log(`---${error}---`);
        } else {
            res.send(result)
        }
    })
}

 

6) 체크박스

체크박스의 경우 클릭했을 때 checked를 매개변수로 넘겨주기 때문에 따로! isChk처럼 쓰지 않아도 된다.

 

    const handleChk = e => {
        const currentChk = e.target.checked
        dispatch(putTodos({ id, currentChk }))
    }
const putTodos = (req, res) => {
    const id = Number(req.params.id)
    const isChk = req.body.currentChk
    const sql = `
    UPDATE todos
    SET isChk = ?
    WHERE id = ?
    `
    db.query(sql, [isChk, id], (error, result) => {
        if (error) {
            console.log(`---${error}---`);
        } else {
            res.send(result)
        }
    })
}
            .addCase(putTodos.fulfilled, (state, action) => {
                const { id, currentChk } = action.payload;
                const item = state.data.find(item => item.id === id);
                if (item) {
                    item.isChk = currentChk;
                }
            });
'🔥 부트캠프-웹 개발 🔥/Node' 카테고리의 다른 글
  • #2 선수 정보 프로젝트 (Node.js)
  • [DAY - 107] Node / MVC 디자인 패턴
  • [DAY - 106] Node / params, Todo예제
  • [DAY - 103] node 기초
Yeonhub
Yeonhub
✨ https://github.com/yeonhub 📧 lsy3237@gmail.com
  • Yeonhub
    비 전공자의 Be developer
    Yeonhub
  • 전체
    오늘
    어제
    • 전체보기 (169)
      • 🔍 Tech 🔍 (19)
        • Front-End (11)
        • Back-End (4)
        • AI (1)
        • Server (1)
        • Etc (2)
      • 💡 원티드 프리온보딩 챌린지 💡 (14)
        • PRE-ONBOARDING_AI (11월) (1)
        • PRE-ONBOARDING_FE (2월) (2)
        • PRE-ONBOARDING_FE (1월) (2)
        • PRE-ONBOARDING_FE (12월) (9)
      • 🔥 부트캠프-웹 개발 🔥 (118)
        • HTML5 (7)
        • CSS3 (21)
        • JavaScript (27)
        • JavaScript_advanced (9)
        • React (24)
        • Next (1)
        • MYSql (5)
        • Node (5)
        • 오늘하날(개인프로젝트) (12)
        • 이젠제주투어(팀프로젝트) (7)
      • 💻 CS 💻 (1)
        • 알고리즘 (1)
      • ⚡ 코딩테스트 ⚡ (11)
        • JavaScript (11)
      • 📚 Books 📚 (6)
        • 클린 아키텍처 (2)
        • 인사이드 자바스크립트 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    라스콘
    node.js fcm
    Node
    react native firebase analytics
    expo admob
    expo node fcm
    expo deep linking
    react vite
    expo 길찾기
    react native analytics
    expo 지도
    rn bottom sheet
    react native expo fcm
    react native admob
    react native bottom sheet
    php node
    프론트엔드 테스트코드
    라스콘4
    expo fcm
    node crontab
    컴파운드 컴포넌트 패턴
    javascript fcm
    expo google map
    node cron
    expo fcm push
    expo map
    bottom sheet
    python node
    rn admob
    node fcm
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Yeonhub
[DAY - 109] Node / MySQL 연결
상단으로

티스토리툴바