들어가기
modules에서 가장 기본이 되는 entity에 대해서 알아보자!
DB Model을 설정해준다.
npm i class-transformer
npm i class-validator
==>Model의 우효성 검사!
npm i @types/bcrypt
npm i bcrypt
import as bcrypt from 'bcrypt' =>typeScript에서는 거의 as 로 import함.
user를 구성하는 Model임.
import {
Field,
InputType,
ObjectType,
registerEnumType,
} from '@nestjs/graphql'; ///import 되는 부분 확인할 것
import { CoreEntity } from 'src/common/entities/core.entity';
import { Column, Entity, BeforeInsert } from 'typeorm'; ///import 되는 부분 확인할 것
import * as bcrypt from 'bcrypt'; /// password를 암호화 함.
import { InternalServerErrorException } from '@nestjs/common'; ///error 잡아줌.
import { IsEmail, IsEnum } from 'class-validator'; ///model의 유효성 검사
enum UserRole {
Client,
Owner,
Delivery,
}
///회원 가입시 Role을 정의해 주는 방법, 매우중요
registerEnumType(UserRole, { name: 'UserRole' });
///회원 가입시 Role을 정의해 주는 방법, 매우중요
@InputType({ isAbstract: true })
///entity의 type을 정의하는 부분
///원래는 ObjectType()이지만, InputType을 갑이 사용ㅎ기 위해서는
///isAbstract:true 를 넣어준면, error가 안남.
@ObjectType()
@Entity() ///Entitty type임을 정의해줌.
export class User extends CoreEntity {
///CoreEntity는 공통으로 사용되는 부분을 미리 따로 빼놓음.
///밑에서 설명 예정.
@Column() ///typedOrm에 사용되게 정의
@Field(() => String) /// graphql에 사용되게 정의
@IsEmail() ///class0validator 유효성 검사임.
email: string; ///email을 만들어줌.
@Column()
@Field(() => String)
password: string;
@Column({ type: 'enum', enum: UserRole })
@Field(() => UserRole)
@IsEnum(UserRole)
role: UserRole;
///가입시 Role 역할 정의, 정의하는 방법 매우 중요!!!
@BeforeInsert()
///입력이 되기 전에 middleware과정을 거치게 하는 것으로 생각하면 됨.
///hashPassword는 압력한 암호를 hash화 시켜주는 함수.
///Promise<void>는 return이 void 란 의미.
async hashPassword(): Promise<void> {
try {
this.password = await bcrypt.hash(this.password, 10);
} catch (e) {
console.log(e);
throw new InternalServerErrorException();
}
}
///this.password는 위에 있는 password임. 그래서
///password가 사용될 때는 무조건 hash화 된 passwrod가 사용됨.
///checkPassword는 입력한 함수를 hash화 된 함수와 비교해줌..login인시 사용.
async checkPassword(aPassword: string): Promise<boolean> {
try {
const ok = await bcrypt.compare(aPassword, this.password);
return ok;
} catch (e) {
console.log(e);
throw new InternalServerErrorException();
}
}
}
모든 Model에 사용 될, id, createdAt, updatedAt을 빼놓음
import { Field } from '@nestjs/graphql';
import {
CreateDateColumn,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
export class CoreEntity {
@PrimaryGeneratedColumn()
@Field(() => Number)
id: number;
@CreateDateColumn()
@Field(() => Date)
createdAt: Date;
@UpdateDateColumn()
@Field(() => Date)
updatedAt: Date;
}
각각의 Column확인할 것, id는 PrimaryGeneratedColumn,
createdAt은 CreatedDateColumn, updatedAt은 UpdateDateColumn임..
확실히 확인할 것.
import { Module } from '@nestjs/common';
import { UserResolver } from './users.resolver';
import { UserService } from './users.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
@Module({
imports: [TypeOrmModule.forFeature([User])],
providers: [UserResolver, UserService],
})
///entity를 만들고 나서 반드시 Module의 imports아에,
///위와같이 imports: [TypeOrmModule.forFeature([User])], 작성한다.
///참고로 providers: [UserResolver, UserService],도 같이 작성해 준다.
export class UsersModule {}
....
TypeOrmModule.forRoot({
type: 'postgres',
host: process.env.DB_HOST,
port: +process.env.DB_PORT,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
synchronize: true,
logging: true,
entities: [User], <*********************
}),
......
!!!app.modules.ts의 TypeOrmModule에 entities:[User]를 넣어주면 entity부분은 마무리