반응형
# MySQL
1. MySQL 설치하기
### 데이터베이스란
- 지금까지는 데이터를 서버 메모리에 저장했음. 그래서 서버 재시작하면 데이터도 사라짐. (영구적인 저장 공간 필요)
- MYSQL 관계형 데이터베이스 사용.
- 데이터베이스 : 관련성을 가지며 중복이 없는 데이터들의 집합
- DBMS : 데이터베이스를 관리하는 시스템
- RDBMS : 관계형 데이터베이스를 관리하는 시스템
- 서버의 하드 디스크나 DDS 등 저장 매체에 데이터를 저장
- 서버 종료 여부와 상관 없이 데이터를 계속 사용할 수 있음
- 여러 사람이 동시에 접근할 수 있고, 권한을 따로 줄 수 있음
### 설치
- 공식 사이트 접속 (https://dev.mysql.com/downloads/installer/)
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'), '번 포트에서 대기 중');
});
반응형
'인프런 강의 학습 > Node.js 교과서' 카테고리의 다른 글
Node.js학습_SNS서비스 만들기(익스프레스 이용) (0) | 2021.10.17 |
---|---|
Node.js학습_몽고디비 (0) | 2021.10.15 |
Node.js 학습_익스프레스 웹 서버 만들기 (0) | 2021.10.07 |
Node.js 학습_npm(패키지 매니저) (0) | 2021.10.05 |
Node.js 학습_http 모듈로 서버 만들기 (0) | 2021.10.04 |