DevBoi

[NestJs] Post , 생성 본문

Develop/[NestJs]

[NestJs] Post , 생성

HiSmith 2023. 6. 18. 11:52
반응형

간단한데, 이것저것 삽질을 많이한것같다.

무튼 스프링에서 넘어가는 개발자들을 위해서 도움이 될까 한다.

class-transform, class-validator, auto-mapper,Interceptor등을 살펴봤지만,

뭔가 간단하게 dto <->entity를 변환하는데 불필요한 기능? 좀, 의도와 다른 기능들이 보였다.

그래서 이건 나중에 적용하도록 하려고한다.(class-validator는 dto validation에 많은 도움을 줄것같다)

 

무튼, 시작

 

entity에 메소드를 추가했다(이건 jpa소스 작성 습관 같다)

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
import { CorpReqDto } from '../corp.req.dto';

@Entity()
export class Corp{

  @PrimaryGeneratedColumn() //업체 아이디
  id: number;
  @Column({ length: 500 }) //업체 이름
  name: string;
  
  @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  create_at?: Date;

  constructor(input?: CorpReqDto){
    if(input){
      this.name = input.name;
    }
  }
}

해당 생성자 로직을 추가해서, ReqDto-> entity생성이 가능하도록한다.

저 소스는 또하나의 규약을 명시하는데, dto로만 받고, 엔티티는 dto를 통해서만 생성되도록 한다는 것이다.

무튼, 

(dto)

import { IsNotEmpty } from "class-validator";
import { Corp } from "./entities/corp.entity";
import { ClassSerializerInterceptor } from "@nestjs/common";
import { serialize } from "v8";

export class CorpReqDto {
  
  @IsNotEmpty()
  name: string;
  

  static dtoToEntity(corpReqDto: CorpReqDto) : Corp{
    const corp = new Corp(corpReqDto);    
    return corp;
  }
}

 

(repository)

import { AbstractRepository, EntityRepository, Repository } from "typeorm";
import { Corp } from "./entities/corp.entity";
import {getRepository} from "typeorm"; 

@EntityRepository(Corp)
export class CorpRepostiory extends Repository<Corp>{

    async findbyCorpId(id: string): Promise<Corp>{
    const corp = 
    await getRepository(Corp)
                .createQueryBuilder("corp")
                .where("corp.id = :id",{id}) 
                .getOne();
    return corp;
    }
    
    
}

(service)

import { Inject, Injectable } from '@nestjs/common';
import { CorpRepostiory } from './corp.repository';
import { Corp } from './entities/corp.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { CorpReqDto } from './corp.req.dto';
import { Repository } from 'typeorm';
@Injectable()
export class CorpService {
  constructor(
    @InjectRepository(Corp)
    private  corpRepository : CorpRepostiory
  ){
    
  }
  // create(createFoodDto: CreateFoodDto) {
  //   return 'This action adds a new';
  // }

  async findbyCorpId(id:string) : Promise<Corp> {
    return this.corpRepository.findbyCorpId(id);
  }
  async saveCorp(corpReqDto: CorpReqDto){
    const corp = new Corp(corpReqDto)
    console.log(corp);
    await this.corpRepository.save(corp);
  }
}

 

(controller)

import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards } from '@nestjs/common';
import { CorpService } from './corp.service';
import { JwtAuthGuard } from 'src/auth/auth-guard';
import { Corp } from './entities/corp.entity';
import { ApiTags, ApiOperation, ApiResponse, ApiQuery, ApiParam, ApiBody } from '@nestjs/swagger';
import { CorpReqDto } from './corp.req.dto';


@ApiTags('corp') // (옵션) 태그 추가
@Controller('corp')
export class CorpController {
  constructor(private readonly corpService: CorpService) {}
  
  @ApiOperation({ summary: '업체 조회 (id)' }) // (옵션) API 동작 설명
  @ApiParam({
    description: 'corp find by id',
    type: CorpReqDto,
    name: 'get_id'
  })
  @Get(':id')
  findOne(@Param('id') id: string) : Promise<Corp>{
    return this.corpService.findbyCorpId(id);
  }
  @ApiOperation({ summary: '업체 정보 생성' }) // (옵션) API 동작 설명
  @ApiParam({
    description: 'corp find by id',
    type: CorpReqDto,
    name: 'create'
  })
  @Post('')
  createCorp(@Body('name') name :string){
    
    const corpReqDto : CorpReqDto={
      name: name
    }
    return this.corpService.saveCorp(corpReqDto);
  }
}

 

단순히 컨트롤러에서 dto로 만들어서 넘겨주고, (dto로 받아도됨, 속성이 간단해서, 그냥 name으로 했다.)

무튼 이건 자유롭게 변경하면된다.

 

(module.ts)

import { Module } from '@nestjs/common';
import { CorpController } from './corp.controller';
import { CorpService } from './corp.service';
import { CorpRepostiory } from './corp.repository';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Corp } from './entities/corp.entity';

@Module({
    imports: [TypeOrmModule.forFeature([Corp])],
    controllers: [CorpController],
    providers: [CorpService,CorpRepostiory],
})
export class CorpModule {}

 

(main.ts)

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { setNestApp } from './util/config-nest';
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  //http://127.0.0.1:3000
  const app = await NestFactory.create(AppModule);
  
  const config = new DocumentBuilder()
    .setTitle('API Documentation')
    .setDescription('API Documentation for your application')
    .setVersion('1.0')
    .addTag('users') // (옵션) 태그 추가
    .build();
  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup('api', app, document);
  

  await app.listen(3000);
}
bootstrap();

 

위와 같이 하면, 정상적으로 저장할 수 있는 소스가 탄생되고 정확하게 동작하게 된다.

반응형

'Develop > [NestJs]' 카테고리의 다른 글

[NestJs] Api 좀 더 Restful 하게 변경  (0) 2023.06.18
[NestJs] 수정, 삭제  (0) 2023.06.18
[NestJS] Repository Pattern  (0) 2023.06.16
[NestJS] Guard로, 인증 로직 구현  (0) 2023.06.04
[NestJs] TypeOrm 변경 및 Repository  (0) 2023.05.30