class ApplicationController < ActionController::Base
def current_user
User.find(session[:user_id])
end
end
이 함수는 지금 로그인한 유저 정보를 가져 옵니다. 더 자세히 말하자면, 세션에 들어있는 user_id
로 User 모델의 find
를 실행합니다. 이 함수는 한 리퀘스트동안 여러번 불려지고, DB또한 여러번 불려지게 됩니다. (이런 반복은 성능에 않좋은 영향을 미칩니다.) 이 문제는 인스턴스 변수에 쿼리결과를 캐쉬해서 해결할 수 있습니다.
@current_user ||= User.find(session[:user_id])
OR연산에 주목하세요. 처음 이 함수가 불려질때 @current_user
변수는 nil
값을 가지고있고 DB에도 요청합니다. 이후에 이 함수가 불려질 때,@current_user
는 유저정보를 가지고 있으므로 DB요청도 없습니다. 이 수정은 (수행속도면에서) 성능을 향상시킵니다.
class ApplicationController < ActionController::Base
def current_user
@current_user ||= User.find(session[:user_id])
end
end
인스턴스 변수를 사용하도록 수정된 코드