반응형

# MySQL

1. MySQL 설치하기

### 데이터베이스란

  • 지금까지는 데이터를 서버 메모리에 저장했음. 그래서 서버 재시작하면 데이터도 사라짐. (영구적인 저장 공간 필요)
  • MYSQL 관계형 데이터베이스 사용.
  • 데이터베이스 : 관련성을 가지며 중복이 없는 데이터들의 집합
  • DBMS : 데이터베이스를 관리하는 시스템
  • RDBMS : 관계형 데이터베이스를 관리하는 시스템
  • 서버의 하드 디스크나 DDS 등 저장 매체에 데이터를 저장
  • 서버 종료 여부와 상관 없이 데이터를 계속 사용할 수 있음
  • 여러 사람이 동시에 접근할 수 있고, 권한을 따로 줄 수 있음

### 설치

 

MySQL :: Download MySQL Installer

Select Operating System: Select Operating System… Microsoft Windows Select OS Version: All Windows (x86, 32-bit) Windows (x86, 32-bit), MSI Installer 8.0.26 2.4M (mysql-installer-web-community-8.0.26.0.msi) MD5: eaddc383a742775a5b33a3783a4890fb | Signatu

dev.mysql.com

  • 설치 파일 실행 후, custom으로 체크하여 진행.
  • select products 에서 아래와 같이 2가지 항목 선택하여 넣기 (server, workbench)

  • Excute 눌러서 설치 진행 하고.
  • Accounts and Roles 에서 root 계정에 사용할 비밀번호 입력하여 계속 설치 진행.

### MySQL 접속

  • cmd (콘솔) 에서 MySQL이 설치된 경로로 이동
  • 기본 경로 : C:\Program Files\MySQL\MySQL Server 8.0\bin
  • -h는 호스트, -u는 사용자, -p는 비밀번호
mysql -h localhost -u root -p

Enter password : 설정한 비밀번호 입력.
  • 프롬프트가 mysql> 로 바뀌면 성공. (종료시에는 exit 입력)

### 워크벤치

  • mysql 이용하기 쉽게 도와주는 것 
  • 워크벤치 실행 후 MySQL Connections에서 local instance mysql 클릭 후 비밀번호 입력하여 실행.
  • 직접 커넥션 생성할 경우 Connection Name에 localhost 적고, 비밀번호 입력하여 진행.

 

2. 테이블 생성

### 데이터베이스 생성하기

  • 콘솔에서 MySQL 프롬프트 접속
CREATE SCHEMA `nodejs` DEFAULT CHARACTER SET utf8; 로 nodejs 데이터베이스 생성

use nodejs; 로 생성된 데이터베이스 선택.

### MySQL 프롬프트에서 테이블 생성

  • CREATE TABLE 데이터베이스명.테이블명] 으로 테이블 생성.
  • 사용자 정보를 저장하는 테이블
CREATE TABLE nodejs.users (
	id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    age INT UNSIGNED NOT NULL,
    married TINYINT NOT NULL,
    comment TEXT NULL,
    created_at DATETIME NOT NULL DEFAULT now(),
    PRIMARY KEY(id),
    UNIQUE INDEX name_UNIQUE (name ASC))
    COMMENT = '사용자 정보'
    DEFAULT CHARACTER SET = utf8
    ENGINE=InnoDB;
  • 댓글 정보를 저장하는 테이블
