[워드프레스] 10. 옵션 : wp_options와 autoload의 함정

워드프레스 해부 10편 - wp_options와 autoload의 함정

작성자

카테고리:

* 이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

(워드프레스 해부 ⑩) 옵션

사이트 주소, 블로그 제목, 활성 플러그인 목록, 퍼머링크 구조… 이런 사이트 전역 설정은 전부 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 대신 메모리에 저장되기도 합니다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다