Repository 패턴에 대하여

지금까지는

Client - Service - DataBase

이런 식이였다면

Service에서 곧바로 접근하지 말고 중개자로 Repository를 넣자는 것이다.

또 중개자를 왜 넣냐 하는 생각이 들지만

이를 통한 이점으로는 Service가 여러가지가 생겨났을 때

이 중계자를 넣음으로써 서비스 간에 데이터 공유가 가능해지기 때문이다.

혹은 Data Source 가 여러가지로 분리가 된다면

이 중계자가 있음으로써 데이터 공유가 원할해질 수 있다.

` 데이터 베이스 중앙 통제실! `

cats.repository.ts 파일을 만들어 아래와 같이 작성한다.

import { HttpException } from '@nestjs/common';
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { Cat } from './cats.schema';
import { CatRequestDto } from './dto/cats.request.dto';

@Injectable()
export class CatsRepository {
  constructor(@InjectModel(Cat.name) private readonly catModel: Model<Cat>) {}

  async existsByEmail(email: string): Promise<boolean> {
    try {
      const result = await this.catModel.exists({ email });
      if (result) return true;
      else return false;
    }
    catch (error) {
      throw new HttpException('db error', 400);
    }
  }

  async create(cat: CatRequestDto): Promise<Cat> {
    return await this.catModel.create(cat);
  }
}

module에서 등록해주고

@Module({
  imports: [MongooseModule.forFeature([{name: Cat.name, schema: CatSchema}])],
  controllers: [CatsController],
  providers: [CatsService, CatsRepository],
  exports: [CatsService],
})

service에서 Model로 연결하던 부분을 Repository로 연결시켜준다.

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { Cat } from './cats.schema';
import { CatRequestDto } from './dto/cats.request.dto';
import * as bcrypt from 'bcrypt';
import { CatsRepository } from './cats.repository';

@Injectable()
export class CatsService {
  constructor(@InjectModel(Cat.name) private readonly catsRepository: CatsRepository) { }
  
  async signUp(body: CatRequestDto) {
    const { email, name, password } = body;

    const isCatExist = await this.catsRepository.existsByEmail(email);

    if (isCatExist) {
      throw new UnauthorizedException('해당하는 고양이는 이미 존재합니다.');
    }

    const hashedPassword = await bcrypt.hash(password, 10);

    const cat = await this.catsRepository.create({
      email,
      name,
      password: hashedPassword,
    });

    return cat.readOnlyData;
  }
}