[DB] SQL과 TypeORM

mj·2021년 12월 22일
1

혼자 공부하는 SQL을 보며 느낀 점을 정리하는 문서입니다.

SQL(Structured Query Language)

데이터베이스를 구축하고 관리하기 위해 사용되는 언어이다. 대부분의 DBMS가 표준 SQL을 준수한다.

SQL의 종류

DDL (Data Definition Language)

데이터 정의어. 데이터베이스를 생성, 수정, 삭제를 하는 언어. 데이터의 골격을 결정한다

종류 역할
CREATE 데이터베이스(schema)나 Table을 생성합니다.
create database {schemaName}
create table {tableName} (filed1 type1, ...[options(pk, fk etc.])
ALTER Table을 수정합니다.
alter table {tableName} / [add, drop, modify column] {filedName}
DROP 데이터베이스(schema)나 Table을 삭제합니다.
drop database {schemaName}
drop table {tableName}
TRUNCATE 테이블을 초기화합니다.
### DML (Data Manipulation Language) 데이터 조작어. 데이터베이스(Schema)의 Table에 데이터(Column)을 조회, 삽입, 수정, 삭제하는 언어이다.
종류 역할
SELECT 테이블에서 데이터를 조회합니다.
select {Column} from {table} where {condition}
[...options(group by 'group', having 'search condition', order by 'DESC or ASC']
INSERT 테이블에 데이터를 삽입합니다.
insert into {Table} value (match table column data1, ...)
UPDATE 테이블의 데이터를 수정합니다.
update {table} set {column} = 'value' where {condition}
DELETE 테이블의 데이터를 삭제합니다.
delete {table} where {condition}

DCL (Data Control Language)

데이터 제어어. 데이터베이스에 접근하거나 객체에 권한을 주는 등의 역할을 하는 언어이다.
GRANT, REVOKE, COMMIT, ROLLBACK 등 여러 명령어가 있지만 데이터베이스 관리자의 역할이므로 이 글에서는 생략.

조인 (Join)

데이터베이스 내의 여러 테이블의 데이터를 합쳐 하나의 집합으로 만든다.

내부조인 (inner Join)

example: 두 테이블에서 조건이 같은 데이터만을 추출하여 하나의 집합으로 보여준다.
select * from table1
inner join table2
on table1.condition = table2.condition;

! on절에서는 where절의 모든 조건을 사용할 수 있다.

left join은 첫 번째 테이블을 기준으로 두 번째 테이블을 조합한다.
즉, 첫 번째 테이블의 row를 기준으로 데이터가 생긴다.
right join은 reverse left join인 것을 알 수 있다.

인덱스 (Index)

테이블에서 데이터를 조회하기 위해서는 순차탐색을 해야 한다. 하지만, 인덱스를 사용하면 테이블을 전체를 읽지 않아도 되므로 빠른 속도를 자랑한다.
단점은 테이블의 저장공간의 10%를 차지하기 때문에 필요할 때만 사용하는 것이 좋다.
usage:
create [option(unique)] index {indexName}
on {tableName[option(order)]}

TypeOrm (Type Object-relation-mapping)

TypeOrm은 객체지향 프로그래밍에서 클래스와 관계형 데이터베이스 테이블 관에 모델 불일치를 해결해준다.

// typeorm.config.ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm';

export const typeORMConfig: TypeOrmModuleOptions = {
  type: 'mysql', //Database 설정
  host: 'localhost',
  port: 3306,
  username: 'root',
  password: '1234',
  database: 'Ryan',
  entities: ['dist/**/*.entity.{ts,js}'], // Entity 연결
  synchronize: true, 
};

// post.model.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Post {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    title: string;

    @Column()
    text: string;

}

config에서 synchronize를 true로 해두면 테이블이 고쳐질 때마다 drop하고 다시 만들어주기 때문에 production 모드에서는 false로 설정해야 한다.
production 모드에서도 수작업으로 Table을 만들 수는 없으니 migration을 사용하여 schema들을 sync해줘야 한다.

repository를 만들었다면 다음과 같이해서 데이터베이스에 저장된 entity들을 가져올 수 있다!

const repository = connection.getRepository(User);

const user = new User();
user.firstName = "Timber";
user.lastName = "Saw";
user.age = 25;
await repository.save(user); // 데이터 저장

const allUsers = await repository.find(); // 모든 데이터 가져오기
const firstUser = await repository.findOne(1); // find by id
const timber = await repository.findOne({ firstName: "Timber", lastName: "Saw" });

await repository.remove(timber); // 데이터 삭제

// typeorm migration 링크 필요할 때 들어가서 setup 해주자!

https://github.com/typeorm/typeorm/blob/master/docs/migrations.md

// migration setup에 대한 example도 있으니 참고하면 좋을 것 같다.

https://velog.io/@jodmsoluth/nestjs-typeorm-%EC%84%B8%ED%8C%85

0개의 댓글