[RoR] ActiveRecord 의 count, length, size
오늘의 포스팅 내용은 "ActiveRecord의 length, count, size 의 차이를 간략히 알아보자" 이다.
Rails 로 기능 개발을 하면서 ActiveRecord Relation 의 Element 의 개수를 확인하기 위해 ActiveRecord 의 length, count, size 를 사용할 때가 있다. 우리는 다양한 방법으로 개수를 확인할 수 있지만 length, count, size 에는 조금씩 차이가 있으니 알고 사용하면 더 도움이 된다.
count
count 는 ActiveRecord Relation 의 Element 의 수를 확인하기 위해서 SQL query 를 실행한다. 호출 시점에 Database 의 정확한 수를 확인할 수 있다는 점이 장점이지만 상황에 따라서 불필요하게 조회 쿼리가 한번 더 호출된다.
# 전체 사용자를 조회해서 메모리에 load 한다.
users = Accounts::User.all.load
# 전체 사용자의 수를 확인한다.
users.count
--- 실행 SQL ---
SELECT COUNT(*) FROM `users`
--- 실행결과 ---
32
length
length 는 메모리에 load 되어 있는 ActiveRecord Relation 의 Element 수를 반환한다. 불필요하게 조회 쿼리를 다시 호출하지 않는다는 장점이 있지만 load 된 이후에 추가된 데이터가 있을 경우 반영되지 않기 때문에 값이 부정확할 수 있다.
# 전체 사용자를 조회해서 메모리에 load 한다.
users = Accounts::User.all.load
# users load 후에 신규 데이터 추가
Accounts::User.create(name: 'new_user_after_load')
# 전체 사용자의 수를 확인한다.
users.length
--- 실행 SQL ---
없음
--- 실행결과 ---
32
# count 로 DB 의 사용자 수를 확인한다.
users.count
--- 실행 SQL ---
SELECT COUNT(*) FROM `users`
--- 실행결과 ---
33
size
size 는 위에서 확인한 length 와 count 의 조합으로 사용된다. 즉 size 를 호출했을때 이미 메모리에 load 되어 있다면 length 가 동작할 것이고, 그렇지 않다면 count 가 호출될 것이다. 다음은 ActiveRecord Relation 의 size 함수의 내부 정의이다.
module ActiveRecord
class Relation
...
# Returns size of the records.
def size
loaded? ? @records.length : count(:all)
end
...
일반적으로 size 를 이용하면 여러 가지 상황에 대한 고려를 크게 하지 않아도 되기 때문에 유용하다고 본다.
오늘은 여기까지~
누군가에게 도움이 되었길 바라면서 오늘의 포스팅 끝~