본문 바로가기

코딩/NestJS

NestJS에서 MariaDB에 유저 정보 저장하기

반응형

들어가기에 앞서, 본 포스팅에서 사용한 MariaDB는

Docker를 활용해서 구동했습니다.


NestJS에서는 TypeORM을 통해 DB와 NestJS를 연동합니다.

ORM(Object Relational Mapping)은 이름 그대로 객체와 관계를 매핑해줍니다.

 

이렇게 매핑을 하게 되면

Nest에서 작성한 코드를 바탕으로 SQL을 생성하여

DB에 적용시켜줍니다.

 

말로만 하면 이해가 잘 안되니까 직접 해봅시다.


npm install --save @nestjs/typeorm typeorm mysql2 @nestjs/config

우선 위 명령어를 입력하여 TypeORM을 설치합니다.

DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASS=1111
DB_DATABASE=test

이후 NestJS 프로젝트의 루트 폴더에

.development.env 파일을 만들고 위와 같이

DB 관련 설정을 입력해 줍니다.

 

HOST에는 DB와 연결할 수 있는 IP 주소를 입력해주면 됩니다.

저는 DB와 개발환경이 동일한 컴퓨터에 존재하므로

localhost로 지정해주었습니다.

 

PORT 역시

도커로 MariaDB를 생성할 때 지정해둔 3306번으로 지정했습니다.

 

USER는 따로 DB 계정을 생성하지 않았으면 root로 해줍니다.

 

PASS는 비밀번호인데,

MariaDB 생성 시 설정해둔 root 계정의 비밀번호인 1111로 지정했습니다.

 

마지막으로 DATABASE에는 내가 사용할 데이터베이스이름을 지정해줍니다.

저는 MariaDB 쉘에서 test라는 데이터베이스를 생성해두었습니다.


본격적으로 코드를 작성해보겠습니다.

우리는 오늘,

POST 요청에 따라 DB에 유저 정보를  생성해주는

NestJS 프로그램을 작성합니다.

 

회원가입과 동일한 로직이니 참고하시면 되겠습니다.

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';

// 아래 세개의 파일은 곧 생성할 예정이니 미리 import 해둡니다.
import { LoginModule } from './login/login.module';
import { UserModule } from './user/user.module';
import { User } from './user/entities/user.entity';

@Module({
  imports: [
    LoginModule,
    UserModule,
    
    // 아까 생성한 .development.env 파일의 설정을 불러옵니다.
    ConfigModule.forRoot({ envFilePath: ['.development.env'] }),
    
    // 불러온 설정의 내용들을 각각 매핑해줍니다.
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: process.env.DB_HOST,
      port: parseInt(process.env.DB_PORT),
      username: process.env.DB_USER,
      password: process.env.DB_PASS,
      database: process.env.DB_DATABASE,
      
      entities: [User],
      synchronize: true,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

 

우선 app.module.ts에 코드를 작성합니다.

app.module.ts 파일에는 전체적인 모듈 설정을 관리해줍니다.


import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {

  // DB에서 id와 username, password, nickname을 사용할 예정입니다.
  // 이때 id는 로그인 할 때 사용하는 아이디가 아니라 생성된 계정에 붙여줄 번호를 의미합니다.
  @PrimaryGeneratedColumn()
  id: number;
  @Column()
  username: string;
  @Column()
  password: string;
  @Column()
  nickname: string;
}

다음은 src/user/entities/user.entity.ts 파일의 코드입니다.

디렉토리를 생성하고 파일을 생성해준 뒤 코드를 작성해주시면 됩니다.

 

user.entity.ts 파일에서는

유저 정보에서 사용할 데이터의 종류를 설정해줍니다.

 

참고로 위 코드의 id는 로그인 할 때 사용하는 id가 아니라

유저 정보가 생성될 때 부여되는 번호입니다.

id값은 자동 부여되고, 카운팅 될 수 있도록

@PrimaryGeneratedColumn()을 붙여줍니다.

여기까지 코드를 작성하고 NestJS 서버를 실행하면 test DB에 user테이블이 생성됩니다.

 

DB에서 쿼리문을 사용한것도 아닌데

NestJS에서 작성한 코드만으로 DB에 테이블이 생성되다니 신기하죠?

이처럼 프로그래밍 언어만으로

DB를 다룰 수 있도록 하는 것이

ORM의 역할입니다.


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

export class CreateUserDTO {
  @IsString()
  username: string;
  @IsString()
  password: string;
  @IsOptional()
  nickname: string;
}

위 코드는 src/user/dto/create-user.dto.ts 파일의 코드입니다.

역시 디렉토리와 파일을 생성해서 작업해줍니다.

 

create-user.dto.ts 파일에서는

유저 정보를 생성할 때 사용할 데이터를 설정합니다.

 

@IsString()이 붙은 데이터는 String 타입이어야만 합니다.

 

@IsOptional()이 붙은 데이터는 필수 데이터가 아닙니다.

즉 DB에서 null인 상태로 존재할 수 있습니다.

npm i --save class-validator

덧붙여, 위 명령어를 이용해 class-validator를 설치해줘야 합니다.


import { Controller, Get, UseGuards, Body, Post } from '@nestjs/common';

import { UserService } from './user.service';
import { CreateUserDTO } from './dto/create-user.dto';
import { User } from './entities/user.entity';

// 해당 파일이 컨트롤러임을 지정함
// 컨트롤러에서 요청을 받을 때 /user경로를 기본 URL로 지정함
@Controller('user')
export class userController {
  constructor(private readonly userService: UserService) {}

  // POST 요청이 들어왔을 때 처리할 코드를 지정함
  @Post()
  createUser(@Body() user: CreateUserDTO) {
    console.log(user);
    return this.userService.create(user);
  }
}

위 코드는 src/user/user.controller.ts 파일의 코드입니다.

컨트롤러는 요청이 들어오면 그걸 처리해주는 역할을 합니다.

 

우리 프로그램에서는 유저 정보를 생성해달라는 요청이 들어오면

그 요청에 맞는 처리를 해주는 역할을 합니다.

 

위 코드는 /user URL로 POST 요청이 들어오면

user.service.ts 파일에 있는 create함를 실행해줍니다.


import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { CreateUserDTO } from './dto/create-user.dto';
import { User } from './entities/user.entity';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
  ) {}

  async create(user: CreateUserDTO) {
    await this.userRepository.save(user);
  }
}

이번엔 src/user/user.service.ts파일의 코드입니다.

 

create함수가 보이시나요?

typeorm에 들어있는 repository 모듈을 이용해

전달받은 유저 정보를 DB에 저장해줍니다.


import { Module } from '@nestjs/common';
import { userController } from './user.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { UserService } from './user.service';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [userController],
  providers: [UserService],
})
export class UserModule {}

src/user 경로의 파일들을 생성해줬으니

해당 경로에서 TypeORM을 사용할 수 있도록

user.module.ts파일을 작성해줍니다.


여기까지 NestJS에서 작성할 코드는 다 작성했습니다.

이제 포스트맨이나 웹에서 NestJS 서버에

유저 정보가 담긴 POST 요청을 보내면 DB에 유저 정보가 저장됩니다.

const userData = {username : "user1", password:1234, nickname:"tester"}

axios.post('http://localhost:8080', userData)
  .then((res)=>{console.log(res)})

리액트에서 axios로 POST요청을 하는 코드를 간단하게 작성하자면 위와 같습니다.

반응형

'코딩 > NestJS' 카테고리의 다른 글

아주 쉽게 NestJS 백엔드 서버 만들어보기  (1) 2023.10.02