Javascript에서 mySQL 시작하기

·2021년 9월 26일
0

javascript

목록 보기
3/13
post-thumbnail

DBA 여러분, 항상 존경합니다.

SQL이란?

Structured Query Language, 구조화된 쿼리 언어로써, 릴레이션 생성, 삭제, 변경을 표현하는 데이터 정의어 DDL 과 데이터의 검색, 삭제, 삽입, 갱신을 조작하는 데이터 조작어 DML 를 포함하는 데이터베이스 질의언어의 일종 입니다.
IBM에서 관계형 데이터 베이스 시스템으로 바꾸고자 제작하였으나, 미국 국립 표준 협회에서 이를 표준으로 선언한 이후 세계적으로 널리 사용되기 시작하였습니다.

어떤 언어들이나 그렇듯 sql 역시 기존의 사용하던 기술을 개선하기 위해 등장하곤 합니다. file-system 을 예로 들어보죠.

file-system 을 통해 우리는 웹사이트 안에서 이미지, pdf와 같은 파일 데이터를 주고 받을 수 있게 되었습니다. 양방향 통신이 가능하다는 것 만으로도 웹 세계에 큰 변화를 가져다 주었지만, 자주 사용될수록 단점이 보이기 시작했죠. 동시접근이 불가능하거나, 파일의 갯수가 많으면 많을수록 데이터의 중복 확인이나 원하는 데이터를 찾고 변경하는 등의 작업도 매우 어렵다는 점들이 있습니다.

sql 은 스키마를 통해 데이터 집합체의 분류가 가능해졌고, 지정 형식에 맞춰 데이터를 보관합니다. 수 만명의 유저가 하나의 데이터에 동시 접근이 가능해지고, 쿼리를 이용하여 원하는 데이터를 쉽게 얻고 편집할 수 있게 되었습니다. 이 밖에도 보안적인 면이던지 그럼 NoSql은 왜 등장했는지 다루어야 할 이야기가 많지만 남은 얘기들은 다음에 정리하여 작성토록 하겠습니다.

javascript에서 SQL 시작하기

// 작업은 mySql로 진행하였습니다.


// database.js
const mysql = require('mysql2');

// 이외에도 createConnection을 통해서도 연결이 가능하다고 합니다.
// createPool과의 차이는 단일 연결이냐, 복수 연결이냐의 차이입니다.

// 단일 연결의 경우 하나가 연결되면, 다른 유저는 연결이 불가능합니다. 유저마다 연결하고 끊고 연결하기를 반복하기 때문에 시간과 비용이 많이 소요됩니다.
// 복합 연결은 연결 제한 수를 정할 수 있습니다. 너무나 많은 연결은 서버 메모리를 크게 소모하기 때문에 조심하는 게 좋다고 합니다. 
const pool = mysql.createPool({
  host: '호스트',
  user: '유저',
  database: '데이터베이스',
  password: '비밀번호',
});

// 꼭 promise 형태로 반환하는 게 좋습니다. 예외처리를 한번에 끝낼 수 있거든요.
// promise 화 하지 않는 경우 callback 마다 예외처리를 입력해주어야 합니다.
// 저렇게 써도 좋고, util을 통해 promisify를 써도 좋고, 아니면 async/await를 써도 좋습니다. 다만 꼭 promise 형태로 반환하는 게 중요합니다.
module.exports = pool.promise();


// model (Class 생성)
const db = require('./utils/database.js')

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() {
// INSERT INTO table-name : 지정 column-name 순 번으로, row-data를 생성합니다. 
    return db.execute(
      'INSERT INTO products (title, price, imageUrl, description) VALUES (?, ?, ?, ?)',
      [this.title, this.price, this.imageUrl, this.description]
    );
  }
// SELECT column-name : 데이터 조회에 사용됩니다. 
  static fetchAll() {
    return db.execute('SELECT * FROM products');
  }
// WHRER  : 데이터에 대해 조건을 겁니다. 
  static findById(id) {
    return db.execute('SELECT * FROM products WHERE products.id = ?', [id]);
  }
};

참고자료
fs -> sql -> NoSql
https://velog.io/@yejinh/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-SQL-NoSQL-pkk4zdy3au
connection&pool
https://victorydntmd.tistory.com/42
mySql promise화
https://ms3864.tistory.com/27
https://stackoverflow.com/questions/48626761/node-js-mysql-pool-connection-with-async-await/50633760
https://holywater-jeong.github.io/2018/06/08/node-mysql-async-await
https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original
db.query vs db.excute
https://www.codegrepper.com/code-examples/sql/difference+between+db.query+and+db.execute

profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글