프로그래밍(Web)/Javascript(TS,Node)

[바미] Typescript-restful-starter - services에 있는 코드와 repository에 있는 코드의 차이점에 대해 알아보자.

Bami 2020. 12. 22. 17:21
728x90
반응형

이 부분에 대해 궁금하여 물어본 내용을 답변을 받아 적었습니다.

Sample.repository.ts

import { EntityRepository, Repository } from "typeorm";
import { Sample } from "../models";

@EntityRepository(Sample)
export class SampleRepository extends Repository<Sample> {

public bulkCreate(Samples: Sample[]): Promise<any> {
return this.manager.createQueryBuilder().insert().into(Sample).values(Samples).execute();
}

public async removeById(id: number): Promise<Sample> {
const itemToRemove: Sample = await this.findOne({id});
return this.manager.remove(itemToRemove);
}

public findByText(text: string): Promise<Sample[]> {
return this.manager.find(Sample, {where: {text}});
}

public findOneById(id: number): Promise<Sample> {
return this.manager.findOne(Sample, {where: {id}});
}

Sample.service.ts

import { getCustomRepository } from "typeorm";
import { Sample } from "../models";
import { SampleRepository } from "../repository";

export class SampleService {

  public findByText(text: string): Promise<Sample[]> {
  return getCustomRepository(SampleRepository).findByText(text);
  }

  public bulkCreate(Samples: Sample[]): Promise<Sample[]> {
  return getCustomRepository(SampleRepository).bulkCreate(Samples);
  }

  public findOneById(id: number): Promise<Sample> {
  return getCustomRepository(SampleRepository).findOneById(id);
  }

  public find(): Promise<Sample[]> {
  return getCustomRepository(SampleRepository).find();
  }


  public remove(sample: Sample): Promise<Sample> {
  return getCustomRepository(SampleRepository).remove(sample);
  }

  public removeById(id: number): Promise<Sample> {
  return getCustomRepository(SampleRepository).removeById(id);
  }

  public save(sample: Sample): Promise<Sample> {
  return getCustomRepository(SampleRepository).save(sample);
  }
}
  • A

    제가 이해하고 있는 바는 service layer 에는 비지니스 로직이 들어가고 
    repository layer 에는 ORM을 활용한 Query문이 들어간다는 것입니다.
    예를 들어 영화 예매시스템을 만든다고 했을때 단순히 한 repository 에 해당 Query가 실행 되는 것이 아니라
    잔액 확인, 포인트 차감, 좌석 확인, 회원 확인등 다수의 repository + 다양한 비지니스 로직이 필요합니다.
    이럴 경우 service layer = repository layer 일 경우는 비지니스 로직과 ORM 로직이 섞이고 
    다른 비지니스 로직에서 ORM 을 재사용하기 어렵기 때문에
    이러한 비지니스 로직은 service layer에 작성하고, 
    세세한 ORM query는 repository layer 에 추가 되는 걸로 알고 있습니다.
  • A

    repository는 기술적인 영역을 추상화하는데 사용합니다.
    위에서는 manager를 통해 sql을 실행하는 역할을 하고 있네요. 
    만약에 sql을 실행하는 모듈이 바뀌거나 sql이 아니라 네트워크로 바뀌더라도
    repository 구현만 변경하는 식으로 결합도를 낮출 수 있습니다.
    여기서 서비스는 사실상 dao나 다름없는 역할을 하고 있는 것으로 보여지네요.
    특별한 기능이 없어서 그런 것일수도 있구요.
728x90
반응형