nest js -6 Create DB Table Record with TypeORM(POST)

 이번 글에서는 Client에서 회원에 대한 정보를 줄때 



// member.entity.ts : /src/members

import { Entity,
Column,
PrimaryGeneratedColumn,
BaseEntity // repository에 record작성시 필요.
} from 'typeorm';


@Entity()
export class Member extends BaseEntity {
// pk number 생성
@PrimaryGeneratedColumn()
id: number;

// 컬럼 생성 : name
@Column()
name: string;

// 컬럼 생성 : password
@Column()
password: string;

// 컬럼 생성 : email
@Column()
email: string;

// 컬럼 생성 : age
@Column('int') // int는 정수
age: number;

}


이제 DB의 테이블에 record를 생성, 수정, 삭제 등등을 할것이기 때문에 BaseEntity를 사용한다.


// member.service.ts : /src/members

import { Injectable} from "@nestjs/common";
import { InjectRepository } from '@nestjs/typeorm';
import { MemberRepository } from "./member.repository";
import { Member } from "./member.entity";


// controller에 method를 제공해 준다.
@Injectable()
export class MembersService{
constructor(
// DB를 사용하게 되서 더이상 members는 필요 없어졌다.
@InjectRepository(MemberRepository)
private memberRepository: MemberRepository
) {}
// DB구축전 테스트용 코드(DB설치후 삭제)
//private members: Member_ver1[] = [];


// Controller에서 회원정보 등록 요청시
// DB와 통신을 해야하기 때문에 async사용.
async createMember(
name : string,
password : string,
email : string,
age : number,
) : Promise <Member>{

return
}
}


이제 DB를 사용하기 때문에 더이상 Member_ver1을 사용할일이 없다. service에서 DB관련 코드를 작성할수 있지만 최대한 분할하기 위해서 DB관련 코드는 repository에서 작성하겠다.




// member.repository.ts : /src/members


import { Member } from './member.entity';
import { EntityRepository, Repository } from 'typeorm';

// 내부에 에러가 발생시 사용.
import { InternalServerErrorException } from '@nestjs/common';

// Member entity를 불러서 DB의 테이블 생성
@EntityRepository(Member)
export class MemberRepository extends Repository<Member> {
// members.service.ts에 사용할 method생성

async createMember(
name : string,
password : string,
email : string,
age : number,
) : Promise <Member> {

// member record 생성
const member = new Member()

// service에서 받은 정보를 record에 작성
member.name = name;
member.password = password;
member.email = email;
member.age = age;

try{
// 작성한 record를 DB에 저장.
await member.save();
}
catch(err){
// error가 발생하면 코드 500과 에러 message를 service쪽에
// 보내준다.
throw new InternalServerErrorException(err.message);
// 여기서 코드는 마무리됨
}

// DB에 record가 저장된 다음
// member를 service에 return
return member;
}

}


위 코드처럼 MemberRepository.createMember method를 작성한다. 위 method는 service쪽에서 DB에 새로운 member(record)를 작성할때 사용한다.


문제가 없을시 member를 service쪽으로 return 한다.



// member.service.ts : /src/members

import { Injectable} from "@nestjs/common";
import { InjectRepository } from '@nestjs/typeorm';
import { MemberRepository } from "./member.repository";
import { Member } from "./member.entity";


// controller에 method를 제공해 준다.
@Injectable()
export class MembersService{
constructor(
// DB를 사용하게 되서 더이상 members는 필요 없어졌다.
@InjectRepository(MemberRepository)
private memberRepository: MemberRepository
) {}
// DB구축전 테스트용 코드(DB설치후 삭제)
//private members: Member_ver1[] = [];


// Controller에서 회원정보 등록 요청시
// DB와 통신을 해야하기 때문에 async사용.
async createMember(
name : string,
password : string,
email : string,
age : number,
) : Promise <Member>{

// createMember method를 이용하고 결과를 member.controller에 보낸다.
return await this.memberRepository.createMember(name, password, email, age);
}
}


service쪽에도 createMember의 return부분을 작성해 준다. 


// member.controller.ts : /src/members

// Controller를 구성하기 위한 method
// Controller : nest js에서 컨트롤 구현시 필요
// Post : nest js에서 Client의 Post 구현시 필요
// Body : nest js에서 Client의 Body를 추출할때 필요
import { Controller, Post, Body, Get } from '@nestjs/common';
// MembersService method를 참조
import { MembersService } from './member.service';

// Controller의 시작부분
// ('members')일시 url은 root/members으로 요청이 와야
// 아래 Controller이 실행된다.
@Controller('members')
export class MembersController{

// MembersService는 현재 class안에서만 사용할수 있다.
// 동시에 읽기 전용이다.
constructor(private readonly membersService: MembersService) {

}


// POST요청 URL : root/members
@Post()
async addMember(
// Client의 Body에서 온 정보를 각각 변수로
// 저장
@Body() completeBody: {
name : string,
password : string,
email : string,
age : number
}

/* 위 주석의 방법으로 사용할수 있음
Body에서 받은 변수들은 각각 name, password, email, age이다.
@Body('name') name: string,
@Body('password') password: string,
@Body('email') email: string,
@Body('age') age : number
*/

){
// membersService의 insertMember를 이용하여 신입회원을
// 가입시키고 해당 PkId를 return한다.
const memberPkId = await this.membersService.createMember(
completeBody.name,
completeBody.password,
completeBody.email,
completeBody.age
);

return memberPkId;

}

}


이제 controller부분에서 memberPkId변수에 memberSercvice.createMember method와 인자를 넣어 입력한다. 그리고 변수를 return 한다.





Postman으로 테스트 한 결과 정상적으로 respone된것을 알수 있다. 하지만 보통 응답문에서 password는 빠져있다. 





// member.repository.ts : /src/members


import { Member } from './member.entity';
import { EntityRepository, Repository } from 'typeorm';

// 내부에 에러가 발생시 사용.
import { InternalServerErrorException } from '@nestjs/common';

// Member entity를 불러서 DB의 테이블 생성
@EntityRepository(Member)
export class MemberRepository extends Repository<Member> {
// members.service.ts에 사용할 method생성

async createMember(
name : string,
password : string,
email : string,
age : number,
) : Promise <Member> {

// member record 생성
const member = new Member()

// service에서 받은 정보를 record에 작성
member.name = name;
member.password = password;
member.email = email;
member.age = age;

try{
// 작성한 record를 DB에 저장.
await member.save();
}
catch(err){
// error가 발생하면 코드 500과 에러 message를 service쪽에
// 보내준다.
throw new InternalServerErrorException(err.message);
// 여기서 코드는 마무리됨
}


// password는 민감한 정보이기 때문에
// service에 보낼때는 삭제한다.
delete member.password;

// DB에 record가 저장된 다음
// member를 service에 return
return member;
}

}


member.password를 제거.



정상 응답

댓글

이 블로그의 인기 게시물

Lesson 12_1 프로퍼티 노드(Property Node)

DAQ로 전압 측정하기-2

Lesson 12_2 참조를 이용한 프로퍼티노드(Property Node)