2021. 11. 4. 12:03ㆍBackend Development/Database
MySQL에서 WHERE IN
구문을 사용할 때 빈 배열을 전달하면 문법 오류가 발생하는 문제를 겪은 적이 있나요? 특히, JavaScript나 TypeORM을 사용할 때 이런 문제가 발생할 수 있습니다. 이 글에서는 빈 배열을 처리할 때 발생하는 오류를 해결하는 방법과, 더 효율적인 방식으로 쿼리를 작성하는 방법을 설명하겠습니다. 이 문제는 GitHub의 TypeORM Issue #2195에서 다뤄졌던 내용이기도 합니다.
1. 문제 설명: 빈 배열을 WHERE IN
에 전달할 때 발생하는 오류
빈 배열을 WHERE IN
구문에 전달하면, MySQL은 문법 오류를 발생시킵니다. 예를 들어, 다음과 같은 쿼리를 생각해봅시다:
async function getUsers(userIds: string[]) {
const users = await this.userModel
.createQueryBuilder()
.where('id IN (:userIds)', { userIds });
}
위 코드에서 userIds
가 빈 배열인 경우, 쿼리는 WHERE IN ()
형태로 변환되며, MySQL은 이를 유효한 문법으로 인식하지 못합니다. 그 결과, SQL 문법 오류가 발생하게 됩니다.
2. 오류를 해결하는 방법
이 문제를 해결하기 위한 가장 간단한 방법은 빈 배열을 처리하는 조건을 추가하는 것입니다. 빈 배열이 전달될 경우, IN ()
구문이 아니라 NULL
값으로 대체하여 쿼리를 실행할 수 있습니다.
해결 방법
async function getUsers(userIds: string[]) {
// userIds가 빈 배열일 경우 null을 추가하여 처리
const users = await this.userModel
.createQueryBuilder()
.where('id IN (:userIds)', { userIds: userIds.length ? userIds : [null] });
}
설명
userIds.length ? userIds : [null]
: 이 조건은userIds
배열이 비어 있는지 확인합니다. 만약 비어 있으면null
을 배열에 추가하여 쿼리를 실행합니다. 이렇게 하면 MySQL에서WHERE IN
구문이 정상적으로 처리됩니다.- 빈 배열이 아닌 경우는 정상적으로
userIds
배열을 전달하여 쿼리가 실행됩니다.
3. 코드 최적화 및 팁
이 문제를 해결하기 위해 추가적인 최적화 및 권장사항을 고려할 수 있습니다:
3.1. 빈 배열을 처리하는 방법에 대한 명확한 확인
앞서 언급한 조건문을 사용해 userIds
가 빈 배열일 경우 null
을 추가하는 방식은 좋지만, 일부 상황에서는 null
대신 false
나 0
등 다른 값을 사용하고 싶을 수도 있습니다. 예를 들어, userIds
가 빈 배열일 경우 전체 데이터를 반환하는 방식으로 동작할 수도 있습니다.
async function getUsers(userIds: string[]) {
const users = await this.userModel
.createQueryBuilder()
.where('id IN (:userIds)', { userIds: userIds.length ? userIds : [0] });
}
이 방법은 쿼리의 목적에 따라 더 적합할 수 있습니다. 빈 배열이 아닌 경우는 정상적으로 userIds
배열을 전달하여 쿼리가 실행됩니다.
3.2. SQL 쿼리 최적화
빈 배열을 처리할 때마다 NULL
또는 0
을 추가하는 방식은 효과적이지만, 쿼리 성능 측면에서 최적화할 필요가 있을 수 있습니다. 예를 들어, 너무 많은 조건을 IN
구문에 넣으면 성능 저하를 유발할 수 있습니다. 이 경우 서브쿼리나 조인을 사용하는 방법도 고려해볼 수 있습니다.
4. 결론: MySQL에서 빈 배열 처리 방법
MySQL에서 WHERE IN
구문에 빈 배열을 전달할 때 문법 오류를 방지하는 방법은 간단합니다. 빈 배열일 경우 null
이나 0
을 배열에 추가하여 쿼리를 실행하도록 하는 조건을 추가하면 됩니다. 이를 통해 쿼리가 정상적으로 작동하며, 추가적인 성능 최적화나 요구 사항에 맞게 조건을 조정할 수 있습니다.
개발하면서 이런 작은 오류들을 처리할 때, 항상 코드의 예외 상황을 고려하는 습관을 기르는 것이 중요합니다. 매일의 작은 고민들이 더 나은 코드를 만드는 데 도움이 될 것입니다.
이 글을 통해 여러분도 비슷한 문제를 쉽게 해결할 수 있기를 바랍니다. 질문이나 의견이 있으면 댓글로 남겨 주세요! 😊
'Backend Development > Database' 카테고리의 다른 글
RDB vs NoSQL: 무엇이 더 나을까? (0) | 2025.04.08 |
---|