들어가며
NestJS와 PostgreSQL, TypeORM을 활용하여 프로덕트를 만들고 있습니다. TypeORM을 활용하여 IN Query를 구성하면서, 데이터를 특정 순서에 맞게 정렬해서 조회해야 하는 상황이었습니다. 어떻게 하면 데이터를 특정 조건에 맞게 순차 조회할 수 있을지 알아보다 커스텀 정렬에 대해 알 수 있었습니다. 커스텀 정렬을 활용한다면, 특정 순서에 맞게 정렬된 데이터를 조회할 수 있었습니다. 그럼 TypeORM에서 커스텀 정렬은 어떻게 구성할 수 있는지 알아보겠습니다.
array_position
array_position은 PostgreSQL에서 제공하는 내장 함수 중 하나입니다. array_position 함수는 아래와 같은 문법을 가집니다:
array_position(array, value)
여기서 array는 검색 대상 배열이며, value는 검색할 값을 나타냅니다. array_position 함수는 array의 첫 번째 원소부터 순차적으로 검색하며, 검색 대상 값이 발견되면 해당 위치를 반환합니다. 만약 배열에 검색 대상 값이 없다면 NULL을 반환합니다. 저는 array_position 함수를 활용하여 커스텀 정렬하여 데이터를 조회했습니다.
const queryBuilder = dataSource
.getRepository(Post)
.createQueryBuilder('posts')
.where('posts.id IN (:...postIds)', {
postIds: isPostIds,
})
.orderBy(
`array_position(ARRAY[${isPostIds}], posts.id::integer)`,
);
return await queryBuilder.getMany();
저의 경우엔, post 테이블에 있는 정보를 특정 순서에 맞게 가져오고 싶었습니다. 이를 위해 먼저 Where 조건문을 통해 isPostIds 배열에 담겨 있는 id값에 해당하는 데이터를 조회했습니다. 그리고 array_position 함수를 사용하여 isPostIds 배열의 순서대로 조회 결과를 정렬했습니다. value에 해당하는 값은 기준 컬럼명을 작성했고, 기준 컬럼명 옆에는 컬렴의 타입을 명시했습니다. 만약 정렬 값이 text라면, integer 대신 text를 작성하면 됩니다.
저는 postgresql을 사용했지만, 커스텀 정렬은 다른 DB에서도 가능합니다. MySQL은 FIELD, Oracle에서는 DECODE, CASE 등으로 가능합니다.
마치며
공부를 하며 그동안 아주 기초적인 것들을 제대로 공부하지 않았다는 것을 깨닫습니다. 좋은 기술을 배우는 것도 좋지만, 기술의 기반이 되는 기초적인 지식을 먼저 쌓는 것이 중요하다는 것을 다시금 깨달았습니다. 기초가 튼튼한 개발자가 되고 싶습니다.
출처
'Project > 서버 개발' 카테고리의 다른 글
[Project] 프로젝트 삽질기49 (feat 전략 패턴 활용) (0) | 2023.04.04 |
---|---|
[Project] 프로젝트 삽질기48 (feat 전략 패턴) (2) | 2023.03.29 |
[Project] 프로젝트 삽질기46 (feat Time Zone) (0) | 2023.02.19 |
[Project] 프로젝트 삽질기45 (feat Date) (1) | 2023.02.15 |
[Project] 프로젝트 삽질기44 (feat limit, take) (0) | 2023.01.31 |