[코팩] NestJs Repository 주입하기

Seong Hyeon Kim·2024년 2월 22일
0

NestJs

목록 보기
10/14

1.Repository 설명

NestJS에서 Repository는 데이터베이스 작업을 추상화하는데 사용되는 중요한 개념 중 하나입니다.

Repository는 일반적으로 엔터티(데이터 모델)와 관련된 데이터베이스 작업을 수행하는 메서드를 제공해서 데이터베이스에 대한 CRUD(Create, Read, Update, Delete) 작업을 쉽게 수행할 수 있도록 해줍니다.

2.세팅

2-1

우선 사용하고자 하는 모듈에 들어옵니다. 현재의 경우 post 관련 작업을 하고있기 때문에 posts 모듈로 들어줍니다.

그리고 다음과 같이 코드를 변경해줍니다.

posts\posts.module.ts

import { Module } from '@nestjs/common';
import { PostsService } from './posts.service';
import { PostsController } from './posts.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PostsModel } from './entities/posts.entity';

@Module({
  imports: [
    TypeOrmModule.forFeature([
      PostsModel,
    ])
  ],
  controllers: [PostsController],
  providers: [PostsService],
})
export class PostsModule {}

사용된 코드에 대해 설명하자면 orm 을 세팅하기위해서 사용했었던 forRoot 와 달리 이번에는 forFeature 를 사용했는데요 차이점은 다음과 같습니다.

  • forRoot : type orm 에 연결을 설정할때 사용되는 클래스 입니다.
  • forFeature : 모델에 해당되는 레포지토리를 주입하는 용도로 사용되는 클래스입니다.

이부분은 중요해서 그냥 외워야하는 부분이고 네이밍 같은경우는 NestJs 팀에서 저렇게 지정해서 사용됩니다.


2-2

1번 세팅이 끝나면 서비스 파일로 와서 constructor 를 한개 만들어서 postRepository 를 주입시켜 줍니다.

@Injectable()
export class PostsService {
  constructor(
    @InjectRepository(PostsModel)
  	private readonly postRepository: Repository<PostsModel>
  )
  
  
  getAllPosts() {
    return posts;
  }

  getPostById(id: number) {
    const post = posts.find((post) => post.id === +id);

    if (!post) {
      throw new NotFoundException();
    } else {
      return post;
    }
  }

이때 postRepository Generic 값을 받게 되는데 이게 어떤 모델의 레포지토리인지를 정의하기위해 PostsModel 를 입력해주면 됩니다.

그리고 레포지토리 같은 경우는 레포지토리 타입만 지정해준다고 인젝트가 되는게 아닌데요

IOC 컨테이너에서 각각의 프로바이더들을 생성을 해서 Dependency Injection 즉 주입을 해주었습니다. 레포같은경우는 조금 특수한 경우라서 애노테이션을 한번 더 작성해줘야합니다.

그래서 추가로 @InjectRepository(PostsModel) 까지 작성을 해줘야 합니다.

정리하자면
private readonly postRepository: Repository<PostsModel> 이 한줄의 의미는
constructor 에 파라미터를 하나 생성해주었고, 파라미터 이름은 postRepository 입니다. 그리고 type같은 경우는 repository type 이고, PostsModel을 다루는 레포지토리를 선언한것이라고 생각해주면 되겠습니다.

그리고 @InjectRepository(PostsModel) 이 한줄의 의미는
InjectRepository 라는 annotation 을 하나 추가하고 PostsModel 을 주입할것이다 라는 목적으로 작성된 부분이라고 생각하면 되겠습니다.

이제 앞으로 모델을 사용할때마다 이렇게 정확한 패턴대로 이 모델과 관련된 기능들을 다룰 수 있는 레포지토리를 주입받을수 있는 것입니다.


profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 백엔드 개발자

0개의 댓글