Nest로 API 구현하기(5) - MySQL & TypeORM

Lojy·2022년 7월 4일
0

Nest

목록 보기
5/5
post-thumbnail

MySQL

MySQL 이란?

MySQL은 세계에서 가장 많이 쓰이는 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)이다.다중 스레드, 다중 사용자 형식의 구조질의어 형식의 데이터베이스 관리 시스템으로서 오라클이 관리 및 지원하고 있으며, Qt처럼 이중 라이선스가 적용된다. 하나의 옵션은 GPL이며, GPL 이외의 라이선스로 적용시키려는 경우 전통적인 지적재산권 라이선스의 적용을 받는다. -위키백과

MySQL 설치

아래 사이트 가서 인스톨러 다운로드

자세한 내용은 따로 다루겠다.

TypeORM

TypeORM 이란?

TypeORM은 node.js에서 실행되고 TypeScript로 작성된 객체 관계현 매퍼 라이브러리이다.

TypeORM은 MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana 및 WebSQL과 같은 여러 데이터베이스를 지원 한다.

ORM(Object Relational Mapping) 이란?

객체와 관계형 데이터베이스의 데이터를 자동으로 변형 및 연결하는 작업이다.

ORM을 이용한 개발은 객체와 데이터베이스의 변형에 유연하게 사용할 수 있다.

TypeORM 특징과 이점

  • 모델을 기반으로 데이터베이스 테이블 체계를 자동으로 생성한다.
  • 데이터베이스에서 개체를 쉽게 삽입, 업데이트 및 삭제할 수 있다.
  • 테이블 간의 매핑(1:1, 1:N, N:M)을 만든다.
  • 간단한 CLI 명령을 제공한다.
  • TypeORM은 간단한 코딩으로 ORM 프레임 워크를 사용하기 쉽다.
  • TypeORM은 다른 모듈과 쉽게 통합된다.

TypeORM 사용하기

모듈 설치

npm i --save @nest/typeorm typeorm mysql2

@nestjs/typeorm

NestJS에서 TypeORM을 사용하기 위해 연동 시켜주는 모듈

typeorm

typeORM 모듈

mysql2

mysql 모듈

TypeORM 애플리케이션 연결

1. typeORM 설정파일 생성

2. TypeORM 설정파일 작성

import { TypeOrmModuleOptions } from '@nestjs/typeorm';

export const typeORMConfig: TypeOrmModuleOptions ={
    type: 'mysql',
    host: 'localhost',
    port: 3306,
    username: 'root',
    password: 'root',
    database: 'test',
    entities: [__dirname + '/../**/*.entity.{js.ts}'],
    synchronize:true
}
  • synchronize:true 는 개발환경에서만 쓰고 아닐 시 false로 바꿔 준다. 그렇지 않을시 데이터를 잃을 수 있다.
  • entities 는 나중에 생성할 entity를 하나씩 넣어 줄 수도 있지만 위와 같이 작성하면 모든 entity를 포합하게 된다.

3. Module 에서 import 하기

app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { BoardsModule } from './boards/boards.module';
import { typeORMConfig } from './configs/typeorm.config';

@Module({
    imports: [
      TypeOrmModule.forRoot(typeORMConfig),
      BoardsModule],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule {}
  • forRoot안에 넣어준 설정(configuration)은 모든 Sub-Module 에 다 적용이 된다.

Entity 생성

./boards/board.entity.ts

import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Board extends BaseEntity {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    title: string;

    @Column()
    description: string;
}

@Entity()

  • Entity() 데코레이터 클래스는 Board 클래스가 Entity임을 나타내는데 사용

@PrimaryGeneratedColumn()

  • @PrimaryGeneratedColumn() 데코레이터 클래스는 id 열이 Board Entity의 기본 키 열임을 나타내는 데 사용

@Column()

  • @Column() 데코레이터 클래스는 Board Entity의 title 및 description 과 같은 다른 열을 타나내는 데 사용

이제 Entity 클래스 Board가 생성 되었다.
TypeORM은 데이터베이스의 Board Entity에 해당하는 테이블을 자동으로 생성하고 board로 이름으로 지정한다.

Repository 생성

Repository 란?

Reposotory는 Entity 개체와 함께 작동하며, 엔티티 찾기, 삽입, 업데이트, 삭제 등을 처리한다.
공식 문서 주소
데이터베이스에 관련 된일은 서비스가 아닌 Repository에서 해주면 된다. 이것을 Repository Pattern이라고도 부른다.

1. Repository 파일 생성

2. 생성한 파일에 Repository를 위한 클래스 생성

'./boards/boares.repository.ts'

import { EntityRepository, Repository } from 'typeorm';
import { Board } from './boards.entity';

@EntityRepository(Board)
export class BoardRepository extends Repository<Board> {
    
}
  • 생성 시 Repository 클래스를 Extends 해준다.(Find, insert, Delete 등 Entity를 컨트롤 해 줄 수 있다.
  • @EntityRepository()는 클래스를 사용자 정의(Custom) 저장소로 선언하는 데 사용된다. 사용자 지정 저장소는 일부 특정 Entity를 관리하거 일반 저장소 일 수 있다.

3. 생성한 Repository를 다른곳에서도 사용할 수 있게 하기 위해서 board.module에 import 해준다.

./boards/board.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { BoardRepository } from './board.repository';
import { BoardsController } from './boards.controller';
import { BoardsService } from './boards.service';

@Module({
  imports: [
    TypeOrmModule.forFeature([BoardRepository])
  ],
  controllers: [BoardsController],
  providers: [BoardsService]
})
export class BoardsModule {}

마무리

오늘은 지금까지 데이터를 메모리에 보관을 했지만 이제부터는 애플리세이션에 데이터베이스를 연결해서 데이터베이스에 보관하기 위해 여러 설정들을 해주었다.
설정이 복작하지만 TypeORM 을 통해 SQL문을 직접 작성하지 않아도, 데이터베이스와 통신을 간편하게 할 수 있어서 다행이다.

profile
Node 하는 lojy

0개의 댓글