Repository Pattern

2022. 9. 17. 16:42Nest.js

Service와 DB 사이에 중개자 역할을 하는 패턴

Service가 다수일 경우 그 사이에서 일어나는 순환참조 문제(해결할 수 있으나 최선은 아님)를 해소하고

Service 레이어에서  데이터의 출처와 관계없이 동일한 방식으로 DB에 접근할 수 있다. ex) DB가 다수일 경우 각 DB에 접근하는 쿼리가 다름. Repository 패턴을 적용하므로써 이를 해결할 수 있다. 

가령, DB를 MongoDB에서 MySQL로 변경할 경우 Repository 패턴을 적용하면 Repository의 코드만 수정하면 되지만, Repository를 두지 않는 경우 각 Service의 코드를 MySQL에 맞게 수정해야한다.

출처: 탄탄한 백엔드 NestJS(윤상석)

 //cats.service.ts
 //Service에 Repository 의존성 주입
export class CatsService {
  constructor(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;
  }
  }
  
  
  //cats.repository.ts
  @Injectable()
export class CatsRepository {
    constructor(@InjectModel(Cat.name) private readonly catModel: Model<Cat>) {}

이처럼 Service와 DB가 직접 접근하는 것이 아니라 Repository라는 중개업자를 사이에둔다.

'Nest.js' 카테고리의 다른 글

예외처리  (0) 2022.09.06
미들웨어  (0) 2022.09.06
Module / 캡슐화  (0) 2022.09.04
Providers/ DI  (0) 2022.09.04
Controller  (0) 2022.09.04