1. 데이터베이스 쿼리 최적화
Rails 애플리케이션의 성능 병목 현상은 대부분 데이터베이스 쿼리에서 발생합니다.
-
N+1 쿼리 문제 해결:
includes,preload,eager_load를 사용하여 연관된 객체를 미리 로드함으로써 쿼리 수를 줄입니다. -
인덱스 활용: 자주 조회되는 컬럼에 인덱스를 추가하여 쿼리 속도를 향상시킵니다.
-
불필요한 데이터 로드 방지:
select메서드를 사용하여 필요한 컬럼만 선택적으로 로드합니다. -
쿼리 캐싱: Rails의 쿼리 캐싱 기능을 활용하여 동일한 쿼리가 반복될 때 데이터베이스 접근을 줄입니다.
2. 캐싱 전략 구현
캐싱은 애플리케이션의 응답 속도를 극적으로 개선할 수 있는 강력한 도구입니다.
-
페이지 캐싱: 전체 페이지의 HTML을 캐시하여 웹 서버에서 직접 서빙합니다. (Rails 4+에서는 액션 캐싱과 함께 Gem으로 분리)
-
액션 캐싱: 컨트롤러 액션의 결과물을 캐시하며, 필터 체인까지 실행됩니다.
-
프래그먼트 캐싱: 뷰의 특정 부분을 캐시하여 복잡한 뷰 렌더링 시간을 줄입니다.
cache헬퍼 메서드를 사용합니다. -
데이터 캐싱:
Rails.cache를 사용하여 특정 데이터나 계산 결과를 캐시합니다. Memcached나 Redis와 같은 외부 캐시 저장소를 활용하는 것이 일반적입니다.
3. 백그라운드 작업 및 비동기 처리
장시간 소요되는 작업(예: 이미지 처리, 이메일 발송, 복잡한 계산)은 사용자 요청을 블로킹하여 응답 지연을 유발합니다.
-
Sidekiq, Resque 등: 백그라운드 작업 큐 시스템을 활용하여 이러한 작업을 비동기적으로 처리합니다.
-
Active Job: Rails 4.2부터 도입된 Active Job은 다양한 백그라운드 어댑터(Sidekiq, Resque, Delayed Job 등)를 추상화하여 일관된 인터페이스를 제공합니다.
-
웹소켓(Action Cable): 실시간 통신이 필요한 경우 Action Cable을 사용하여 서버와 클라이언트 간의 양방향 통신을 구현합니다.
4. 코드 최적화 및 프로파일링
효율적인 코드 작성과 성능 병목 지점 식별이 중요합니다.
-
Ruby 버전 업그레이드: 최신 Ruby 버전은 이전 버전에 비해 성능이 크게 향상되는 경우가 많습니다.
-
Gemfile 최적화: 불필요한 Gem을 제거하고, 필요한 Gem의 최신 버전을 사용합니다.
-
프로파일링 도구:
Rack Mini Profiler,New Relic,Scout APM등을 사용하여 애플리케이션의 성능 병목 지점을 정확히 파악하고 개선합니다.