ORM

해피데빙·2022년 3월 14일
0

TIL

목록 보기
33/45

Obejct Relational Mapping

: ORM을 통해 관계형 데이터베이스를 객체로 출력

사용하는 이유

: 인스턴스 = 엔티티를 통해 하나의 레코드를 만드는 것

: 객체의 속성 = 필드의 값으로 들어간다

JOIN 테이블 의 경우
OOP : id에 대한 번호가 여러 개면 배열로 표현
DB : join 테이블 (같은 person_id에 대해 다른 phone_id)

장점
oop처럼 db에 접근 가능
sql문 사용할 필요 없이 mysql에 접근 가능

ORM의 예시 : Sequelize

  • a promise-based Node.js ORM
  • 지원하는 RDBMS
    - Postgres
    • MySQL
    • MariaDB
    • SQLite
    • Microsoft SQL server

new Sequelize : 연결을 만든다
(db 이름, user 이름, pw)

db.define : schema를 만든다
ex. roomname : Sequelize.INTEGER
다양 RDBMS 사이 호환 위해 사용하는 방법

User.sync() : promise 사용
User.create, User.findAll : 찾고 조회하는 것들
create는 새로운 레코드를 만드는 것, {칼럼 : 내용}를 이용
findAll은 {where: {찾으려는 조건}}

자동으로 해주는 것도 많지만 괜히 시간이 더 걸릴 수 있으므로 필요에 따라 막기

더 공부해보면 좋은 주제
association : join
-HasOne, BelongsTo, HasMany, BelongstoMany
transaction : 거래 (ex. 은행 : 출금, 조회 등), 만약 잘 안되면 rollback

Sequelize API 문서 보기!

Sprint

사전 준비: 1) sequelize 설치

$ npm install --save sequelize

2) sequelize-cli 설치

npm install --save-dev sequelize-cli

npx sequelize-cli --help
을 통해 명령의 종류를 파악할 수 있습니다.

  • 마이그레이션을 할 수 있도록 돕는 툴
  • CLI에서 모델을 생성
  • 스키마 적용 도움

마이그레이션이란?

  • 스키마 변경에 따른 데이터 이주(migration)
  • 데이터를 선택, 준비, 추출 및 변환하여 한 컴퓨터 저장 시스템에서 다른 컴퓨터 저장 시스템으로 영구적으로 전송하는 프로세스
  • 스키마에 변경이 있을 때마다 해줘야 한다

sprint 참고 문서
https://sequelize.org/master/manual/migrations.html

파일 디렉토리

1. ORM 설정

1) bootstraping
: 프로젝트 초기 단계를 자동으로 설정할 수 있도록 도와주는 일
cli를 통해 아래 설정 파일들을 만들어서 MySQL 접속 설정을 해야 합니다.

#명령어
npx sequelize-cli init

#파일명
config/config.json
models/
migrations/
seeders/

short.ly에서 사용할 데이터베이스는 직접 생성해야 합니다.

기본적으로 development, test, production 환경 중 development 환경을 사용하고 있다

development : 개발
test: 테스트
production : 실제

config.json

models/index.js

env 변수

process.env로 환경변수에 접근한다
process.env.NODE_ENV || 'development';
NODE_ENV가 뭔지는 모르겠지만 여기는 없기 때문에 env = 'development'가 된다

config 변수

require를 통해 config.json 파일을 불러온다
env = 'development'이므로 config.json 파일 내용 중에서 'development'키의 내용이 들어간다

sequelize 변수

use_env_variable가 없으므로(아마 env 파일에 저장했을 환경 변수 인거 같다)
sequelize = new Sequelize(config.database, config.username, config.password, config);
sequelize를 통해 새로운 모델 만들 때 이렇게 Sequelize 인스턴스의 인자로 db, username, pw를 넣는다
여기서는 config변수 안에 있는 database, username, password, config를 모두 가져온다

이후 models/url.js를 가져와서 require를 통해 url.js에서 export하고 있는 함수를 받아 sequelize, Sequelize.DataTypes를 인자로 넣어 url 클래스를 리턴받는다

2. 모델 생성

cli를 통해 모델을 만든다

모델이란?

  • 엔티티를 객체로 표현한 형태 (db -> oop)
  • 데이터 구조를 기술 (스키마)
  • 데이터에 수행할 수 있는 명령의 모음 (query)

(이전 MVC sprint에서 data 요청을 처리하는 model역할과 비슷)

  • 목표: url, title, visits 필드 생성
  • id, createdAt, updatedAt 필드는 default

npx sequelize-cli model:generate --name 모델이름 --attributes 필드이름 :데이터타입,lastName:string,email:string

모델을 잘못 만든 경우, 생성된 파일(models폴더 안에)을 직접 수정하거나 삭제 가능
필드가 가지는 특별한 요구 사항(기본값 등)은 모델 파일을 직접 수정해서 정의해야 합니다.

타입

  • RDBMS의 타입 설정 방법이 모두 다름
  • 그러므로 Sequelize는 모두 통일 :
    models/index.js 에선 Sequelize.데이터타입
    //이 sprint에서는 Datatypes.데이터타입으로 한다
    //아마 models/index.js에서 함수에 Sequelize.datatype을 넣어서 그런가보다?

cli로 model 생성할 때는 attributes 뒤에 필드명: 데이터타입 (string, integer..)

모델을 생성하면 migrations/번호-create-posts.js 파일이 생긴다
migration이 일어날 때마다 이 파일이 또 생긴다
undo를 하면 마지막으로 만들어진 파일로 돌아가고
to와 특정 파일명을 쓰면 해당 파일의 상태로 돌아간다

cf. 파일로 변경 사항을 저장하는 git 같은 느낌

3. Migration

npx sequelize-cli db:migrate
npx sequelize-cli db:migrate:undo
npx sequelize-cli db:migrate:undo:all --to XXXXXXXXXXXXXX-create-posts.js

profile
노션 : https://garrulous-gander-3f2.notion.site/c488d337791c4c4cb6d93cb9fcc26f17

0개의 댓글