오늘은 filter()
와 exists()
의 차이에 대해서 포스팅을 해보려한다.
# xxx 가 참일 경우
if xxx: # = True
return True
else:
return False
> True
# xxx 가 거짓일 경우
if xxx: # = False
return True
else:
return False
-> False
xxx의 내용이 참일 경우 바로 if 문의 return 값을 반환해주게 되는데, 나는 이 때 잊고 있던 사실이 있었다.
bool(0) # False
bool([]) # False
bool({}) # False
bool(()) # False
bool('') # False
bool(1) # True
bool('b') # True
if xxx문에서 xxx 가 빈 값
이나 0
인지(False)
아닌지(not False = True)
를 보면 되는데, exists()
를 사용하여 값의 유무를 확인해야만 참
과 거짓
을 판별할 수 있다는 착각을 하고 있었다.
이것을 보고나니 문득 그렇다면 get
이나 filter
만 사용하더라도 True
와 False
를 구할 수 있을텐데, exists()
를 사용하는 이유가 무엇인가? 하는 의문이 생겼다.
그 이유로는 결과적으로 봤을 때
연산 속도
라고 볼 수 있는 것 같다.
filter
에는 lazy evaluation
, 즉 찾은 값을 찾는다고 바로 db에 전달하지 않고 가지고 있다가 필요한 순간에 전달하는 특성이 있는데 , exists
는 filter
뒤에 사용하기 때문에 같은 상황이 아닌가? 싶지만 그 과정에서 조금 다른 게 아닐까 싶다.
초등학교 체육대회를 예를 들어 생각해 보자면 filter
의 경우엔 조건에 충족하는 사람을 찾으면 데리고 오는 것과, 조건에 충족하는 사람을 발견하면 바로 돌아오는 것 중 어느 상황이 더 빠를지 생각하면 쉬운 것 같다.
때문에 filter
는 해당 쿼리셋을 불러오지만 exists
는 True와 False
만 가져오게 된다.
물론 개인이 이해한 바를 바탕으로 작성하였기 때문에 혹 오류가 있다면 누구든 언제든 알려주시길 바랍니다.