nest js -10 Delete Particular member(parameter) in DB Record with TypeORM(DELETE)
// member.repository.ts : /src/members
import { Member } from './member.entity';
import { EntityRepository, Repository } from 'typeorm';
// 내부에 에러가 발생시 사용.
import {
BadRequestException,
InternalServerErrorException
} from '@nestjs/common';
// Member entity를 불러서 DB의 테이블 생성
@EntityRepository(Member)
export class MemberRepository extends Repository<Member> {
// members.service.ts에 사용할 method생성
// Member를 생성한다.
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 DB정보를 수정한다.
// ?는 없어도 되는 인자이다.
async updateMember(
memberId : number,
name? : string,
password? : string,
email? : string,
age? : number,
) : Promise <Member> {
// this는 DB를 말한다.
// DB에서 해당 id와 일치하는 memberId를 찾는다.
const member = await this.findOne({ id : memberId});
// member에 정보가 있으면 입력
// 없으면 DB의 정보를 입력한다.
member.name = name ? name : member.name;
member.password = password ? password : member.password;
member.email = email ? email : member.email;
member.age = age ? age : member.age;
try{
// 수정한 member의 정보를 DB에 저장한다.
await member.save()
}
catch(err){
// error가 발생하면 코드 500과 에러 message를 service쪽에
// 보내준다.
throw new InternalServerErrorException(err.message);
// 여기서 코드는 마무리됨
}
// password는 민감한 정보이므로 Service쪽에 보내지 않는다.
delete member.password;
// member를 Service쪽으로 return한다.
return member
}
// Member DB정보를 수정한다.
async deleteMember(
memberId : number,
password : string,
email : string,
) : Promise <Member> {
// this는 DB를 말한다.
// DB에서 해당 id와 일치하는 memberId를 찾는다.
const member = await this.findOne({ id : memberId});
console.log(member);
try{
// member가 존재하지 않을시
if(!member){
throw {
statusCode : 400,
message : "DB can't find the record"
}
}
// password, email이 생략시
else if(
!password ||
!email
){
throw {
statusCode : 400,
message : "There are no password or email"
}
}
// member의 입력정보와 DB의 정보를 비교
else if(
member.password === password &&
member.email === email
){
await this.delete({id : memberId});
}
}
catch(err){
// error가 발생하면 해당코드와 에러 message를 service쪽에
// 보내준다.
console.log(err);
// 에러코드에 따라 다르게 respone한다.
if(err.statusCode === 400){
throw new BadRequestException(err.message)
}
// 기타에러는 내부에러로 처리
throw new InternalServerErrorException(err.message);
// 여기서 코드는 마무리됨
}
// member를 Service쪽으로 return한다.
return member
}
}
기존 에러 코드 처리와 다른점은 deleteMember에 상황별로 에러를 throw하게 되 있다. 해당 에러가 발생하면 message, statusCode가 throw가 되며 catch부분의 err인자가 된다. catch에서 err.statCode에 따라 Client의 에러메세지는 전달한다.
// 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[] = [];
// DB에 있는 모든 member를 조회한다.
async inquireAllMember(){
// find()은 쿼리문 SELECT * FROM members;
// 이라고 보면 된다.
return await this.memberRepository.find();
}
// DB에 있는 모든 member를 조회한다.
async inquireOneMember(
memberId : number
){
// find({id : memberId})은 쿼리문
// SELECT * FROM members where id=[memberId(숫자)];
// 이라고 보면 된다.
return await this.memberRepository.findOne({id : memberId});
}
// 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);
}
// Controller에서 회원정보 수정 요청시
async updateMember(
memberId : number,
name : string,
password : string,
email : string,
age : number,
) : Promise <Member> {
// updateMember method를 이용하고 결과를 member.controller에 보낸다.
return await this.memberRepository.updateMember(memberId, name, password, email, age);
}
// Controller에서 회원정보 삭제 요청시
async deleteMember(
memberId : number,
password : string,
email : string,
) : Promise <Member> {
// updateMember method를 이용하고 결과를 member.controller에 보낸다.
return await this.memberRepository.deleteMember(memberId, password, email);
}
}
// 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,
Query,
Put,
Delete,
BadRequestException
} 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) {
}
// GET요청 URL : root/members
@Get()
async inquireMember(@Query() query){
// parame의 id가 존재하지 않음
// 모든 member를 조회한다.
if(!query.id){
// service에서 method inquireAllMember를 이용하여
// 모든 DB에 있는 member정보를 받는다.
return await this.membersService.inquireAllMember();
}
else{
return await this.membersService.inquireOneMember(query.id);
}
}
// 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;
}
@Put()
async updateMember(
@Query() query,
@Body('name') name: string,
@Body('password') password: string,
@Body('email') email: string,
@Body('age') age : number
){
// query에 memberId가 존재하지 않을시
// if문 수행
if(!query.id){
throw new BadRequestException("parms id doesn't exist");
}
const updateMember = await this.membersService.updateMember(
query.id,name, password, email, age
);
return updateMember;
}
@Delete()
async deleteMember(
@Query() query,
@Body('password') password: string,
@Body('email') email: string
){
// query에 memberId가 존재하지 않을시
// if문 수행
if(!query.id){
throw new BadRequestException("parms id doesn't exist");
}
const deleteMember = await this.membersService.deleteMember(
query.id, password, email
);
return {
message : "delete complete"
};
}
}
Postman을 이용하여 삭제를 할때 정상적으로 삭제 된 것을 알수 있습니다.
댓글
댓글 쓰기