반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- nestjs스터디
- JPA스터디
- 플러터 개발
- 스프링공부
- JPA예제
- querydsl
- nestjs
- 기술면접공부
- JPA
- 스프링부트
- 자료구조공부
- 카프카
- 코테공부
- JPA공부
- Axon framework
- 스프링부트공부
- 스프링 공부
- 코테준비
- 프로그래머스
- 플러터 공부
- nestjs공부
- Flutter
- DDD
- K8S
- JPA 공부
- 자바공부
- 알고리즘공부
- Kafka
- 스프링
- 기술공부
Archives
- Today
- Total
DevBoi
[NestJs] Post , 생성 본문
반응형
간단한데, 이것저것 삽질을 많이한것같다.
무튼 스프링에서 넘어가는 개발자들을 위해서 도움이 될까 한다.
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 |