IT/프로그래밍

[Typescript/Express] Typescript 를 익힐 겸 백엔드 프로젝트를 해보자! (3)

홀롤록 2021. 10. 16. 03:11
반응형

오늘은 어제 작업을 하다가 왜 안되는걸까?? 했던 부분을 작성하려고 한다.

 

상품등록 API 에 대해 관리자에서 작업을 하고 리스트 및 수정 기능에 대해 동작확인을 진행하고, 사용자 API 에 상품리스트 API 를 구현하던 중 쿼리는 비슷하게 구현해서 사용했어서 위화감을 느끼지 못하고 있다가, "설명을 빼먹었네~ 설명 컬럼도 조회해서 보여주자!" 라는 생각으로 조회쿼리에 설명 컬럼을 조회하도록 수정하였다.

 

이 때, 문제가 발생했다. 설명 컬럼(description) 이 조회가 안되는 것이다.

 

결론부터 얘기하면 TypeORM 에서 제공하는 관리자 API 쪽에서 DB 조회할 때 사용하던 Repository 파일 내에 있는@EntityRepository(Goods) 문을 제거하면서 원하는 동작을 했다. 하지만 정식 홈페이지와 구글링을 통해 본 내용들로 보면 내가 쓴 방법은 뭔가 달라서 잘못된 기분이 들었다. 이를 어떻게 수정하면 좋을까??

( CustomRepository 를 사용할 때에는 저 구문이 필요하다고 에러를 뱉어야 하는데, 난 에러는 커녕 너무 잘돌아갔다..)

 

https://charlesdepost.tistory.com/31

대체 왜?? 왜 난 달라!? 싶어서 보면.. 보통의 예제들과 정식 홈페이지에 나온 내용과 구성방식부터가 달라서 힘겨웠다..

 

EntityRepository() 와 관련하여 TypeORM github 에 작성된 내용을 참고하여 해결했다.
https://github.com/typeorm/typeorm/blob/master/docs/custom-repository.md#custom-repository-without-extends

 

GitHub - typeorm/typeorm: ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL

ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana, WebSQL databases. Works in NodeJS, Browser, Ionic, Cordova and Elect...

github.com

 

해당 내용을 통해 힌트를 얻었고, 기존 이랬던 코드에서 

export default class GoodsRepositoryImpl implements GoodsRepository {
  public async createGoods(goods: Goods) {
    const repository = getManager().getRepository(Goods);
    return await repository.save(goods);
  }

  searchGoods(params: GoodsSearchRequest): Promise<[Goods[], number]> {
    const repository = getManager().getRepository(Goods);
    const queryBuilder = repository.createQueryBuilder('goods')
    .select([
      'goods.id',
      'goods.name',
      'goods.price',
      'goods.is_show',
      'category.id',
      'category.name',
    ])
    .leftJoin('goods.category', 'category')
    .limit(params.getLimit())
    .offset(params.getOffset());

    return queryBuilder
      .disableEscaping()
      .getManyAndCount();
  }
  ...

정식 사용법을 살려

@EntityRepository()
export default class GoodsRepositoryImpl implements GoodsRepository {
  constructor(private manager: EntityManager) {

  }

  public async createGoods(goods: Goods) {
    return await this.manager.save(goods);
  }

  searchGoods(params: GoodsSearchRequest): Promise<[Goods[], number]> {
    const queryBuilder = this.manager.createQueryBuilder(Goods, 'goods')
    .select([
      'goods.id',
      'goods.name',
      'goods.price',
      'goods.is_show',
      'category.id',
      'category.name',
    ])
    .leftJoin('goods.category', 'category')
    .limit(params.getLimit())
    .offset(params.getOffset());

    return queryBuilder
      .disableEscaping()
      .getManyAndCount();
  }
  ...

변경했다. 물론 이 파일 말고 app-context-admin.js 를 변경하면서 Controller 단에서 호출될 때 private 변수에 service 객체를 가지고 있을 수 있도록 작업했다.

 

이 문제에 봉착한 이유는 유저와 어드민 로직을 한 곳에 두게 되면서 어떻게든 해보려고 하다보니 나온 결과이므로 유의했으면 좋겠다.

 

이렇게 TypeORM 에 대한 삽질을 마무리했고, 이제 다른 Repository 와 context 파일을 변경해야한다.. 너무나 멀다..
이렇게 작업을 하면서 알게 된 구성의 차이.. 크나 크고 할 게 너무 많다는게 느껴진다. 얼른 구성 빨리하고 주문 로직 만들고 싶다..

반응형