노드js (서버 이해 -3)

박경현·2022년 6월 1일
0

이번에는 파일에 저장이 아닌 MySQL을 사용해서 DB에 테이블을 만들어 저장했다!!

그래서 그 부분 관련해서 작성해보려고 한다

DB부분은 제대로 공부한 적이 없어서 간단히 테이블 작성 법만 알았는데 이번에 공부하면서
실제 웹과 연결하는걸 배울 수 있어서 이건 진짜 잊으면 안되겠다!!!

아직 sequelize를 이용해서 데이터를 전부 CRUD하는 건 아직 안해서 그건 나중에 블로그에 업데이트 해야겠다.

그 전까지 배우고 이해한 내용을 작성해 봐야지 ㅎㅎ

코드 및 구현 설명

// util안에 database.js 
    const mysql = require('mysql2')
    const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    database: 'node-complete',
    password: '///////'
})

module.exports = pool.promise() //비동기적데이터를 처리!

//modele안에 product.js 의 일부분 

const db = require('../util/database')
    
    module.exports = class Product {
  constructor(id, title, imageUrl, description, price) {
    this.id = id
    this.title = title;
    this.imageUrl = imageUrl;
    this.description = description;
    this.price = price;
  }
  save() {
    return db.execute('INSERT INTO products (title,price,description, imageUrl) VALUES (?,?,?,?)', 
    [this.title, this.price, this.description,this.imageUrl]
    )
  }
  static fetchAll() {
    //getProductsFromFile(cb);
    return db.execute('SELECT * From products')
  }
  static findById(id) {
    return db.execute('SELECT * FROM products WHERE products.id = ?', [id])
  }

각각의 router로 화면을 이동한다! MVC패턴으로 작성해서 나름 구별 잘해놨다

controller에는 뷰에 어떻게 데이터를 보낼지 정해서 각각에 전달했다.
(애가 제일 중요한 듯)
model에는 데이터를 db에 저장하고 필요할때 내보내는 shop, product 두개를 작성했다.
view는 ejs로 작성해서 동적으로 데이터를 할당 받을 수 있게 해놨다.


database.js

우리가 사용할 DB인 mysql과 연결하기 위해 만든 JS파일이다.

비동기적 데이터를 처리하기 위해 내보낼 때 promise()를 붙였다!!
promise().then 하면 promise()후에 then에 적인 함수가 실행된다!
promise().then().catch()하면 오류 있을때 catch로 간다!

비밀번호는 비밀로 ㅋㅋ

product.js

간단한 구조는 require로 mysql과 연동한 db를 가져와서 excute로 실행하는 것이다!

return db.execute('INSERT INTO products (title,price,description, imageUrl) VALUES (?,?,?,?)', 
   [this.title, this.price, this.description,this.imageUrl]
   )

이건 프로덕트를 db에 추가하기 위해 작성한 코드이다!

id도 있지만 id는 AutoIncrement여서 자동으로 숫자를 올릴 수 있어서 제외했다!

새롭게 배우게 된 내용

VALUES (?,?,?,?)',  [this.title, this.price, this.description,this.imageUrl] 

보안상의 문제로 이렇게 적는게 안전하다고 한다. ->
바로 VALUES에 작성하는게 아니라 ? 적고 뒤에 넣을 값 적기!!

  product.save()
    .then(() => { res.redirect('/')})
    .catch(err => console.log(err))

promise()에 대해서 위해서도 작성했지만
product.save()가 정상적으로 작동하면 then()으로 가서 안에 함수를 실행,
아니면 catch()로 간다는거! 이건 promise() 기본 이동 개념이니 잊지말자!

셀프 피드백

생각보다 어렵지 않아서 아니 오히려 파일을 만들어서 저장하는 것보다 코드도 짧고 직관적이어서 놀랐다.

DB를 다루는 방법은 어디서든지 필수여서 따로 공부 좀 더 해야겠다ㅎㅎ

멈추지말고 앞으로 나가자!!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글