당신의 WordPress 사이트가 메모리를 새고 있습니다 — 이를 멈추는 방법
Source: Dev.to
위에 제공된 링크만으로는 번역할 실제 본문 내용이 포함되어 있지 않습니다. 번역을 원하시는 전체 텍스트(본문, 코드 블록, 이미지 캡션 등)를 제공해 주시면, 요청하신 대로 소스 링크는 그대로 두고 한국어로 번역해 드리겠습니다.
페이지 로드의 숨겨진 비용
방문자가 페이지를 로드하면 WordPress는 백그라운드에서 많은 작업을 수행합니다:
- PHP가 시작되고 모든 WordPress 핵심 파일을 로드합니다.
- 모든 활성 플러그인이 로드됩니다 — 해당 페이지에 필요하지 않더라도.
- 테마가 로드됩니다.
- WordPress가 일련의 데이터베이스 쿼리를 실행합니다.
- 모든 훅과 필터가 작동합니다.
- 페이지가 조립되어 브라우저로 전송됩니다.
각 단계마다 메모리와 시간이 소모됩니다. 플러그인이 많을수록 오버헤드가 커집니다.
PHP에는 메모리 제한이 있습니다(보통 128 MB 또는 256 MB). 이를 초과하면 다음과 같은 치명적인 오류가 발생합니다:
Fatal error: Allowed memory size of 134217728 bytes exhausted
제한 이하라 하더라도, 메모리를 100 MB 사용하는 페이지는 30 MB 사용하는 페이지보다 눈에 띄게 느리게 느껴집니다.
가장 많은 메모리를 사용하는 것은 무엇인가요?
- Page builders (Elementor, Divi, WPBakery) – 요청당 50–80 MB.
- WooCommerce 대규모 제품 카탈로그와 함께.
- 필요하지 않은 큰 라이브러리를 로드하는 플러그인.
- 잘못 작성된 커스텀 코드.
데이터베이스 팽창
WordPress는 거의 모든 것을 데이터베이스에 저장합니다: 게시물, 설정, 사용자 정보, 플러그인 데이터. 빠른 사이트는 페이지당 20–30개의 쿼리를 실행할 수 있지만, 최적화가 잘 안 된 사이트는 단일 요청에 500개 이상의 쿼리를 실행할 수 있습니다.
과도한 쿼리의 일반적인 원인:
- 최적화되지 않은 플러그인.
- 같은 데이터를 반복적으로 조회하는 테마.
- 효율적이지 않은 커스텀 코드.
- 겹치는 작업을 수행하는 플러그인이 너무 많음.
데이터베이스가 커지는 이유
- 게시물 리비전 – 편집할 때마다 새로운 행이 생성됩니다. 1만 개 이상의 리비전이 누적될 수 있습니다.
- 고아 데이터 – 게시물이나 플러그인을 삭제하면 존재하지 않는 객체를 참조하는 행이 남을 수 있습니다.
- 오래된 트랜지언트 – 일부 플러그인은 만료되지 않거나 정리되지 않는 트랜지언트를 생성합니다.
- 자동 초안 및 휴지통 – 항목이 최대 30일 동안 데이터베이스에 남아 있습니다.
- 고아 크론 작업 – 플러그인을 제거하면 해당 플러그인의 예약 작업이 남아, 더 이상 존재하지 않는 코드를 실행하려 시도할 수 있습니다.
고아된 크론 작업
WordPress의 스케줄링 시스템(wp‑cron)은 예약된 게시물 발행, 이메일 전송, 데이터 정리와 같은 백그라운드 작업을 실행합니다. 크론 작업을 등록한 플러그인이 삭제되면 해당 작업이 무기한 남아 자원을 낭비하고 때때로 오류를 일으킬 수 있습니다. 몇 년 전 제거된 플러그인에서 100개가 넘는 고아 크론 엔트리가 발견된 사이트도 있습니다.
가시성 확보 방법
볼 수 없는 것은 고칠 수 없습니다. Query Monitor와 같은 도구는 깊이 있는 디버깅에 좋지만, 더 간단하고 올인원인 무료 플러그인 Hungry Resource Monitor가 있습니다. 이 플러그인은 다음을 제공합니다:
- 상위 리소스 사용자를 한눈에 볼 수 있는 대시보드.
- 리비전, 트랜지언트, 고아 데이터 등을 원클릭으로 정리.
- 모든 크론 작업 목록과 고아 작업을 강조 표시.
- 사용되지 않는 플러그인 및 테마 감지.
- 선택 가능한 주간 이메일 보고서.
Full disclosure: 이 플러그인은 본 글의 저자가 만들었지만 무료이며 로컬에서 작동합니다—데이터가 외부로 전송되지 않습니다.
오늘 바로 실천할 수 있는 단계
게시물 리비전 제한
wp-config.php에 다음 줄을 추가하세요:
define('WP_POST_REVISIONS', 5); // Keep only 5 revisions per post
오래된 리비전은 WP‑CLI 또는 전용 정리 플러그인으로 정리할 수도 있습니다.
사용하지 않는 플러그인 및 테마 제거
비활성화된 플러그인은 완전히 삭제하지 않는 한 모든 페이지 요청 시 여전히 로드됩니다. 사용하지 않는 코드를 제거하면 메모리 사용량과 잠재적인 보안 위험을 줄일 수 있습니다.
자동 로드 옵션 감사
워드프레스는 모든 요청 시 autoload = 'yes' 로 표시된 옵션을 모두 로드합니다. 큰 자동 로드 항목은 사이트 속도를 크게 저하시킬 수 있습니다. 다음 쿼리를 실행하여 가장 큰 항목을 확인하세요:
SELECT option_name, LENGTH(option_value) AS size
FROM wp_options
WHERE autoload = 'yes'
ORDER BY size DESC
LIMIT 20;
불필요한 옵션은 autoload = 'no' 로 설정하거나 완전히 정리하는 것을 고려하세요.
정기적인 정리 일정 잡기
플러그인이나 WP‑CLI를 사용하든, (예: 주간) 정기적인 루틴을 설정하세요:
- 오래된 리비전 삭제.
- 오래된 트랜지언트 만료 또는 삭제.
- 고아가 된 postmeta 및 기타 사용되지 않는 데이터 제거.
- 고아가 된 크론 작업 정리.
Bottom line
WordPress 성능은 단일 마법 같은 해결책에 관한 것이 아닙니다. 리소스가 어디에서 소비되는지 가시성을 확보하고, 불가피한 잡동사니를 정기적으로 정리하는 것이 핵심입니다. 먼저 Hungry Resource Monitor를 설치하고, 대시보드를 검토한 뒤 위의 실용적인 단계를 적용하세요. 사이트가 메모리 “출혈”에서 멈추고 훨씬 부드럽게 동작할 것입니다.