TIL 27일차 - node 숙련주차 강의(2)

박찬웅·2023년 3월 4일
0

항해99

목록 보기
32/105

23년 3월 4일

배운 것

금일 배운 것은 관계형 데이터베이스와 SQL의 언어 문법을 간단하게 알아보았고, Sequelize의 개념을 알게 되었다, 그리고 이것을 토대로 Sequelize와 MYSQL 관계형 데이터베이스를 통해서 API를 프로젝트를 강의를 따라서 실습을 하였다.

시도한 것

4. 관계형 데이터베이스와 SQL

여기서 먼저 한 것은 제일 먼저 AWS 홈페이지에 가서 RDS 구매하고 MySQL 세팅을 하였다. 강의에 적힌 내용대로 여러가지 옵션들을 모두 정하고 사용자명, 비밀번호 정하고 데이터베이스를 생성을 하면 엔드포인트랑 포트를 얻게 된다. 물론 여기다 인바인드 규칙 추가해서 포트번호와 IvP4와 IvP6을 전역도 추가하였다. 이걸로 VSCode에 가서 MySQL 확장 프로그램을 설치 후 사용자명, 비밀번호랑 엔드포인트와 포트를 입력해서 MySQL을 연결 하였다.

그런 다음에 SQL에 대해서 몇가지 정리를 하였다.
데이터베이스에서 사용되는 생성, 삽입, 조회 명령문을 SQL(Structured Query Language)이라고 한다.

SQL의 종류

  • DDL (Data Definition Language)
    DDL(Data Definition Language)은 데이터를 정의할 때 사용하는 언어로 테이블이나 데이터베이스를 생성, 수정, 삭제와 같은 행위를 할 때 사용합니다.(CREATE, ARTER, DROP 등)
  • DML (Data Manipulation Language)
    DML(Data Manopulation Language)은 데이터베이스에 데이터를 조작할 때 사용하는 언어로 데이터의 저장, 삭제, 수정, 조회와 같은 행위를 합니다. (SELECT, INSERT, UPDATE, DELETE 등)
  • DCL (Data Control Language)
    DCL(Data Control Language)은 데이터베이스에 대한 권한과 관련된 문법으로 특정 유저가 DB에 접근할 수 있는 권한을 설정할 때 사용합니다. (COMMIT, ROLLBACK, GRANT, REVOKE 등)

그리고 SQL 언어를 작성하는것을 간단하게 실습을 하였다. 이 부분은 어렵지 않았던 것이 3개월전에 SQL 문법을 내일배움카드로 들었던 것들이라 쉽게 이해하였고 빠르게 넘어갔다. 다만 SQL의 제약조건에 대해서는 배우지 않았던 내용이라 SQL 제약조건의 종류와 예시 코드 정리를 하였다.

  • 고유(Unique) 제약 조건
    UNIQUE 제약 조건은 특정 컬럼에서 중복된 값이 허용되지 않도록 설정하는 조건입니다.
CREATE TABLE User
(
    userId int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(255) NOT NULL UNIQUE
);
  • NULL 제약 조건
    NULL 속성은 특정 컬럼에서 NULL값을 허용하거나, 허용하지 않도록 설정하는 조건입니다.
CREATE TABLE User
(
    userId int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(255) NOT NULL
);
  • 기본 키 (Primary Key) 제약 조건
    기본 키(Primary Key)는 테이블에 있는 데이터를 고유하게 구분할 수 있는 정보를 나타내기 위해서 사용합니다.
CREATE TABLE User
(
    userId int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(255)
);
  • 외래 키 (Foreign Key) 제약 조건
    외래 키(Foreign Key) 제약 조건은 테이블과 다른 테이블간의 관계를 맺을 때 사용하는 제약 조건입니다.
CREATE TABLE Garden
(
    gardenId int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    address  varchar(255) NOT NULL
);

CREATE TABLE GardenPlants
(
    gardenPlantsId int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
    GardenId       int(11)      NOT NULL,
    name           varchar(255) NOT NULL,
    FOREIGN KEY (GardenId) REFERENCES Garden (gardenId)
);

외래 키의 경우 다른 테이블과 관계를 맺고 있는 참조 데이터가 삭제(DELETE)또는 수정(UPDATE)될 때 어떤 행위를 해야하는지 설정할 수 있습니다. 이런 행위를 수행하는 조건을 연계 참조 무결성 제약 조건이라고 정의를 한다. 종류로는 다음과 같다.

  • CASCADE
    • 참조하고 있는 개체가 변경/삭제 될 경우 함께 변경/삭제됩니다.

      FOREIGN KEY (UserId) REFERENCES Users(userId)
          ON DELETE CASCADE
          ON UPDATE CASCADE;
  • NO ACTION
    • 참조하고 있는 개체가 변경/삭제 될 경우 아무런 행위를 하지 않고 에러가 발생하게됩니다.

      FOREIGN KEY (UserId) REFERENCES Users(userId)
          ON DELETE NO ACTION
          ON UPDATE NO ACTION;
  • SET NULL
    • 참조하고 있는 개체가 변경/삭제 될 경우 현재 데이터를 NULL로 변경합니다.

      FOREIGN KEY (UserId) REFERENCES Users(userId)
          ON DELETE SET NULL
          ON UPDATE SET NULL;
  • SET DEFAULT
    • 참조하고 있는 개체가 변경/삭제 될 경우 현재 데이터를 기본 값으로 변경합니다.
      FOREIGN KEY (UserId) REFERENCES Users(userId)
          ON DELETE SET DEFAULT
          ON UPDATE SET DEFAULT;

