같은 옵션에 경쟁을 붙이면 어떻게 될까?

워드프레스에서 옵션 테이블은 매우 자주 이용하는 테이블입니다. 여기에 사이트 전체에 빈번하게 사용되는 값들이 저장되어 있습니다. 코어, 테마, 플러그인 모두 상당히 이 옵션 테이블에 의존하고 있습니다. 때로는 너무 옵션 테이블에 의존해서 상당히 퍼포먼스가 떨어질 때도 있긴 하지요. 이 포스트에서는 그 퍼포먼스의 문제는 논외로 하고, 이 옵션 테이블의 업데이트를 할 때 알아두면 좋을 내용을 적어 보도록 하겠습니다.

옵션 테이블은 간혹 갱신되며 거의 읽기 전용인 데이터를 위한 목적이 강해 보입니다(제 개인적인 의견입니다). 그러나 기본적인 컨셉이 그렇다는 것이고, 테마나 플러그인들은 정말 다양한 용도로 이것을 활용하고 있습니다.

어떻게 보면 각각의 용도에 맞춰 커스텀 테이블을 만들어 데이터를 관리하는 것이 정석일 수도 있습니다. 그러나 보통은 어지간히 별개로 다루어야 할 데이터가 아니라면 범용성과 확장성이 좋은 옵션 테이블이나 메타 테이블을 활용하는 것이 조금 더 워드프레스 다운 방식이긴 하죠.

그런데 문제는 옵션 테이블의 기본 컨셉은 거의 읽기 전용에 가깝다는 것입니다. 이건 옵션 테이블이 어떻게 운용되는지에 대해 먼저 설명을 하는 것이 좋겠네요.

옵션 테이블의 기본 운용 원리

옵션 테이블은 아래 4개의 칼럼으로 이루어져 있습니다.

  • option_id: 고유 키
  • option_name: 옵션 이름
  • option_value: 옵션 값
  • autoload: 자동 로드 여부

옵션 값을 조회하기 위해 get_option() 함수를 사용합니다. 최초로 get_option()이 불릴 때 코어는 옵션 테이블에서 autoload 필드가 ‘yes’인 값드를 죄다 조회해 캐싱해 둡니다. 이후 get_option() 함수가 불릴 때 캐시에 원하는 옵션 값이 있으면 캐싱된 값을 리턴하고, 아니라면 데이터베이스에서 다시 질의를 보내 값을 받아온 다음 캐싱하는 식으로 처리합니다.

옵션 테이블은 autoload 값이 yes 인 값은 한번에 뭉텅이로 가져오게 되고, no 인 값들은 불릴 때마다 개별적으로 가져오게 한다… 즉, 이 말은 사이트 운용에 있어 필수적이라고 판단되는 옵션은 한 번에 가져와서 로딩해 두고 그때그때마다 다르게 사용하는 옵션들은 적시에 로딩해서 쓰게 하는 것입니다.

매우 자주 플러그인이나 테마가 옵션값을 과하게 쓰는 경우가 많은데, 바로 이런 부분에서 적절하게 처리를 하지 않으면 성능에 영향을 미치기도 합니다.

이제 본 포스트가 다루고자 하는 문제를 이야기하고자 합니다. 옵션값은 거의 읽기 전용에 가깝습니다. 그렇게 쓰는 것이 올바르다고 할 수 있습니다. 그러나 그렇게 복잡하지 않은 단순한 데이터를 위해 커스텀 테이블을 쓰는 것 또한 귀찮은 일입니다. 옵션 테이블을 이용해 단순한 데이터를 직렬화하 하면 간단하잖아요? 그런데 때때로 옵션 값이 빈번하게 업데이트되면 그 업데이트가 올바르게 되지 않는 현상이 발생합니다. 정말 그렇습니다!

댓글 남기기