graphQL의 @ObjectType
에서 병행해서 구현 할 수 있다. @ObjectType
는 graphQL에서 schema 생성을 위해 필요한 것이고, @entity
는 DB의 모델과 같아서 postgreSQL에 Entity와 같은 모양으로 table이 생성된다. app.modules.ts
에서 synchronize
동기화를 언제 할 것인지 설정 할 수 있다.
repository
란, Entity
와 상호작용하는 것을 담당하는 개념이다.
db와 접근하는 파일이다.
repository
라는 별도의 클래스에서 모든 쿼리 메서드를 정의한다. 대규모 앱에서 유용하다.app.module.ts
의 entity
설정에 Store
가 있다. 이것을 통해 Store에서 생성한 @Entity
가 DB에 생성된다. { //... 중략
entities: [Store],
}
store.module.ts
파일, imports에서 TypeOrmModule.forFeature([Store])
를 넣었다. 여기서 Store
는 Entity
파일에 있는 그것이다. forFeature
는 TypeOrmModule
가 특정 feature를 import 할 수 있게 해준다. 이 경우 feature는 Store entity이다.
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;
}
}
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에서 정보를 가져오는 함수(명령)를 의미한다.