캡스톤디자인(1)/개발

캡스톤디자인(1) 개발 - 데이터 조회, 수정, 삭제

ludvbg (이지현) 2022. 11. 10. 21:38

컴퓨터공학과 5584977 이지현
캡스톤디자인(1) TEAM 우연한 인연

스프린트 기간 - 2022.11.02 ~ 2022.11.09

개발: Issue #5 프론트엔드 어드민은 데이터를 조회, 수정, 삭제할 수 있다.

 

내가 노마드코더에서 강의를 들으며 공부할 때는 직접적인 DB를 사용하지 않고 javascript object를 사용해 가짜 데이터베이스를 이용하여 공부하였다. 그래서 지금 mariaDB를 사용하여 데이터를 조회, 수정, 삭제하는 방법은 공식 문서를 읽고 따로 검색해보며 공부하였다.

 

처음 개발할 때는 User 테이블이 없고, Admin 테이블만 만들어진 상태여서 Admin 테이블을 사용하여 기능을 구현하였다. 나중에 테이블만 바꾸어주면 되도록 구현하려고 하였다.

 

1. 유저 데이터 조회

 

- admin.service.ts

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Admin } from './admin.entity';

@Injectable()
export class AdminService {

  constructor(
    @InjectRepository(Admin)
    private usersRepository: Repository<Admin>,
  ) { }

  findAll(): Promise<Admin[]> {
    return this.usersRepository.find();
  }

  findOne(id: string): Promise<Admin> {
    return this.usersRepository.findOne({
      where: {
        id,
      },
    });
  }
}

findAll()은 admin 테이블의 모든 데이터를 출력해주는 함수이고,

findOne()은 admin 테이블에서 찾으려는 id와 일치하는 데이터를 출력해주는 함수이다.

 


- admin.controllers.ts

import { Controller, Get, Query } from '@nestjs/common';
import { AdminService } from './admin.service';

@Controller('admin')
export class AdminController {
    constructor(
        private adminService: AdminService
    ) {}

    // 조회
    @Get('search')
    search() {
        return this.adminService.findAll();
    }

    @Get('search')
    getOne(@Query('id') id: string) {
        return this.adminService.findOne(id);
    }
}

주소창에 localhost:8080/admin/search 를 치면 admin 테이블에서 모든 데이터를 찾아주고,

/search?id를 치면 id에 해당하는 admin의 데이터를 찾아준다.

findOne(id), id: string은 같은 id이고, @Query('id')와는 다른 의미이다. 앞의 두 id는 내가 주소창에 검색한 id이고, 뒤의 id는 admin 테이블의 열 이름으로써의 id이다. 이름이 같아서 헷갈리므로 이름을 수정하였다.

 

- 수정한 admin.controller.ts (수정한 부분만)

@Get('search')
getOne(@Query('id') adminID: string) {
    return this.adminService.findOne(adminID);
}

* service에서 id는 테이블의 열 이름으로써 id이다.

 

 

 

2. 유저 데이터 삭제

데이터 수정을 구현하기 전에 삭제 기능부터 만들어주었다.

 

-  admin.service.ts

deleteOne(adminID: string): boolean {
    this.usersRepository.delete({ id: adminID });
    return true;
}

입력한 id값이 있는 열의 admin 데이터를 삭제한다.

delete는 boolean 값을 리턴한다.

 

 

-admin.controller.ts

// 삭제
@Delete('/delete')
remove(@Query('id') adminID: string) {
    return this.adminService.deleteOne(adminID);
}

localhost:8080/admin/delete?id 를 통해 입력한 id에 해당하는 사용자 데이터를 삭제한다.

 

 

 

3. 유저 데이터 수정

유저 데이터 수정을 구현할 때는 팀별 회의할 때 구현하여서 구현이 완료된 코드만 작성하였다. (User 테이블도 생성되어 User 테이블에서 유저 데이터를 수정한다. 이후 조회, 삭제도 User 테이블을 참조하도록 변경하였다.)

 

- admin.service.ts

async update(user_id: string, userData: UpdateUserDto) {
    const user = await this.usersRepository.findOne({
      where: {
        user_id,
      },
    });
    var userToUpdate = { ...user, ...userData }
    await this.usersRepository.save(userToUpdate);
  }

update는 업데이트할 유저의 정보를 DB에서 찾아서 그 값을 새로운 값으로 바꾸어 저장하는 방식이다.

 

 

- admin.controller.ts

// 수정
@Patch()
patch(@Query('user_id') userID: string, @Body() updateData: UpdateUserDto) {
    return this.adminService.update(userID, updateData);
}

 

Update는 @Patch() 데코레이터를 통하여 할 수 있고, url 쿼리로 'user_id'를 받아오고 @Body()로 업데이트할 데이터를 updateData로 받아온다. updateData는 UpdateUserDto 타입인데, 이 타입은 update-user.dto.ts라는 새로운 파일에서 생성한 클래스를 import한 것이다.

 

- update-user.dto.ts

import { IsDate, IsString } from 'class-validator';

export class UpdateUserDto {
    @IsString()
    name: string;

    @IsDate()
    createdTime: Date;
}

UpdateUserDto 클래스에는 User 테이블에서 업데이트할 값만 미리 정의해준 것이다. @IsString()과 @IsDate()로 들어올 값의 타입을 검사하며, 만약 필수 데이터가 아니라면 @IsOptional() 데코레이터를 추가해주면 된다.

 

 

 

유저 데이터 수정 기능까지 구현한 후, User 테이블이 생성된 코드를 pull 해오고 Admin 테이블로 만들었던 조회, 삭제 코드도 수정해주었다.

그래서 컨트롤러와 서비스의 전체 코드는 다음과 같다.

 

- admin.controller.ts

import { Body, Controller, Delete, Get, Patch, Query } from '@nestjs/common';
import { AdminService } from './admin.service';
import { UpdateUserDto } from './update-user.dto';

@Controller('admin')
export class AdminController {
    constructor(
        private adminService: AdminService
    ) { }

    // 조회
    @Get()
    search() {
        return this.adminService.findAll();
    }

    @Get()
    getOne(@Query('user_id') userID: string) {
        return this.adminService.findOne(userID);
    }

    // 수정
    @Patch()
    patch(@Query('user_id') userID: string, @Body() updateData: UpdateUserDto) {
        return this.adminService.update(userID, updateData);
    }

    // 삭제
    @Delete()
    remove(@Query('user_id') userID: string) {
        return this.adminService.deleteOne(userID);
    }
}

 

- admin.service.ts

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from 'src/user/user.entity';
import { UpdateUserDto } from './update-user.dto';

@Injectable()
export class AdminService {

  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) { }

  findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }

  findOne(user_id: string): Promise<User> {
    return this.usersRepository.findOne({
      where: {
        user_id,
      },
    });
  }

  async update(user_id: string, userData: UpdateUserDto) {
    const user = await this.usersRepository.findOne({
      where: {
        user_id,
      },
    });
    var userToUpdate = { ...user, ...userData }
    await this.usersRepository.save(userToUpdate);
  }

  async deleteOne(userID: string): Promise<void> {
    await this.usersRepository.delete(userID);
  }
}

 

코드를 완성하고 insomnia를 통해 테스트하니 잘 실행되었다.