Node.js학습_MySQL

Node.js학습_MySQL

728x90

반응형

# MySQL

1. MySQL 설치하기

### 데이터베이스란

지금까지는 데이터를 서버 메모리에 저장했음. 그래서 서버 재시작하면 데이터도 사라짐. (영구적인 저장 공간 필요)

MYSQL 관계형 데이터베이스 사용.

데이터베이스 : 관련성을 가지며 중복이 없는 데이터들의 집합

DBMS : 데이터베이스를 관리하는 시스템

RDBMS : 관계형 데이터베이스를 관리하는 시스템

서버의 하드 디스크나 DDS 등 저장 매체에 데이터를 저장

서버 종료 여부와 상관 없이 데이터를 계속 사용할 수 있음

여러 사람이 동시에 접근할 수 있고, 권한을 따로 줄 수 있음

### 설치

공식 사이트 접속 (https://dev.mysql.com/downloads/installer/)

설치 파일 실행 후, 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

### 시퀄라이즈 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'), '번 포트에서 대기 중'); });

728x90

반응형

from http://dlagusgh1.tistory.com/844 by ccl(A) rewrite - 2021-10-18 23:00:43