CREATE TABLE nodejs.comments (
	id INT NOT NULL AUTO_INCREMENT,
    commenter INT NOT NULL,
    comment VARCHAR(100) NOT NULL,
    created_at DATETIME NOT NULL DEFAULT now(),
    PRIMARY KEY(id),
    INDEX commenter_idx (commenter ASC),
    CONSTRAINT commenter
    FOREIGN KEY (commenter)
    REFERENCES nodejs.users (id)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
    COMMENT = '댓글'
    DEFAULT CHARSET=utf8mb4
    ENGINE=InnoDB;

 

3. 컬럼 옵션

## 다양한 컬럼 옵션들

  • id INT NOT NULL AUTO_INCREMENT 
컬럼명 옆의 것들은 컬럼에 대한 옵션들

INT : 정수 자료형 (FLOAT, DOUBLE은 실수)
VARCHAR : 문자열 자료형, 가변 길이 (CHAR은 고정 길이)
TEXT : 긴 문자열은 TEXT로 별도 저장
DATETIME : 날짜 자료형 저장
TINYINT : -128 ~ 127 까지 저장

NOT NULL : 빈 값은 받지 않는다는 뜻(NULL은 빈 값 허용)
AUTO_INCREMENT : 숫자 자료형인 경우 다음 로우가 저장될 때 자동으로 1증가
UNSIGNED : 0과 양수만 허용
ZEROFILL : 숫자의 자리 수가 고정된 경우 빈 자리에 0을 넣음
DEFAULT now() : 날짜 컬럼의 기본값을 현재 시간으로.
  • PRIMARY KEY (id)
id가 테이블에서 로우를 특정할 수 있게 해주는 고유한 값임을 의미
학번, 주민등록번호같은 개념
  • UNIQUE INDEX name_UNIQUE (name ASC)
해당 컬럼(name)이 고유해야 함을 나타내는 옵션
name_UNIQUE는 이 옵션의 이름 (다른 이름으로 지어도 됨)
ASC는 인덱스를 오름차수능로 저장함을 의미 (DESC : 내림차순)

### 테이블 생성확인

  • 테이블 생성확인 : DESC 테이블명; 입력하여 생성확인. (예 : DESC users;)
  • 테이블 삭제하기 : DROP TABLE 테이블명 (예 : DROP TABLE users;)
  • 테이블 목록확인 : SHOW TABLES;

 

4. CRUD 작업

### CRUD

  • CRUD 란? Create / Read / Update / Delete의 두문자어, 데이터베이스에서 가장 많이 하는 작업 4가지.

### Create

  • INSERT INTO 테이블 (컬럼명들) VALUES (값들)
INSERT INTO nodejs.users (name, age, married, comment) VALUES ('zero', 24, 0, '자기소개1');

INSERT INTO nodejs.users (name, age, married, comment) VALUES ('nero', 32, 1, '자기소개2');

### Read

  • SELECT 컬럼 FROM 테이블명
SELECT * FROM nodejs.users;
  • 컬럼만 따로 추리는 것 가능.
SELECT name, married FROM nodejs.users;
  • Read 조건절 : WHERE 로 조건을 주어 선택 가능.
1. AND
AND로 여러가지 조건을 동시에 만족하는 것을 찾음.

SELECT ma,e. age FROM nodejs.users WHERE married = 1 AND age > 30;


2. OR
OR로 여러가지 조건 중 하나 이상을 만족하는 것을 찾음.
SELECT id, name FROM nodejs.users WHERE married = 0 OR age > 30;
  • 정렬해서 찾기 : ORDER BY로 특정 컬럼 값 순서대로 정렬 가능. (ASC 기본)
DESC (내림차순) / ASC (오름차순)
SELECT id, name FROM nodejs.users ORDER BY age DESC;
  • LIMIT 으로 조회할 개수 제한
SELECT id, name FROM nodejs.users ORDER BY age DESC LIMIT 1;
  • OFFSET으로 앞의 로우들 스킵 가능 (OFFSET 2면 세 번째 것부터 찾음.)
SELECT id, name FROM nodejs.users ORDER BY age DESC LIMIT 1 OFFSET 1;

### Update

  • 데이터베이스에 있는 데이터를 수정하는 작업.
  • Update 테이블명 SET 컬럼 = 새값 WHERE 조건
UPDATE nodejs.users SET comment = '바꿀 내용' WHERE id = 2;

### Delete

  • 데이터베이스에 있는 데이터를 삭제하는 작업.
  • DELETE FROM 테이블명 WHERE 조건.
DELETE FROM nodejs.users WHERE id = 2;

 

5. 시퀄라이즈 사용하기

### 시퀄라이즈 ORM

  • MySQL 작업을 쉽게 할 수 있도록 도와주는 라이브러리
  • ORM : Object Relational Mapping으로 객체와 데이터를 매핑(1대1 짝지음)
  • MySQL 외에도 다른 RDB(Maria, Postgre, SQLite, MSSQL)와 호환됨
  • 자바스크립트 문법으로 데이터 베이스 조작 가능
  • 시퀄라이즈 예제 : https://github.com/zerocho/nodejs-book/tree/master/ch7/7.6/learn-sequelize 
 

GitHub - ZeroCho/nodejs-book

Contribute to ZeroCho/nodejs-book development by creating an account on GitHub.

github.com

### 시퀄라이즈 CLI 사용하기

  • 시퀄라이즈 명령어 사용하기 위해 sequelize-cli 설치
  • mysql2는 MySQL DB가 아닌 드라이버 (Node.js와 MySQL을 이어주는 역할)
npm i express morgan nunjucks sequelize sequelize-cli mysql2

npm i -D nodemon
  • npx sequelize init으로 시퀄라이즈 구조 생성
npx sequelize init

### models / index.js 수정

  • require*../config/config) 설정 로딩
  • new Sequelize(옵션들...)로 DB와 연결 가능.

### mysql 연결하기

  • app.js 작성, sequelize.sync로 연결
const express = require('express');
const path = require('path');
const morgan = require('morgan');
const nunjucks = require('nunjucks');

const { sequelize } = require('./models');
const indexRouter = require('./routes');
const usersRouter = require('./routes/users');
const commentsRouter = require('./routes/comments');

const app = express();
app.set('port', process.env.PORT || 3001);
app.set('view engine', 'html');
nunjucks.configure('views', {
  express: app,
  watch: true,
});
sequelize.sync({ force: false })
  .then(() => {
    console.log('데이터베이스 연결 성공');
  })
  .catch((err) => {
    console.error(err);
  });

app.use(morgan('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/comments', commentsRouter);

app.use((req, res, next) => {
  const error =  new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
  error.status = 404;
  next(error);
});

app.use((err, req, res, next) => {
  res.locals.message = err.message;
  res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
  res.status(err.status || 500);
  res.render('error');
});

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '번 포트에서 대기 중');
});

 

반응형

+ Recent posts