마지막으로 SELECT JOIN 연산자에 대해서 개념도 정리하면 두 테이블간의 공통된 데이터를 기준으로 테이블을 연결하여 하나의 테이블 처럼 조회 할 수 있는 연산자로 별칭을 통해서 연결을 하는 것을 말한다.

이렇게 SQL 언어에 대해서 간략하게 정리를 하였고 네번째 챕터는 거의 구현보다는 이론적 중심 강의였다.

5. Sequelize

Sequelize는 ORM(Object Relational Mapping)으로써 Javascript 객체(Object)와 데이터베이스의 관계(Relation)을 연결(Mapping) 해주는 도구입니다.

저희가 이전에 사용하였던 mongoose의 경우 ODM(Object Document Mapping)으로 Javascript의 객체Document와 연결하지만, Sequelize는 ORM(Object Relational Mapping)으로 Javascript의 객체와 데이터베이스의 관계(Relation)를 연결해주는 차이점이 있습니다.

mongoose는 지원하는 데이터베이스는 MongoDB 밖에 존재하지 않았지만, Sequelize의 경우 RDBMS에 해당하는 다양한 데이터베이스를 사용할 수 있다는 장점있습니다.

그리고 mongoose의 경우 Schema의 형태로 컬렉션(Collection)에 대한 속성을 설정하였다면, Sequelize의 경우 Model의 형태로 테이블(Table)의 속성을 설정할 수 있습니다.
→ MongoDB의 컬렉션과 MySQL의 테이블은 동일한 위상을 가지고 있습니다.

ORM의 장점도 나오는데 다음과 같은 장점이 있다.
1. 기존 ODM에서 다른걸 바꿀때 프로덕션에서 사용하는 데이터베이스가 언제바뀔 지 알 수 없습니다.
-> ORM을 도입하였을 경우 여러분들은 이런 상황을 겪지 않고, 단순히 ORM의 속성값만 변경할 경우 언제든지 자유롭게 DB를 변경할 수 있게 되어 개발할 때 선택의 폭이 넓어지게 됩니다.
2. 데이터베이스에서 사용하는 DB 또는 Table 속성이 변경되었을 때 빠르게 수정이 가능합니다.

Sequelize의 구성은 migration, model 2가지로 구분됩니다.

  • migration은 Sequelie CLI를 이용해 MySQL에 테이블을 생성하기 위해 사용됩니다.
  • model은 특정 TableColumn의 속성값을 입력하여, MySQL과 Express 프로젝트를 연결 (Mapping)시켜줍니다.

또한 Migration의 개념도 간단히 소개하면 다음과 같다.

  • Sequelize의 Migration
    SequelizeMigration은 MySQL의 테이블을 정의생성하기 위해 사용됩니다.

이제 본격적으로 Sequelize를 이용해서 간단하게 API를 구현하였다. Sequelize를 이용해서 API를 구현하려면 다음과 같은 패키지를 설치하면 된다.

# express, sequelize, mysql2 라이브러리를 설치합니다.
npm install express sequelize mysql2

# sequelize-cli, nodemon 라이브러리를 DevDependency로 설치합니다.
npm install -D sequelize-cli nodemon

# 설치한 sequelize를 초기화 하여, sequelize를 사용할 수 있는 구조를 생성합니다.
npx sequelize init 
  • sequelize는 우리가 Node.js 에서 sequelize를 사용할 수 있게 해요!
  • sequelize-cli는 우리가 Sequelize를 터미널에서 사용할 수 있는 도구를 설치하는 명령어예요!
  • nodemon은 개발 코드가 변경되었을 때 자동으로 서버 재시작을 해주는 패키지에요!
  • mysql2는 Node.js 에서 Sequelize를 이용해 MySQL을 더욱 쉽게 조작할 수 도록 도와주는 패키지에요!
    만약 Sequelize를 사용할 때, mysql2 패키지가 설치되어 있지 않으면 에러가 발생한다.

이런식으로 앞으로 sequelize를 이용 할때는 다음과 같이 패키지를 설치하고 진행하면된다.

내 프로젝트 폴더 이름
├── models
│   └── index.js
├── config
│   └── config.json
├── migrations
├── seeders
├── package-lock.json
└── package.json

여기서부터는 구현부분이라 자세하게 쓰면 스압이 많으니까 어떤 방식으로 구현을 진행했는지만 말하자면, 먼저 config.json에 가서 Sequelize와 RDBMS 연결하였다. 그리고 Sequelize DB 생성하여 MySQL에 데이터베이스를 생성하였다. 그 다음에 Sequelize 모델, 마이그레이션 생성하였다. 생성하는 방법은 터미널에 다음과 적으면 되며, 입력하고 나면 마이그레이션이 파일이 생성되었다.

