user.entity.ts

김종민·2022년 6월 26일
0

Nuber-Server

목록 보기
4/34

들어가기
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함.

1. src/users/entities/user.entity.ts

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();
    }
  }
}

2. src/common/entities/core.entity.ts

모든 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임..
확실히 확인할 것.

3. src/users/users.module.ts

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 {}

4. src/app.modules.ts

....
 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부분은 마무리

profile
코딩하는초딩쌤

0개의 댓글