본문 바로가기
backend/NestJS

[NestJS] NestJS 간단한 CRUD 구현하기(1)

by BK0625 2023. 5. 31.
반응형

https://bk0625.tistory.com/48

 

[NestJS] NestJS 프로젝트 시작하기

https://bk0625.tistory.com/3 [NestJS] NestJS란? 요즘 Node 진영에서 핫한 프레임워크인 NestJS에 대해 간략히 알아보겠다. NestJS는 Node.js에 기반을 둔 웹 API 프레임 워크로 IoC, DI, AOP와 같은 객체 지향 개념을

bk0625.tistory.com

https://bk0625.tistory.com/19

 

[NestJS] .env를 사용해서 MySQL 연동하기

일반적으로 데이터베이스를 연동할 때에 코드에 바로 데이터베이스 정보를 적지 않는다. 만약 하드코딩으로 백엔드 코드에 데이터베이스 정보를 집어넣고 실수로 깃허브에 커밋한다거나 유출

bk0625.tistory.com

 

프로젝트 처음 시작 및 데이터베이스 연동은 위 링크를 참조하길 바란다.

 

우선 데이터를 담을 entity를 만들어야 하니 Entity 폴더를 만들어준다.

 

 

그 안에 todo.Entity.ts 파일을 생성한 뒤 다음과 같이 작성한다.

 

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

@Entity('todo')
export class TodoEntity{
    @PrimaryGeneratedColumn('increment')
    id : number;

    @Column({length:100})
    todo : string;
}

@Entity 데코레이터를 달면 해당 클래스는 Entity로 인식이 된다. id 컬럼은 키 값으로 @PrimaryGeneratedColumn('increment') 데코레이터를 사용해 auto increment가 되도록 하였고 todo 컬럼은 string 타입으로 최대길이를 100으로 설정하였다.

 

이 해당 Entity를 app.module.ts에 있는 TypeOrmModule에 주입한다.

 

 

지금은 entity가 하나만 있어서 그냥 넣었지만 폴더 경로로 지정해서 해당 폴더에 있는 entity들을 한번에 주입할 수도 있으나 넘어가도록 하겠다. 이 후에 저 synchronize 옵션을 true로 바꿔 설정해주면 자동으로 데이터베이스에 테이블이 생성된다. (따라서 테이블을 생성할 때가 아니면 false로 놓는게 바람직하다.)

 

 

 

이렇게 entity로 데이터베이스에 테이블을 생성할 수 있다.

 

이제 repository를 만들어서 DB에 관한 연산을 진행해야한다. 이는 Repository 패턴으로 TypeORM을 이용한 하나의 패턴이다. 아무 repository가 아닌 해당 테이블에 관한 DB 연산을 하는 인스턴스를 받아야하기 때문에 service는 해당 repository를 가지고 있어야 하고 매번 생성하는 것이 아닌 nestjs 에 등록한 repository를 가져와야한다. repository도 service를 controller에 생성자를 통해 주입한 것처럼 똑같은 방식으로 주입해줄 수 있다. 여기서 사용되는게 싱글톤 방식의 DI인데 이건 나중에 포스팅하도록 하겠다.

 

먼저 app.service.ts로 이동해서 해당 코드를 적는다. 생성자를 통해 의존성을 주입하는 것이다.

 

  constructor(
    @InjectRepository(TodoEntity)
    private readonly todoRepository : Repository<TodoEntity>,
  ){}

 

 

예전에 프로젝트 진행했을 때는 복잡하게 custom repository를 만들어서 사용했었는데 이제는 @InjectRepository로 간단하게 repository를 만들 수 있는거 같다. 이렇게만 하면 nestjs에 해당 repository를 등록하지 않았기 때문에 에러가 난다.

 

 

 

따라서 app.module.ts로 이동해 해당 repository를 등록해주자.

 

 

    TypeOrmModule.forFeature([TodoEntity])

 

이걸 추가해주면 에러가 없어진다. 이제 간단한 쿼리를 날려보자

 

  async findAll(){
    return await this.todoRepository.find();
  }
 

 

app.service.ts에 간단한 쿼리를 작성한다. 현재 데이터베이스 테이블엔 임의로 가라데이터를 넣어놓은 상태이다.

 

  @Get('/findAll')
  findAll(){
    return this.appService.findAll();
  }

 

그 다음엔 app.controller.ts로 이동해 위와 같이 작성한다. 그럼 준비 끝!

 

 

 

성공적으로 데이터들을 가져오는 것을 확인할 수 있다.

 

 

공부하면서 정리한 내용입니다. 모든 지적 감사히 받겠습니다:)

반응형