7.1 데이터베이스란?
- 데이터베이스(Database): 데이터베이스는 관련성을 가지며 중복이 없는 구조화된 데이터의 집합이다.
- 데이터베이스 관리 시스템(DBMS): 데이터베이스에 저장된 값들을 생성, 조회, 수정, 삭제(CRUD)와 같이 관리할 수 있는 시스템이다.
- 관계형 데이터베이스 관리 시스템(RDBMS): DBMS의 한 종류다. 관계형 데이터베이스는 데이터를 테이블화 시킨 것이며, 각 테이블은 열과 행으로 구성된다
7.4 데이터베이스 미 테이블 생성하기
7.4.1 데이터베이스 생성하기: mysql 프롬프트에 `CREATE SCHEMA [데이터베이스명] CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;`를 통해 데이터베이스를 생성할 수 있다
7.4.2 테이블 생성하기: 데이터가 들어갈 구조를 테이블이라고한다. 테이블 구조에 맞는 데이터만 들어갈 수 있다.
- CREATE TABLE [테이블명]: `[테이블명]`에 을 이름으로 한 테이블을 생성한다
- id INT NOT NULL AUTO_INCREMENT: `id`라는 이름의 열을 설정한다. 이 열은 정수형이며 -2147483648 ~ 2147483647의 범위를 가진다. NULL값을 허용하지 않는다. 자동으로 증가하는 값을 가진다
- name VARCHAR(20) NOT NULL: `name`이라는 이름의 열을 설정한다. 이 열은 가변 문자열을 가지며 최대 20자까지 설정할 수 있다. NULL을 허용하지 않는다
- age INT UNSIGNED NOT NULL: `age`라는 이름의 열을 설정한다. 이 열은 부호 없는 정수형이며 0 ~ 4294967295 의 범위를 가진다. NULL 값을 허용하지 않는다
- married TINYINT NOT NULL: `married`라는 이름의 열을 설정한다. 이 열은 작은 정수형이며 -128 ~ 127 의 범위를 가진다. NULL 값을 허용하지 않는다
- comment TEXT NOT NULL: `comment`라는 이름의 열을 설정한다. 이 열은 문자열 데이터 타입이며 최대 65535자까지 저장할 수 있다. NULL 값을 허용하지 않는다
- created_at DATETIME NOT NLL DEFAULT now(): `created_at` 이라는 이름의 열을 설정한다. 날짜와 시간 데이터 타입을 가진다. NULL 값을 허용하지 않으며, 기본값을 현재 시간으로 사용한다.
- PRIMARY KEY(id): `id` 필드를 테이블의 기본 키로 지정하여, 각 행을 유일하게 식별한다.
- UNIQUE INDEX name_UNIQUE (name ASC): `name` 필드에 대한 고유 인덱스를 생성한다. 모든 이름 값이 유일하게 유지되도록 한다. 인덱스는 오름차순(`asc`)으로 정렬된다
- COMMENT = '사용자 정보': 테이블에 대한 설명으로 '사용자 정보'를 추가한다
- ENGINE = InnoDB: 테이블의 스토리지 엔진으로 InnoDB를 사용하겠다고 지정한다. InnoDB는 트랜잭션을 지원하며, 외래 키 제약 조건을 포함한 여러 고급 기능을 제공한다
7.5 CRUD 작업하기
CRUD는 생성(create), 읽기(read), 업데이트(update), 삭제(delete)의 약어다. 데이터를 관리하기 위한 네 가지 기본적인 작업을 의미한다.
7.5.1 Create(생성):
- 설명: 테이블 내에 포함될 데이터를 생성한다
- 사용법: `Insert` 문을 통해 생성할 수 있다
7.5.2 Read(조회):
- 설명: 테이블 내에 데이터를 조회하는 작업을 수행한다
- 사용법: `Select` 문을 통해 데이터를 조회한다
7.5.3 Update(수정):
- 설명: 테이블 내에 데이터를 수정하는 작업을 수행한다
- 사용법: `Update`문을 통해 수정한다
7.5.4 Delete(삭제):
- 설명: 테이블 내에 데이터를 삭제하는 작업을 수행한다
- 사용법: `Delete`문을 통해 삭제한다
7.6 시퀄라이즈 사용하기
Sequelize는 Node.js의 인기있는 ORM이다. ORM은 자바스크립트 명령을 mysql 명령으로 매핑해주는 도구이다.
- 설치: Node.js 프로젝트 폴더에 시퀄라이즈와 필요한 데이터베이스 라이브러리를 설치한다
Sequelize CLI를 사용하여 프로젝트 초기화를 진행한다. 이 과정에서 `config`, `models`, `migrations`, `seeders` 폴더와 관련 파일들이 생성된다.
7.6.1 MySQL 연결하기
- 설정 파일 구성: 시퀄라이즈 설정 파일인 `config/config.json`을 다음과 같이 작성할 수 있다.
비밀번호와 같은 민감한 정보는 환경변수를 통해 관리하는 것이 좋다. `process.env.DB_PASSWORD`를 사용할 수 있다.
- 시퀄라이즈 인스턴스 초기화: `models/index.js` 파일에서 시퀄라이즈 인스턴스를 생성하고, 설정 파일에서 데이터베이스 설정을 불러온다.
- 데이터베이스 연결: `sequelize.sync()` 메소드를 호출하여 정의된 모델을 바탕으로 데이터베이스 테이블을 생성하거나 업데이트할 수 있다
- 서버 실행: `app.js` 파일에서 서버를 시작하고 시퀄라이즈를 통해 데이터베이스 연결을 시도한다
7.6.2 모델 정의하기: 시퀄라이즈에서 모델은 데이터베이스 테이블을 추상화한 것이다. 즉, 하나의 모델은 데이터베이스 내의 하나의 테이블과 일대일로 대응된다. 모델의 인스턴스는 테이블의 행에 해당한다.
- 모델 파일 생성: 모델마다 별도의 파일을 생성한다. 예를 들어 `user.js` 파일에서 USER 모델을 정의한다
- 모델 정의: `sequelize.define` 메소드를 사용하거나 `Sequelize.Model`을 확장하여 클래스로 모델을 정의한다.
- 모델 초기화: 모델 파일 내에서 `init` 메소드를 사용하여 모델을 초기화한다. 이 메소드는 속성 정의와 함께 호출된다
- 모델 옵션 설정: 타임 스탬프, 테이블 이름, 문자셋 등과 같은 추가 옵션을 설정할 수 있다
- 모델 관계 정의: `associate` 메소드를 통해 다른 모델과의 관계를 정의한다. 예를 들어, 사용자와 댓글 간의 관계를 정의할 수 있다.
7.6.3 관계 정의하기
일반적으로 시퀄라이즈에서는 세 가지 기본적인 관계 유형이 있다. 1:1, 1:N, N:M
- 1:1 관계: 두 모델 각각이 서로에게 하나의 관계를 가지고 있다. 예를 들어 하나의 `user` 모델이 하나의 `profile`을 가질 수 있는 경우가 있다. 시퀄라이즈에서는 `hasOne`과 `belongTo` 메서드를 사용하여 이 관계를 설정한다
- 1:N 관계: 한 모델이 다른 모델에 대해 여러 관계를 가지고 있는 것이다. 예를 들어, 하나의 `user` 모델이 여러개의 `comment` 모델을 가질 수 있는 경우가 있다. 시퀄라이즈에서는 `hasMany`와 `belongsTo`를 사용하여 이 관계를 설정한다
- N:M 관계: 두 모델이 서로에게 여러 관계를 가지고 있다. 예를 들어 `post`와 `hashtag`의 관계에서는 하나의 `post` 모델에 여러 `hashtag`가 있을 수 있으면서, 하나의 `hashtag`에 여러 `post`가 있을 수 있다. `belongsToMany`를 사용하여 이 관계를 설정할 수 있다. `throuh` 옵션을 통해 조인할 테이블을 만들 수 있다.
각 관계 유형을 정의할 때, `foreignKey`와 `source-targetKey`옵션을 사용하여 관계의 외래 키를 명시적으로 지정할 수 있다. 이를 통해 시퀄라이즈가 생성하는 SQL 쿼리가 어떤 컬럼을 참조해야 하는지 알 수 있다.
7.6.4 쿼리 알아보기:
- 생성(create)
- 읽기(read)
- 업데이트(update):
- 삭제(delete):
- 정렬, 제한 옵션 사용:
- 조인 사용:
7.6.5 쿼리 수행하기: 로그인 회원가입을 구현해보며 실습해보겠다. 실습에 대한 글은 따로 다루겠다.
'개발' 카테고리의 다른 글
[Node.js] 로그인, 회원가입 기능 구현 (0) | 2024.02.18 |
---|---|
[Node.js] 8장 (0) | 2024.02.16 |
[Node.js] 1~6장 복습 (0) | 2024.02.15 |
[Node.js] 6장 (0) | 2024.02.08 |
[Node.js] 5장 (0) | 2024.02.07 |