[Nest js] basic - TypeORM

giyeon·2022년 3월 13일
0

nest js - basic

목록 보기
8/8

이 포스팅은 Youtube 'John Ahn'의 '따라하면서 배우는 NestJS'를 참고했습니다.

ORM(Object Relational Mapping) 이란

객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 말해요.
객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용합니다.

객체 모델과 관계형 모델 간에 불일치가 존재해요.
이때 ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결해줄 수 있어요.

데이터베이스 데이터 <- 매핑 -> Object 필드

여기서 매핑 역할을 해주는 것이 바로 ORM입니다.
객체를 통해 간접적으로 데이터베이스 데이터를 다룹니다.
Persistant API라고도 부릅니다.

ORM을 통해 객체와 데이터베이스의 변형에 유연하게 사용할 수 있어요.

⚙️ TypeORM?

TypeORM은 node js에서 실행되고 TypeScript로 작성된 객체단계형 맵핑 라이브러리 입니다.
관계형 데이터베이스의 데이터를 다룰 땐 SQL이 필수지만, SQL없이 데이터베이스를 다룰 수 있게 해줘요.

TypeORM을 적용하기 전과 후를 board라는 테이블에서 조건에 맞는 board게시물을 가져오는 코드를 비교해볼게요.

TypeORM 사용O

const boards = Board.find({title:'Hello', status :'PUBLIC'});

TypeORM 사용X

db.query('SELECT * FROM boards WHERE title="HELLO" AND status = "PUBLIC",(err, result)=>{
      if(err){
        throw new Error('Error')
      }
      boards = result.rows; 
})

훨씬 간결하기도 하고 sql없이 클래스로 DB를 다룰 수 있어서 개인적으로는 선호하는 방법이에요.
TypeORM은 많은 데이터베이스에서 지원이 되고 있어요.


📕 Nestjs에 TypeORM 연동하기

https://docs.nestjs.com/techniques/database
위 주소는 nestjs 에서 type orm을 사용하는 방법이 아주 자세히 나와있어요. 참고하세요!
(데이터베이스는 ProgreSQL을 사용했습니다.)

1. 먼저 필요한 모듈들을 설치해줘야 해요.

pg : ProgreSQL 모듈
typeorm : typeORM 모듈
@nestjs/typeorm : Nestjs에서 TypeORM을 사용하기 위해 연동 시켜주는 모듈

npm i pg typeorm @nestjs/typeorm

2. 폴더/파일 생성

typeorm을 관리할 폴더안에 파일을 생성합니다.

3. typeorm config 작성

데이터베이스에서 설정한 항목들을 작성해줘요.

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

export const typeORMConfig: TypeOrmModuleOptions = {
  type: 'postgres',
  host: 'localhost',
  port: 5432,
  username: 'postgres',
  password: 'password',
  database: 'board-app',
  //엔티티를 이용해서 DB 테이블을 생성합니다. 엔티티 파일이 어디있는지 설정해줍니다.
  entities: [__dirname + '/../**/*.entity.{js,ts}'],
  synchronize: true,
};

4. 루트 Module에서 적용하기

config 파일을 루트 Module에서 import시켜줍니다.

app.module.ts

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

@Module({
  imports: [TypeOrmModule.forRoot(typeORMConfig), BoardsModule],
})
export class AppModule {}

여기까지 NestJs에 TypeORM을 연동시키는 방법을 알아보았어요.


📕 Entity 생성

엔티티는 쉽게말해서 테이블을 정의하는 것을 말해요.
테이블 내부에 어떤 데이터가 들어가는지 정의합니다.
(Model 너낌)

@Entity() 데코레이터 클래스는 클래스가 엔티티임을 나타내는 데 사용돼요.

  • @PrimaryGeneratedColumn()
    엔티티의 기본키 지정
  • @Column()
    엔티티의 속성 ( ex) title, description...)등 과 같은 다른 값 지정

src/boards 폴더에 파일 생성 후, 엔티티를 작성해줍니다.

board.entity.ts

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

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

  @Column()
  title: string;

  @Column()
  description: string;

  @Column()
  status: string;
}

📕 Repository 생성

Repository란 엔티티 개체와 함께 작동하며 엔티티 찾기, 삽입, 업데이트, 삭제 등을 처리하는 역할을 합니다.

클라이언트가 서버에 요청을 보내면 컨트롤러로 갑니다.
컨트롤러는 해당 요청을 서비스에서 보내 처리하게 되는데 서비스는 Repository에서 데이터베이스 접근을 하게 돼요.
(INSERT, FIND, DELETE 등등 ..)

이것을 Repository Pattern 이라고도 부릅니다.

먼저 Repository 파일을 만들고 class를 생성해볼게요.
(생성시 Repository 클래스를 extends 해줍니다. 이로써 Find, Insert, Delete 등 엔티티 컨트롤이 가능해져요.)

src/boards/board.repository.ts

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

@EntityRepository(Board)
export class BoardRepository extends Repository<Board> {}

이제 repository를 module에서 사용할 수 있게 module에서 import를 해줘요.

board.module.ts

@Module({
  imports: [TypeOrmModule.forFeature([BoardRepository])],
  controllers: [BoardsController],
  providers: [BoardsService],
})
export class BoardsModule {}
profile
Web , App developer wannabe 🧑🏻‍💻

0개의 댓글