7.1 데이터베이스란?
데이터베이스는 관련성을 가지며 중복이 없는 데이터들의 집합이다.
이러한 데이터베이스를 관리하는 시스템을 DBMS(데이터베이스 관리 시스템)라고 한다.
보통 서버의 하드 디스크, SSD 등의 저장 매체에 데이터를 저장한다.
서버에 데이터베이스를 올리면 여러 사람이 동시에 사용할 수 있다.
데이터베이스를 관리하는 DBMS 중 RDBMS라고 부르는 관계형 DBMS가 많이 사용된다.
대표적인 RDBMS로 Oracle, MySQL, MSSQL 등이 있다.
이들은 SQL 이라는 언어를 사용해 데이터를 관리한다.
7.2 데이터베이스 및 테이블 생성하기
CREATE SCHEMA [데이터베이스명]이 데이터베이스를 생성하는 명령어이다.
SCHEMA라고 되어 있는데 MySQL에서 데이터베이스와 스키마는 같은 개념이다.
utf8mb4는 한글과 이모티콘을 사용할 수 있다.
COLLATE는 해당 CHARACTER SET을 어떤 형식으로 정렬할 것인지 의미한다.
SQL 구문을 입력할 때는 ;를 붙여야 해당 구문이 실행된다.
만약 세미콜론을 붙이지 않으면 다음 줄로 넘어가 다른 입력이 들어오기를 계속 기다린다.
[테이블 생성하기]
테이블이란 데이터가 들어갈 수 있는 틀을 의미하며 테이블에 맞는 데이터만 들어갈 수 있다.
CREATE TABLE [데이터베이스 테이블 명]
데이터베이스에서는 id, name, age, married로 시작되는 세로줄을 컬럼이라고 한다.
컬럼에는 모두 해당 컬럼에 관한 정보만 들어 있다.(age는 24, 32, 28)
반대로 1, zero, 24, false 같은 가로줄을 로우라고 한다.
컬럼과 로구가 교차하는 칸 하나는 필드라고 한다.
컬럼을 정의해두면 앞으로 데이터를 넣을 때 컬럼 규칙에 맞는 정보들만 넣을 수 있다.
각각 컬럼 옆에 적혀있는 INT, VARVCHAR, TINYINT, TEXT, DATETIME은 컬럼의 자료형을 뜻한다.
- INT는 정수를 의미한다. 소수까지 저장하고 싶다면 FLOAT이나 DOUBLE 자료형을 사용한다.
- VARCHAR(자릿수) 외에도 CHAR(자릿수)라는 자료형도 있다. CHAR는 고정 길이이고, VARCHAR는 가변 길이입니다.
- TEXT는 긴 글을 저장할 때 사용하며, 수백 자 이내의 문자열은 보통 VARCHAR로 많이 처리하고, 그보다 길면 TEXT로 처리한다.
- TINYINT는 -128부터 127까지의 정수를 저장할 때 사용한다. 1 또는 0만 저장한다면 불 값(Boolean)과 같은 역할을 할 수 있다.
- DATETIME은 날짜와 시간에 대한 정보를 담고 있다. 날짜 정보만 담는 DATE와 시간 정보만 담는 TIME 자료형도 있다.
자료형 뒤에 붙어있는 옵션들
- NULL과 NOT NULL은 빈칸을 허용할지 여부를 묻는 옵션입니다.
- AUTO_INCREMENT는 숫자를 저절로 올리겠다는 뜻이다.
- UNSIGNED는 숫자 자료형에 적용되는 옵션이다. 음수를 무시한다.
- ZEROFILL은 숫자의 자릿수가 고정되어 있을 때 사용할 수 있다.
- DEFAULT now()는 데이터베이스 저장 시 해당 컬럼에 값이 없을 때 MySQL이 기본값을 대신 넣는다. now()는 현재 시각을 넣으라는 뜻이다.
- 해당 컬럼이 기본 키인 경우에 PRIMARY KEY 옵션을 설정한다. 기본 키란 로우를 대표하는 고유한 값을 의미한다.
- UNIQUE INDEX는 해당 값이 고유해야 하는지에 대한 옵션이다.
테이블 자체에 대한 설정
- COMMENT은 테이블에 대한 보충 설명을 의미한다.
- ENGINE은 여러가지가 있지만 MyISAM과 InnoDB가 제일 많이 사용된다.
[테이블 확인하기]
만들어진 테이블을 확인하는 명령어는 DESC [테이블명] 이다.
테이블을 제거하는 명령어는 DROP TABLE [테이블명] 이다.
사용자의 댓글을 정의하는 테이블
comments 테이블에는 id, commenter, comment, cresated_at 컬럼이 있다.
commenter 컬럼에는 댓글을 작성하는 사용자의 id를 저장하는데 다른 테이블의 기본 키를 저장하는 컬럼을 외래 키라고 한다.
CONSTRAINT [제약 조건명] FOREIGN KEY [컬럼명] REFERENCES [참고하는 컬럼명] 으로 외래 키를 지정할 수 있다.
ON UPDATE와 ONDELETE를 CASCADE로 설정한 이유는 사용자 정보가 수정되거나 삭제되면 그것과 연결된 정보도 같이 수정되거나 삭제해야되기 때문이다. (불일치 현상 방지)
7.3 CRUD 작업하기
CRUD는 Create, Read, Update, Delete의 첫 글자를 모은 두문자어로, 데이터베이스에서 많이 수행하는 네 가지 작업을 일컫는다.
[Create (생성)]
Create는 데이터를 생성해서 데이터베이스에 넣는 작업이다.
데이터를 넣는 명령은 INSTERT INTO [테이블명] ([컬럼1], [컬럼2], [컬럼3]...) VALUES ([값1], [값2], ...) 이다.
[Read (조회)]
Read는 데이터베이스에 있는 데이터를 조회하는 작업이다.
모든 데이터를 조회하는 구문은 SELECT * FROM [테이블명] 형식이다.
특정 컬럼만 조회할 수도 있다.
조회를 원하는 컬럼을 SELECT 다음에 넣는다.
WHERE 절을 사용하면 특정 조건을 가진 데이터만 조회할 수 있다.
위 조건은 age가 30보다 이상인 사용자의 이름과 나이를 조회하는 쿼리문이다.
ORDER BT [컬럼명] [ASC|DESC] 키워드를 사용하면 정렬도 가능하다.
DESC는 내림차순, ASC는 오름차순이다.
조회할 로우 개수를 설정할 수도 있다.
LIMIT [숫자]
로우 개수를 설정하면서 몇 개를 건너뛸지 설정할 수도 있따.
OFFSET [건너뛸 숫자]
[Udate (수정)]
Update는 데이터베이스에 있는 데이터를 수정하는 작업이다.
수정 명령어는 UPDATE [테이블명] SET [컬럼명=바꿀 값] WHERE [조건]
[Delete (삭제)]
Delete는 데이터베이스에 있는 데이터를 삭제하는 작업이다.
삭제 명령어는 DELETE FROM [테이블명] WHERE [조건]
7.4 시퀄라이즈 사용하기
시퀄라이즈는 MySQL 작업을 쉽게 할 수 있도록 도와주는 라이브러리로 ORM으로 분류된다.
ORM은 자바스크립트 객체와 데이터베이스의 릴레이션을 매핑해주는 도구이다.
시퀄라이즈는 MariaDB, PostgreSQL, SQLite, MSSQL 등 다른 데이터베이스도 같이 쓸 수 있다.
시퀄라이즈를 쓰는 이유는 자바스크립트 구문을 SQL로 바꿔주기 때문에 자바스크립트만으로 조작할 수 있으며 다루기 쉽다.
sequelize-cli는 시퀄라이즈 명령어를 실행하기 위한 패키지이고, mysql2는 MySQL과 시퀄라이즈를 이어주는 드라이버 이다.
설치 완료 후 sequelize init 명령어를 호출한다.
자동으로 config, models, migrations, seeders 폴더가 생성된다.
Sequelize는 시퀄라이즈 패키지이자 생성자이다.
config/config.json에서 데이터베이스 설정을 불러온 후 new Sequelize를 통해 MySQL 연결 객체를 생성한다.
[MySQL 연결하기]
이제 시퀄라이즈를 통해 익스프레스 앱과 MySQL을 연결해야 한다.
db.sequelize를 불러와서 sync 메서드를 사용해 서버를 실행할 때 MySQL과 연동된다.
force:false을 true로 설정하면 서버를 실행할 때마다 테이블을 재생성하기 때문에 테이블을 잘못 만든 경우에 true로 설정한다.
MySQL과 연동할 때는 config 폴더 안의 config.json 정보가 사용된다.
development.password와 development.database를 현재 MySQL 커넥션과 일치하게 수정하면 된다.
이 설정은 process.env.NODE_ENV가 development일 때 적용된다.
배포할 경우 process.env.NODE_ENV를 production으로 설정한다.
[모델 정의하기]
MySQL에서 정의한 테이블을 시퀄라이즈에서도 정의해야 한다.
MySQL의 테이블은 시퀄라이즈의 모델과 대응된다.
시퀄라이즈는 모델과 MySQL의 테이블을 연결해주는 역할을 한다.
기본적으로 모델 이름은 단수형, 테이블 이름은 복수형으로 사용한다.
User 모델은 Sequelize.Model을 확장한 클래스로 선언한다.
모델은 크게 static initiate메서드와 static associate 메서드로 나누어진다.
모델 .init 메서드의 첫 번째 인수가 컬럼에 대한 설정이고 두 번째 인수가 테이블 자체에 대한 설정이다.
- sequelize: static initiate 메서드의 매개변수와 연결되는 옵션으로 db.sequelize 객체를 넣어야 한다.
- timestamps: 속성이 true이면 시퀄라이즈는 createdAt과 updatedAt 컬럼을 추가합니다.
- underscored: 시퀄라이즈는 기본적으로 테이블명과 컬럼명을 캐멀 케이스로 만든다. 이를 스네이크 케이스로 바꾼다.
- modelName: 모델 이름을 설정할 수 있다.
- tableName: 실제 데이터베이스의 테이블 이름이 된다.
- paranoid: true로 설정하면 deletedAt이라는 컬럼이 생긴다. 로우를 삭제할 때 완전히 지워지지 않고 deletedAt에 지운 시각이 기록된다.
- charset과 collate: 각각 utf8과 utf8_general_ci로 설정해야 한글이 입력된다.
[관계 정의하기]
사용자 한 명은 댓글을 여러개 작성할 수 있으나 댓글 하나에 사용자가 여러 명일 수 없다.
이러한 관계를 1:N 관계라고 한다.
사용자 한 명은 자신의 정보를 담고 있는 테이블과만 관계가 있다.
이러한 관계를 1:1 관계라고 한다.
한 게시글에는 해시태그가 여러개 달릴 수 있고, 한 해시태그도 여러 게시글에 달릴 수 있다.
이러한 관계를 N:M 관계라고 한다.
1:N
시퀄라이즈에서는 1:N 관계를 hasMany라는 메서드로 표현한다.
users 테이블의 로우 하나를 불러올 때 연결된 comments 테이블의 로우들도 같이 불러올 수 있다.
반대로 belongsTO 메서드도 있다.
hasMany 메서드는 sourceKey 속성에 id를 넣고 belongsTo 메서드에서 targetKey 속성에 id를 넣는다.
sourceKey의 id와 targetKey의 id 모두 User 모델의 id이다.
foreignKey를 지정하지 않으면 '모델명 + 키'인 컬럼이 모델에 생성된다.
1:1
1:1관계에서는 hasMany 메서드 대신 hasOne 메서드를 사용한다.
1:1관계라고 해도 belongsTo와 hasOne이 반대이면 안된다.
N:M
N:M 관계에서는 belongsToMany 메서드가 있다.
양쪽 모델 모두 belongsToMany 메서드를 사용하며 throught 속성에 그 이름을 적으면 된다.
ex) 먼저 #노드 해시태그를 Hashtag 모델에서 조회하고 가져온 태그의 아이디를 바탕으로 PostHashtag 모델에서 hastagID가 1인 POSTiD를 찾아 Post 모델에서 정보를 가져온다.
[쿼리 알아보기]
- 로우를 생성하는 쿼리
model 모듈에서 User 모델을 불러와 create 메서드를 사용한다.
이때 MySQL 자료형이 아닌 시퀄라이즈 모델에 정의한 자료형대로 넣어야 한다.
- 로우를 조회하는 쿼리들
findAll 메서드를 사용한다.
- 로우를 하나만 조회하는 쿼리
User 테이블의 데이터 하나만 가져오는 SQL 문
findOne 메서드를 사용한다.
- attributes 옵션을 사용하여 원하는 컬럼만 가져온다.
- where 옵션을 통해 조건들을 나열한다.
시퀄라이즈는 자바스크립트 객체를 사용해서 쿼리를 생성해야 하므로 Op.gt 같은 특수한 연산자들이 사용된다.
- order 옵션을 통해 정렬하기
- limit, offset도 가능하다.
- 로우를 수정하는 쿠러
update 메서드를 사용한다.
첫 번째 인수는 수정할 내용이고, 두 번째 인수는 어떤 로우를 수정할지에 대한 조건이다.
- 로우를 삭제하는 쿼리
destory 메서드로 삭제한다.
'Programming > NodeJS' 카테고리의 다른 글
Node.js 교과서 복습 (1) | 2024.02.25 |
---|---|
Node.js 교과서 [NoSQL] #8 (0) | 2024.02.18 |
Node.js 교과서 [Express, Middleware, Route, 템플릿 엔진] #6 (1) | 2024.02.11 |
Node.js 교과서 [npm] #5 (0) | 2024.02.10 |
Node.js 교과서 [요청과 응답] #4 (1) | 2024.02.04 |