개발일지

Nest MySQL 연동

index.ys 2023. 7. 27. 00:11

app.module.ts

  • mysql과 nest.js 매핑
import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { UsersModule } from "./users/users.module";

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: "mysql",
      host: "127.0.0.1",
      port: 3306,
      username: "root",
      password: "1234",
      database: "test",
      autoLoadEntities: true,
      synchronize: true,
    }),
    UsersModule,
  ],
})
export class AppModule {}

user.entity.ts

  • entity설정, 각 객체에 대한 속성 설정
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstName: string;

  @Column()
  lastName: string;

  @Column({ default: true })
  isActive: boolean;
}

user.controller.ts

  • ParseIntPipe는 nest.js에서 제공하는 파이프로써 받은 데이터를 숫자로 변환해주는 파이프
  • http요청시 파라미터는 기본적으로 문자열로 전송되는데, 전송된 파라미터를 숫자로 변환해주는 역할
  • Promise<User>는 각 메서드들의 요청후 결괏값의 타입을 지정하는 문법으로, 해당 메서드의 반환값을 명확하게 알 수 있음
import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Post,
  ParseIntPipe,
} from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { User } from './user.entity';
import { UsersService } from './users.service';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post()
  create(@Body() createUserDto: CreateUserDto): Promise<User> {
    return this.usersService.create(createUserDto);
  }

  @Get()
  findAll(): Promise<User[]> {
    return this.usersService.findAll();
  }

  @Get(':id')
  findOne(@Param('id', ParseIntPipe) id: number): Promise<User> {
    return this.usersService.findOne(id);
  }

  @Delete(':id')
  remove(@Param('id') id: string): Promise<void> {
    return this.usersService.remove(id);
  }
}

user.service.ts

  • @Injectable 데코레이터는 NestJS에게 해당 클래스가 주입 가능한 서비스로 동작함을 선언함 => 의존성 주입(dependency Injection)을 지원 받을 수 잇음, 이 클래스는 다른 클래스에서 이용할 수 있음을 선언
  • constructor: 클래스의 생성자 함수, 생성자 함수는 클래스가 인스턴스화 될떄 호출 되는함수
  • @injectRepository(User)을 통해 데이터베이스와 클래스를 매핑함
  • Repository는 typeORM에서 제공하는 클래스, 데이터베이스 테이블과 매핑하는 역할
  • userRepository변수를 통해 User 엔티티와 연결되 데이터베이스 테이블에 대한 CRUD 작업 수행 가능
  • private readonly는 해당 변수가 읽기전용임을 나타냄, 변수를 선언한 후에는 값을 변경할 수 없도록 선언
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { CreateUserDto } from "./dto/create-user.dto";
import { User } from "./user.entity";

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private readonly usersRepository: Repository<User>
  ) {}

  create(createUserDto: CreateUserDto): Promise<User> {
    const user = new User();
    user.firstName = createUserDto?.firstName;
    user.lastName = createUserDto?.lastName;
    user.isActive = false;

    return this.usersRepository.save(user);
  }

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

  findOne(id: number): Promise<User> {
    return this.usersRepository.findOneBy({ id: id });
  }

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

POST요청

GET 요청

GET 요청 Params