[Typescript/Express] Typescript 를 익힐 겸 백엔드 프로젝트를 해보자...

[Typescript/Express] Typescript 를 익힐 겸 백엔드 프로젝트를 해보자...

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

상품등록 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

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

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 파일을 변경해야한다.. 너무나 멀다..

이렇게 작업을 하면서 알게 된 구성의 차이.. 크나 크고 할 게 너무 많다는게 느껴진다. 얼른 구성 빨리하고 주문 로직 만들고 싶다..

from http://sys970717.tistory.com/22 by ccl(S) rewrite - 2021-10-16 03:27:08