TypeORM - IN

김세겸·2023년 5월 25일
0

TypeORM

목록 보기
5/5
post-thumbnail

현재 진행중인 프로젝트에서 기존에는 가게이름을 검색할 때 필터로 지역은 하나만 선택 가능하게 enum 타입으로 인자를 받아왔지만 팀원의 의견을 통해 여러 지역에서 검색이 가능하게 기능을 수정 해야 되서 enum타입이 아닌 string로 인자를 받아 split후 in절로 검색을 하기로 했다.

// 기존 코드
const result = await this.storeRepository.createQueryBuilder('store')
        .leftJoinAndSelect('store.store_type', 'store_type')
        .where('store.name like :name', {name: `%${dto.storename ?? ''}%`})
        .andWhere('store.city_name like :city_name', {city_name: `%${dto.region ?? ''}%`})
        .getMany()

//수정후 코드
const result = await this.storeRepository.createQueryBuilder('store')
        .leftJoinAndSelect('store.store_type', 'store_type')
        .where('store.name like :name', {name: `%${dto.storename ?? ''}%`})
        .andWhere('store.city_name IN (:city_name)', {city_name: regionNames})
        .getMany()

수정을 하고 테스트를 하는데 자꾸 빈배열이 return 값으로 넘어왔다. 왜 그런가 확인을 하니 IN절은 like절과 다르게 완전히 같은 값이어야 가져오기 때문이었다. 그래서 DB를 확인해 보니 내가 인자로 받아오는 값은 '수성구' 였는데 DB에 저장된 값은 '대구 수성구' 여서 못가져 오는 것이었다...
그래서 DB를 수정하기보다 값을 조회 할 때 인자의 값을 바꾸어 주는 로직을 추가 하였다.

const storeRegion = dto.region;
        const regionNames = storeRegion.split(',');
        regionNames.forEach((name, idx) => {
            regionNames[idx] = '대구 ' + name
        })

이 후 확인하니 정상적으로 값을 가져오는 것을 확인하였다.

0개의 댓글