오늘은 어제 작업을 하다가 왜 안되는걸까?? 했던 부분을 작성하려고 한다.
상품등록 API 에 대해 관리자에서 작업을 하고 리스트 및 수정 기능에 대해 동작확인을 진행하고, 사용자 API 에 상품리스트 API 를 구현하던 중 쿼리는 비슷하게 구현해서 사용했어서 위화감을 느끼지 못하고 있다가, "설명을 빼먹었네~ 설명 컬럼도 조회해서 보여주자!" 라는 생각으로 조회쿼리에 설명 컬럼을 조회하도록 수정하였다.
이 때, 문제가 발생했다. 설명 컬럼(description) 이 조회가 안되는 것이다.
결론부터 얘기하면 TypeORM 에서 제공하는 관리자 API 쪽에서 DB 조회할 때 사용하던 Repository 파일 내에 있는@EntityRepository(Goods) 문을 제거하면서 원하는 동작을 했다. 하지만 정식 홈페이지와 구글링을 통해 본 내용들로 보면 내가 쓴 방법은 뭔가 달라서 잘못된 기분이 들었다. 이를 어떻게 수정하면 좋을까??
( CustomRepository 를 사용할 때에는 저 구문이 필요하다고 에러를 뱉어야 하는데, 난 에러는 커녕 너무 잘돌아갔다..)
대체 왜?? 왜 난 달라!? 싶어서 보면.. 보통의 예제들과 정식 홈페이지에 나온 내용과 구성방식부터가 달라서 힘겨웠다..
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 파일을 변경해야한다.. 너무나 멀다..
이렇게 작업을 하면서 알게 된 구성의 차이.. 크나 크고 할 게 너무 많다는게 느껴진다. 얼른 구성 빨리하고 주문 로직 만들고 싶다..
'IT > 프로그래밍' 카테고리의 다른 글
[Java/Hibernate] 검색을 자유롭게 하고싶은데.. 좋은 방법이 없을까? (0) | 2024.03.28 |
---|---|
SpringBootTest Could not resolve placeholder 'spring.profiles.active' 테스트 하게 해! 줘! (0) | 2022.10.28 |
[Typescript/Express] Typescript 를 익힐 겸 백엔드 프로젝트를 해보자! (2) (0) | 2021.10.12 |
[Typescript/Express] Typescript 를 익힐 겸 백엔드 프로젝트를 해보자! (1) (0) | 2021.09.13 |
[JAVA/JPA] JPA.. 이름만 들어봤다!! 이제라도 알자.. (0) | 2021.07.28 |