npx sequelize model:generate --name Posts --attributes title:string,content:string,password:string
내 프로젝트 폴더 이름
├── models
│   ├── index.js
│   └── posts.js
├── config
│   └── config.json
├── migrations
│   └── 20230118144300-create-posts.js
├── seeders
├── package-lock.json
└── package.json

이제 마이그레이션에 가서 가서 데이터 작성하는 기준을 적었다. 이거는 mongoDB랑의 스키마 파일에 했했던 것처럼 적으면 되지만 미묘하게 차이는 있었다. 그래도 거의다 스키마 파일에 적었던 것처럼 하면 되었다.
그리고 models폴더 안에 있는 파일도 똑같이 마이그래이션에 적었던 것처럼 적으면 세팅 완료 된다. 이렇게 하면 이걸 통해서 데이터베이스를 넣어야 데이터의 조건들을 작성하면 데이터베이스에 해당 규격에 맞게 생성된다.
그리고 이 뒤부터 저번주부터 지겹게 구현했던 API를 작성하면 되었다. 다만 기존과는 약간의 차이는 있지만 코드 작성하는 방법은 거의 MOGOOSE랑 비슷하였다. 그렇게 게시글 목록 조회, 게시글 상세 조회, 게시글 추가, 게시글 변경, 게시글 삭제 API를 구현하였다.
이렇게 해서 Sequelize를 이용해서 구현을 마무리 되었다.

6. Sequelize : Relationship

이전 프로젝트는 Sequelize를 통해서 게시글만 적었다면 마지막으로 Sequelize의 관계 및 요구사항이 추가 된 프로젝트인 게시판 프로젝트를 진행하였다.

  • 게시판 프로젝트 테이블 관계 및 요구사항 정리하기! 사용자(Users)는 1개의 사용자 정보(UserInfo)를 가지고 있어요.
    • 그렇기 때문에 Users 테이블과 UserInfo 테이블은 1:1 관계를 가지고 있어요!

      사용자(Users)는 여러개의 게시글(Posts)을 등록할 수 있어요.

    • 그렇기 때문에 Users 테이블과 Posts 테이블을 1:N 관계를 가지고 있어요!

      사용자(Users)는 여러개의 댓글(Comments)을 작성할 수 있어요.

    • 그렇기 때문에 Users 테이블과 Comments 테이블은 1:N 관계를 가지고 있어요!

다음과 같이 ERD와 테이블 관계 및 요구사항을 정리하였다.

이제 본격적으로 구현을 시작하였다. 초반부는 이전 챕터 5장에서 했던 것처럼 사전작업을 진행하였다. 다만 차이점은 5장에서는 마이그래이션이 1개였지만 이번에는 무려 4개라서 4개 모두 다 데이터베이스에 생성할 때 조건들을 넣는 작업을 진행하였다. 뿐만이 아니라 위에 ERD처럼 테이블 관계를 정의까지 해야하기 때문에 models에다 테이블 관계를 추가적으로 적었다. 각 models 안에 파일마다 외래키를 지정하여서 테이블 관계를 정리를 하였다.

그 뒤로는 어제 했던 3장과 오늘 배웠던 5장에 구현했던 것처럼 API를 작성하였다. 5장과 차이점이라면 회원가입, 로그인 API도 구현해야 했기 때문에 JWT와 토큰들도 추가를 하였다. 그리고 이 뒤는 5장과 동일하게 API를 구현하면 되었다. 강의내용에서는 게시판 생성, 조회, 상세조회만 알려줬고, 뒤에 있는 추가 미션에 수정과 삭제까지 구현을 하였다.
이렇게 해서 강의에 있는 마지막 프로젝트를 마무리 하였다.

해결

그렇게 오늘은 강의에서 배운 프로젝트 2개를 완성하였고, 오늘 배웠던 개념들을 정리를 하였다.

알게 된 점

오늘 같은 경우에는 SQL은 이전에 배운 것들이 있어서 이해하는데는 빨랐지만 Sequelize는 개념적으로 이해하는데 상당히 어려웠었다. 하지만 API 구현하는 데에는 계속적으로 코드를 적게 되니까 이전보다 빠르게 이해하였다. 다만 로그인과 회원가입 구현은 조금 더 심층적으로 봐야 할 부분 인 것 같다. 그리고 저번주에 입문주차 개인과제를 했었는데 어제랑 오늘 이틀동안 배운 것을 통해서 더 간단하고 간결하게 API 구현하는 코드들을 자주 봐서 숙련 개인과제 할때 참고를 많이 할 것 같았다. 처음 API 구현했을때는 상당히 끙끙거리고 복잡하게 코드를 적었는데 이제 조금 클린하게 적을 수 있을것 같다.

앞으로 할 일

내일은 일요일이라 한주의 회고록인 WIL만 작성하고 쉴 것 같다. 다만 월요일부터 숙련과제를 진행해야하니 입문때도 못할 것 같았는데도 성공했으므로 숙련 개인과제도 성공 할 것이라고 믿는다.

profile
향해 13기 node.js 백앤드

0개의 댓글