Node.js 숙련 주차 1일차 4 - RDS 세팅, SQL 이란?, 로그인/회원가입 기능을 Sequelize로 구현하기

2022. 12. 19. 20:06카테고리 없음

728x90

AWS 세팅

AWS 로그인 -> RDS 검색 결과 클릭 -> 데이터베이스 생성 -> 표준생성 -> MySQL

-> "프리 티어" 선택 -> DB인스턴스 식별자 "express-database" 입력 마스터 사용자 이름, 암호 설정 ->

DB 인스턴스 구성 스토리지 스킵 -> 퍼블릭 엑세스 기능: 예, 보안그룹 설정

초기 데이터베이스 이름 express_db 설정

RDS 포트 개방

express-database 클릭

연결 & 보안 > 보안 > VPC 보안그룹 -> express_db_security 클릭

-> 보안 그룹 ID -> 인바운드 규칙 편집 -> 포트개방 IPv4 IPv6 

 

VS Code 플러그인 설치

확장 프로그램 설치 후  (MySQL)

 

DB 연결정보 등록 후 db 뜨는지 확인하기.

 

SQL 이란?

  • 데이터를 아무리 많이 모아놓더라도 활용하지 않으면 가치가 없습니다. 조건에 맞는 데이터를 활용할 수 있어야 하고, 끊임없이 변하는 내용을 지속적으로 삽입, 수정, 삭제, 조회가 가능해야합니다.즉, 생성, 삽입, 조회 명령문을 SQL(Structured Query Language)이라고 합니다.
    • DDL (Data Definition Language)
    • DML (Data Manopulation Language)
    • DCL (Data Control Language)
  • SQL의 종류들
  • 그런상황에서 데이터를 어떻게 관리해야할 지 고민한 결과 모든 데이터들을 공통적으로 관리할 수 있는 표준 언어인 SQL이 탄생하게 되었습니다.

DDL (Data Definition Language)

  • DDL은 데이터를 정의할 때 사용하는 언어로 테이블이나 데이터베이스를 생성, 수정, 삭제와 같은 행위를 할 때 사용합니다.
    • CREATE
      • DATABASE, TABLE, VIEW, INDEX 등을 생성할 때 사용합니다.
    • DROP
      • DATABASE, TABLE, VIEW, INDEX 등을 삭제할 때 사용합니다.
    • ALTER

TABLE의 속성변경할 때 사용합니다.


DML (Data Manopulation Language)

DML은 데이터베이스에 데이터를 조작할 때 사용하는 언어로 데이터의 저장, 삭제, 수정, 조회와 같은 행위를 합니다.

  • SELECT
    • 일반적으로 TABLE에서 원하는 데이터들을 조회할 때 사용합니다.
    • 🔥 DB를 관리하면서 가장 많이 사용하는 명령어 이기도 합니다!
  • INSERT
    • 테이블에 새로운 데이터들을 삽입할 때 사용합니다.
  • DELETE
    • 테이블에서 특정한 조건에 맞는 데이터들을 삭제할 때 사용합니다.
  • UPDATE

테이블에서 특정한 조건에 맞는 데이터들을 수정할 때 사용합니다.


DCL (Data Control Language)

  • DQL은 데이터베이스에 대한 권한과 관련된 문법으로 특정 유저가 DB에 접근할 수 있는 권한을 설정할 때 사용합니다.
    • COMMIT
      • 데이터베이스의 작업이 정상적으로 완료되었음을 관리자에게 알려줄 때 사용합니다.
      • 💡 트랜잭션에 대한 개념을 알고 있다면 더욱 확실한 이해가 가능할거에요! 참고 자료
    • ROLLBACK
      • 데이터베이스의 작업이 비정상적으로 완료되었음을 관리자에게 알려줄 때 사용합니다.
      • 💡 트랜잭션에 대한 개념을 알고 있다면 더욱 확실한 이해가 가능할거에요! 참고 자료
    • GRANT
      • 데이터베이스의 특정한 유저에게 사용 권한을 부여할 때 사용합니다.
    • REVOKE
      • 데이터베이스의 특정한 유저에게 사용 권한을 취소할 때 사용합니다.

 

DB 설계 예

User와 Food라는 테이블이 있음

 

  1. 연관 관계 고민
    • 고객이 음식 주문 시, 주문 정보는 어느 테이블에 들어가야 할까?
    • 고객 테이블? 음식 테이블??
    • Tip) 테이블 설계 시 실제 값을 넣어봄

시도1) "고객 테이블" 에 주문 정보를 넣어보자!!

문제점 : 회원이 중복됨

시도2) "음식 테이블" 에 주문 정보를 넣어보자~!!

문제점: 음식 중복

  • 그럴 듯 해 보이지만.. 먹깨비(userID = 2)가 '후라이드치킨'을 하나더 시킨다면??

'주문'을 위한 테이블이 필요 → Order 테이블 추가가 필요하다.

 

  • 회원 1명은 주문 N개를 할 수 있다.
    • 회원 : 주문 = 1 : N 관계
  • 음식 1개는 주문 N개에 포함될 수 있다.
    • 음식 : 주문 = 1 : N 관계
  • 결론적으로
    • 회원 : 음식 = N : N 관계

