nest #2 : entity, repository, service, eco

with-key·2022년 6월 19일
0

entity

graphQL의 @ObjectType 에서 병행해서 구현 할 수 있다. @ObjectType는 graphQL에서 schema 생성을 위해 필요한 것이고, @entity는 DB의 모델과 같아서 postgreSQL에 Entity와 같은 모양으로 table이 생성된다. app.modules.ts 에서 synchronize 동기화를 언제 할 것인지 설정 할 수 있다.

repository

repository란, Entity와 상호작용하는 것을 담당하는 개념이다.

service

db와 접근하는 파일이다.

DB와의 상호작용

  • Active Record
    패턴은 모델 내에서 데이터베이스에 액세스하는 접근 방식. 소규모 앱에서 단순하게 사용하는데 좋다.
  • Data Mapper
    모델 대신 리포지토리 내의 데이터베이스에 액세스하는 접근 방식. repository라는 별도의 클래스에서 모든 쿼리 메서드를 정의한다. 대규모 앱에서 유용하다.

Recap (Nest + GraphQL + MVC EcoSystem)

  1. app.module.tsentity 설정에 Store가 있다. 이것을 통해 Store에서 생성한 @Entity 가 DB에 생성된다.
{ //... 중략
  entities: [Store],
}
  1. store.module.ts파일, imports에서 TypeOrmModule.forFeature([Store])를 넣었다. 여기서 StoreEntity 파일에 있는 그것이다. forFeatureTypeOrmModule가 특정 feature를 import 할 수 있게 해준다. 이 경우 feature는 Store entity이다.

  2. resolver에서는 새로 생성한 StoreService를 construtor에 넣었다(inject). 이것이 제대로 작동하려면, store.module.ts에서 Provicer에 넣어야 한다. 그래야 class construtor에 inject할 수 있다. 그렇게 하고나면, resolver에서 service에 접근 할 수 있다. service에 접근한다는 것은 비즈니스 로직은 service에서 처리하고 resolver에서는 service에서 생성한 로직함수만 return 하겠다는 말이다.

    @Resolver() // Resolver란 마치 로직이다.
    export class StoreResolver {
      constructor(private readonly storeService: StoreService) {}
      
      @Query(() => [Store])
      getStore(): Promise<Store[]> {
        return this.storeService.getAll(); // service와 연결됨
      }
    
      @Mutation(() => Boolean)
      createStore(@Args() newStoreInfo: CreateStoreDto): boolean {
        return true;
      }
    }
  3. service에서는 여러 비즈니스 로직 함수들이 있다. 그 가운데 getAll(){ return this.store.find() }라는 함수가 있다. 여기서 store란 무엇일까? store란 store entity의 repository 이다. service에서 @InjectRepository(Store) 함으로써 Repository가 된다. 이때 인자는 @Entity 이어야만 한다.

    @Injectable()
    export class StoreService {
      construtor(
        @InjectRepository(Store)
         private readonly store: Repository<Store>,
      ){}
    
      getAll(): Promise<Store[]>{
        return this.store.find();
      }
    }

    이 설정을 하고나면, repository에서 쓸 수 있는 모든 옵션을 사용 할 수 있다. 옵션이란, DB에서 정보를 가져오는 함수(명령)를 의미한다.

profile
주니어 프론트엔드 개발자 입니다.

0개의 댓글