TypeORM 추가하기
[TypeORM 설치 명령어]
npm i @nestjs/typeorm typeorm mysql2
@nestjs/config 와 joi를 설치
npm i @nestjs/config joi
// app.module.ts
import Joi from 'joi';
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { Post } from './post/entities/post.entity';
import { PostModule } from './post/post.module';
const typeOrmModuleOptions = {
useFactory: async (
configService: ConfigService,
): Promise<TypeOrmModuleOptions> => ({
type: 'mysql',
host: configService.get('DB_HOST'),
port: configService.get('DB_PORT'),
username: configService.get('DB_USERNAME'),
password: configService.get('DB_PASSWORD'),
database: configService.get('DB_NAME'),
entities: [Post],
synchronize: configService.get('DB_SYNC'),
logging: true,
}),
inject: [ConfigService],
};
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
validationSchema: Joi.object({
DB_HOST: Joi.string().required(),
DB_PORT: Joi.number().required(),
DB_USERNAME: Joi.string().required(),
DB_PASSWORD: Joi.string().required(),
DB_NAME: Joi.string().required(),
DB_SYNC: Joi.boolean().required(),
}),
}),
TypeOrmModule.forRootAsync(typeOrmModuleOptions),
PostModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
엔티티 & 리포지토리 개념
엔티티는 데이터베이스의 특정 테이블을 대표하는 객체로 ORM에서 사용.
이 객체를 통해 ORM 프레임워크가 데이터베이스와 통신함
엔티티는 테이블의 각 로우를 객체로 표현하며, 해당 객체의 속성은 테이블의 컬럼과 매핑된된다.
리포지토리
리포지토리로 도메인 로직이 데이터베이스의 세부 구현에서 분리되므로 코드의 유지 보수성과 확장성이 향상
엔티티와 데이터베이스 간의 중간 계층
프로그래머가 데이터베이스와의 통신 과정을 알지 못하더라도
추상화 된 리포지토리의 함수를 사용하여
데이터베이스에서 원하는 결과를 얻을 수 있도록 도움
일반 리포지토리로 데이터베이스 연산이 부족하면 일반 리포지토리를 상속한 커스텀 리포지토리를 작성하기
리포지토리 명세서
https://github.com/typeorm/typeorm/blob/master/docs/repository-api.md
서비스에 리파지토리 주입
import { Repository } from 'typeorm';
import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Post } from './entities/post.entity';
constructor(
@InjectRepository(Post) private postRepository: Repository<Post>,
) {}
.env 파일을 package.json 파일이 있는 루트 디렉토리에 만들기
DB_HOST="여러분들이 사용하는 데이터베이스 주소"
DB_PORT=3306
DB_USERNAME="데이터베이스 계정"
DB_PASSWORD="데이터베이스 암호"
DB_NAME="board"
DB_SYNC=true
_______________
DB_HOST="localhost"
DB_PORT=3306
DB_USERNAME="root"
DB_PASSWORD="내비번"
DB_NAME="aaa"
DB_SYNC=true
_________________________
서버를 실행하기 전 데이터베이스에 board 데이터베이스를 만들기
mysql> create database board;
못해서 Dbeaver로 db 만듦
서버 실행
npm run start
테스트
생성성
POST http://localhost:3000/post
{
"title":"첫 게시물의 제목",
"content":"첫 게시물의 내용",
"password": 123456
}
조회
GET http://localhost:3000/post
상세조회
GET http://localhost:3000/post/:id
수정
PATCH http://localhost:3000/post/:id
{
"content": "이제 포스트1. 수정완료",
"password": 123456
}
삭제
http://localhost:3000/post/:id
{
"password":123456
}