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;
}
}