* 이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
(워드프레스 해부 ⑩) 옵션
사이트 주소, 블로그 제목, 활성 플러그인 목록, 퍼머링크 구조… 이런 사이트 전역 설정은 전부 wp_options 한 테이블에 산다. 구조는 option_name, option_value, 그리고 결정적인 autoload.
autoload='yes'인 옵션은 모든 페이지 로드마다 한꺼번에 불러와진다(한 번의 쿼리로 다 읽어 캐시). siteurl·blogname처럼 매번 필요한 건 이래야 빠르다. 문제는 여기가 은근히 부풀어 오른다는 거다. 삭제한 플러그인이 남긴 찌꺼기, 만료 안 된 거대한 트랜지언트가 autoload로 잡혀 있으면, 방문자가 아무 페이지나 열 때마다 그 쓸데없는 수백 KB를 매번 읽는다. 사이트가 이유 없이 느릴 때 자주 나오는 범인이다.
트랜지언트도 여기 산다. _transient_로 시작하는 옵션인데, 만료 시간이 있는 임시 캐시다. “이 계산 결과를 1시간만 저장해” 같은 용도. 잘 쓰면 성능에 좋지만, 만료 관리가 안 되면 이것도 쌓인다.
직접 해보기
# autoload 되는 옵션들의 총 크기 — 이게 크면 매 페이지가 느려진다
$ wp db query "SELECT ROUND(SUM(LENGTH(option_value))/1024,1) AS kb
FROM wp_options WHERE autoload='yes'"
# 제일 뚱뚱한 autoload 옵션 top 10 (범인 찾기)
$ wp db query "SELECT option_name, LENGTH(option_value) len
FROM wp_options WHERE autoload='yes' ORDER BY len DESC LIMIT 10"
✅ 확인 — autoload 총합이 대략 수백 KB를 넘어가면 점검 신호다. top 10에 낯선 플러그인 이름의 거대한 옵션이 보이면, 그게 삭제된 플러그인의 찌꺼기일 가능성이 크다. 이런 걸 정리하면 체감 속도가 붙는다.
autoload가 사이트를 느리게 만드는 법
autoload='yes'인 옵션은 매 페이지 로드마다 한 번의 쿼리로 전부 읽혀 메모리에 캐시된다(alloptions). 자주 쓰는 소수라면 이게 이득이다. 문제는 플러그인이 큰 데이터를 autoload로 쌓아둘 때다. 실제로 안 쓰는데도 그 무게를 모든 페이지가 매번 짊어진다. 느린 사이트의 숨은 원인이 여기 있는 경우가 많다.
지금 내 autoload가 얼마나 무거운지
추측하지 말고 DB로 바로 잰다. 전체 크기와, 무게를 차지하는 상위 옵션을 함께 본다.
-- autoload로 매번 읽히는 총 크기
SELECT SUM(LENGTH(option_value)) AS bytes
FROM wp_options WHERE autoload = 'yes';
-- 무거운 옵션 상위 10개 (범인 찾기)
SELECT option_name, LENGTH(option_value) AS size
FROM wp_options WHERE autoload = 'yes'
ORDER BY size DESC LIMIT 10;
총합이 수백 KB를 넘어가면 점검 대상이다. 상위 옵션 이름을 보면 어느 플러그인이 데이터를 쌓고 있는지 대개 짐작이 된다.
고치는 법
안 쓰는데 큰 옵션은 autoload를 'no'로 바꾼다 — 그 옵션은 이제 필요할 때만 개별 쿼리로 읽힌다. 삭제한 플러그인이 남긴 고아 옵션은 지운다. 참고로 워드프레스 6.6부터는 코어가 지나치게 큰 옵션을 자동으로 autoload에서 빼주는 처리가 들어왔지만, 오래된 사이트엔 여전히 손볼 잔재가 남아 있다.
# WP-CLI로 특정 옵션의 autoload 끄기
wp option set-autoload my_big_option no
트랜지언트 — 만료가 있는 옵션
트랜지언트는 만료 시간이 붙은 임시 옵션이다. set_transient·get_transient로 쓰고, 잠깐 캐시할 데이터에 맞다. 오브젝트 캐시(18편)가 있으면 DB가 아니라 메모리에 저장돼 더 빠르다. 이 블로그도 Valkey 오브젝트 캐시를 붙여 alloptions와 트랜지언트 부담을 덜고 있다.
set_transient( 'cozlab_popular', $data, HOUR_IN_SECONDS ); // 1시간 캐시
$data = get_transient( 'cozlab_popular' ); // 없으면 false
정리하면 wp_options는 편하지만 autoload가 방심하면 성능을 갉아먹는 지점이다. 가끔 위 쿼리로 무게를 재는 습관 하나가 사이트 속도를 지킨다.
설정을 봤으니, 다음 편은 사용자·역할·권한 구조다. 역할이 사실 어디에 어떻게 저장돼 있는지 알면 좀 놀랄 거다.
자주 묻는 질문 (FAQ)
autoload가 왜 함정인가요?
autoload=yes 옵션은 매 요청마다 전부 로드됩니다. 큰 값이 쌓이면 모든 페이지가 느려지니 주기적으로 점검하세요.
트랜지언트는 옵션과 뭐가 다른가요?
트랜지언트는 만료 시간이 있는 임시 옵션입니다. 오브젝트 캐시가 있으면 DB 대신 메모리에 저장되기도 합니다.

답글 남기기