where 1 = 1이 나쁜게 아니다

YI Eun Gook·2020년 4월 19일
0

1줄 요약: limit를 쓰세요

이제 저도 가끔? 질문을 받고 답변을 해주는 사람이 되었습니다. (머쓱)
하여 최근 고민이 생겼습니다.

”where 1 = 1을 왜 쓰면 안 되나요?”
— 에.. 그건 말이죠.. 어.. 음.. 왜 일까요?;;; ㅎㅎㅎㅎㅎㅎ

어떻게 잘 설명했던 것 같은데요;;;
이 자리에서 좀 길게 풀어서 설명해볼까 합니다.


1. 일단 성능 때문은 아닙니다.

불필요한 조건이 성능을 떨어뜨린다는..
제 생각에 이건 아닌 것 같습니다.

정말로 성능을 떨어뜨린다면
정말 얼마나 떨어뜨리는지 측정이 필요할 것 같은데요

겨우 이 조건으로는 유의미한 차이가 발생하지 않고,
이 정도를 최적화 (랄까 bypass) 해주지 못 할 옵티마이저들 또한 아니라고 생각합니다.


2. where 1 = 1 왜 쓰나요?

55도발 왜 쓰냐고
문자열 다루기는 생각보다 훨씬, 훨씬! 더 어렵고 중요한 문제입니다.
예를 들면 URL 쿼리 스트링 파싱하기/만들기가 있고요,
여기서 더 깊게 간다면 컴파일러까지 갈 수 있습니다.

그렇기 때문에 (그렇기 때문에!) 동적 sql문을 만드는 과정에서
where 1 = 1을 쓰게 됩니다.

그러니까, 진짜 문제는 MyBatis 등의 sql 빌더를 쓰지 않는다는 겁니다.
where 1 = 1이 아니고요

검증된 도구를 사용하면 안전하고, 빠르고, 보편적인 개발을 할 수 있습니다.
검증된 도구를 사용합시다.
(<where>랑 <if> 짱이라구요 츄라이 츄라이)

(게다가 여러 검증된 도구는 당신이 생각하는 것 이상으로 많은 일을 몰래몰래 처리해 줍니다. 심지어 당신의 서비스가 멀쩡히 잘 돌아가는게 다 검증된 도구 덕분일 수도 있습니다!)


3. 그러니까, where 1 = 1이 나쁜게 아닙니다.

사실은요
select * from user where status = 100
이게 정말 나쁜 쿼리입니다.
where 1 = 1이 없지만 아주 나쁜 쿼리입니다.
느낌이 오시겠지만.. 이 쿼리는 결과가 얼마나 클지

  1. 쿼리를 읽어보는 시점에서는 상상할 수 없고
    count(*)를 한 번 해봐야 알 수 있을 것 같습니다.

  2. 쿼리를 작성하는 시점에서도 상상할 수 없습니다.
    user 테이블이 앞으로 얼마나 더 커질지 지금은 모릅니다.

진짜 주의해야 하는건 따로 있는거죠!


정리하면요

모든 쿼리문에는 반드시 limit가 있어야 합니다.

where 1 = 1이 없다고 해서, 좋은 쿼리가 아닙니다.

그리고 sql 빌더를 쓰세요!

읽어주셔서 감사해요!

profile
= v =?;;

1개의 댓글