✅ ORM(Object Relational Mapping)
객체와 관계형 데이터베이스의 데이터를 자동으로 변형 및 연결해주는 것
객체 클래스 vs 관계형 db 테이블간 불일치를 해소
✅ Postgres, TypeORM 설치 및 적용
npm i pg typeorm @nestjs/typeorm --save
pg : postgres 모듈
typeorm : TypeORM 모듈
@nestjs/typeorm : nest와 TypeORM 간의 연동
예제에서는 postgresSQL과 pgAdmin4 사용
💾 postgresSQL for MAC - https://postgresapp.com/downloads.html
💾 pgAdmin4 for MAC - https://www.pgadmin.org/download/pgadmin-4-macos/
📝 docs - https://docs.nestjs.com/techniques/database
📝 ./src/configs/typeorm.config.ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
export const typeORMConfig: TypeOrmModuleOptions = {
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: 'postgres',
database: 'board-app',
entities: [__dirname + '/../**/*.entity.{js,ts}'],
synchronize: true,
};
entites 옵션에 저렇게 적으면
프로젝트의 엔티티 파일들을 모두 긁어와서 테이블을 자동 생성해준다
synchronize 옵션은 어플리케이션 재실행시 테이블을 drop 후 재생성 해준다
📝 ./src/app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { BoardsModule } from './boards/boards.module';
import { typeORMConfig } from './configs/typeorm.config';
@Module({
imports: [TypeOrmModule.forRoot(typeORMConfig), BoardsModule],
})
export class AppModule {}
루트 모듈에도 추가해주면 연동 끝
✅ 엔티티 정의
📝 ./src/boards/board.entity.ts
import { BaseEntity, Column, PrimaryGeneratedColumn } from 'typeorm';
import { BoardStatus } from './board.model';
@Entity()
export class Board extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
description: string;
@Column()
status: BoardStatus;
}
BaseEntity 를 상속받아서 정의한다
@PrimaryGeneratedColumn() 데코레이터를 사용하면 unique id 를 자동으로 생성해준다
그 외에는 @Column() 데코레이터로 새 컬럼을 지정
✅ 레포지토리 정의
레포지토리는 엔티티에 대한 찾기, 삽입, 수정, 삭제등을 처리함
데이터베이스에 대한 연산을 서비스 대신 위임하게됨
📝 Repository docs
http://typeorm.delightful.studio/classes/_repository_repository_.repository.html
하다가 보니까 EntityRepository 는 TypeORM@0.3 부터 사용하지 않는다(deprecated)해서 찾아보니까
커스텀 데코레이터 추가하고 뭐 하면 되긴 한다더라
📝 TypeORM@0.3 CustomRepository docs
https://typeorm.io/custom-repository#how-to-create-custom-repository
📝 EntityRepository 돌려줘! 데코레이터 뿌수기 + CustomRepository 커스텀
https://prod.velog.io/@pk3669/typeorm-0.3.x-EntityRepository-%EB%8F%8C%EB%A0%A4%EC%A4%98
근데 다이나믹 모듈이니 뭐니 너무너무 복잡해서 아직 더 공부해야겠지 싶고
일단은 예제 따라가는게 목적이니 TypeORM@0.2로 다운그레이드해서 해버림
npm i typeorm@0.2
📝 ./src/boards/board.repository.ts
import { EntityRepository, Repository } from 'typeorm';
import { Board } from './board.entity';
@EntityRepository(Board)
export class BoardRepository extends Repository<Board> {
}
TypeORM 다운그레이드 하니까 찍찍이 사라짐
Repository 를 상속받아서 구현한다
📝 ./src/boards/boards.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 {}
레포지토리 import 해줌
일단 여기까지 하면 TypeORM 적용은 끝
'📡 백엔드 > 🐱 Nest.js' 카테고리의 다른 글
[NestJs] 따라하면서 배우는 NestJs - 5 (레포지토리 구현 및 DB 이용 CRUD) (0) | 2022.07.07 |
---|---|
[NestJs] TypeORM 사용 시 RepositoryNotFoundError 해결하기 (0) | 2022.07.06 |
[NestJs] 따라하면서 배우는 NestJs - 3 (pipe와 validation) (0) | 2022.07.04 |
[NestJs] 따라하면서 배우는 NestJs - 2 (기본적인 CRUD 수행) (0) | 2022.07.04 |
[NestJs] 따라하면서 배우는 NestJs - 1 (기본 세팅 및 구조 파악) (0) | 2022.07.04 |