이를 ERD 다이어그램으로 나타낸다면

또 이를 SQL문으로 나타낸다면

CREATE TABLE User(
    userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name varchar(255) NOT NULL UNIQUE
);

CREATE TABLE Food(
    foodId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name varchar(255),
    price int(11)
);

CREATE TABLE Order(
    orderId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    userId int(11) NOT NULL, 
    foodId int(11) NOT NULL, 
    createdAt datetime NOT NULL DEFAULT NOW(),
    FOREIGN KEY (foodId) REFERENCES Food(foodId) ON DELETE CASCADE,
    FOREIGN KEY (userId) REFERENCES User(userId) ON DELETE CASCADE
);

위와 같다.

 

 

Database Sequelize

    1. 모듈 설치
    터미널을 열어 프로젝트가 존재하는 위치로 이동하고 아래처럼 모듈을 설치해주세요!
    • sequelize는 우리가 Node.js 에서 sequelize를 사용할 수 있게 해요!
    • mysql2는 Node.js 에서 Sequelize를 이용해 MySQL을 더욱 쉽게 조작할 수 도록 도와주는 패키지에요! 만약 Sequelize를 사용할 때, mysql2 패키지가 설치되어 있지 않으면 에러가 발생합니다!
    • sequelize-cli는 우리가 Sequelize를 조금 더 쉽게 사용하도록 도와주는 도구를 설치하는 명령어예요!
npm i sequelize mysql2 -S
npm i sequelize-cli -D
내 프로젝트 폴더 이름
├── models
│   └── index.js
├── config
│   └── config.json
├── migrations
├── seeders
├── package-lock.json
└── package.json
    1. Sequelize 사용 준비 (with sequelize-cli)
    공식 문서를 참고해서 터미널에서 아래와 같은 명령어를 입력해줍니다!
  • npx sequelize init
    1. 어떤것이 바뀌었는지 확인
  • 2번이 문제 없이 잘 되었나요? 아래의 항목이 모두 똑같이 되어있다면 성공이예요!
    1. models 폴더 안에 index.js가 생성됨</aside>
    2. <aside> 👉 이 파일은 우리가 구현할 sequelize 모델을 편리하게 사용할 수 있게 해주는 파일이니 절대 지우면 안돼요!
    3. config 폴더 안에 config.json 파일이 생성됨 이 파일을 열어보면 데이터베이스에 연결하기 위한 설정 데이터가 JSON 형식으로 들어가있어요.
    4. migrations 폴더가 생성됨
    5. seeder 폴더가 생성됨
    3~4번에 해당하는 폴더는 모두 빈 폴더로 생성되어야 해요!</aside>
  • <aside> 📌 주의!! 여기서 생성된 폴더나 파일들은 절대로 임의로 옮기지 마세요! sequelize-cli는 정해진 경로에 있는 파일을 사용하고 저장하기 때문에 임의로 옮기면 오동작 할 가능성이 높아요!
  •  
내 프로젝트 폴더 이름
├── models
│   └── index.js
├── config
│   └── config.json
├── migrations
├── seeders
├── package-lock.json
└── package.json

config/config.json 내 파일을 수정해준다.

{
  "development": {
    "username": "root",
    "password": "pwd",
    "database": "database_development",
    "host": "express-database.----.ap-northeast-2.rds.amazonaws.com",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": "pwd",
    "database": "database_test",
    "host": "express-database.----.ap-northeast-2.rds.amazonaws.com",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": "pwd",
    "database": "database_production",
    "host": "express-database.----.ap-northeast-2.rds.amazonaws.com",
    "dialect": "mysql"
  }
}

데이터베이스 생성하기

  • 생성해야 하는 이유?
  • ->지금부터 언급하는 데이터베이스 는 일반적으로 "DB 서버" 또는 "데이터베이스"라고 부르는 MySQL 서버와는 다른 MySQL이 정의해둔 가상의 개념입니다.
    하나의 서버에 여러개의 가상의 데이터베이스를, 데이터베이스 안에 여러개의 테이블을 생성해서 관리하는 방식이죠 😉

    정리하자면 1개의 MySQL 서버 안에 n개의 데이터베이스가 존재할 수 있고,
    1개의 데이터베이스 안에 n개의 테이블이 존재할 수 있습니다.
npx sequelize db:create

잘 생성된 모습

migrations와 models 내 파일의 차이점

 

 

models 폴더안에 있는것들은 만들었던 users.js에 들어가게 되면

express 내의 Sequelize를 통해 데이터베이스 안에 있는 정보를 사용 조회 삭제 삽입 등 여러가지 작업을 할 때에는

실제 db 내 정보가 아니라 models 안에 있는 각각의 모델을 기준으로 사용하게됨

예를들어 Users 모델같은경우 email, nickname, password라는 세개의 컬럼이 있는것으로 인지하고있고

이거를 가지고 express 내에서도 Sequellize를 이용할수 있는것이다.

 

migrations는 실제 데이터 베이스에 있는 테이블을 만들기 위해 사용

models는 실제로 express내에서 해당하는 데이터베이스에 있는 테이블을 사용하기 위해 쓴다.