콘텐츠로 건너뛰기

Looker PDT 재생성 설정 가이드: 데이터 특성에 맞는 최적화 방법

이번 글에서는 Looker에서 Persistent Derived Table(PDT) 재생성(Rebuilding)을 다루는 방법에 대해 알아보겠다. PDT의 재생성은 다양한 옵션을 통해 조정될 수 있는데 datagroup, max_cache_age, sql_trigger, interval_trigger 등을 설명하고, 비즈니스에서 발생할 수 있는 실제 사례를 함께 공유해보겠다. PDT에 대한 기본적인 설명은 다음 링크를 참조하면 된다. https://lucy-the-marketer.kr/ko/looker%ec%97%90%ec%84%9c-pdt-%eb%a7%8c%eb%93%a4%ea%b8%b0-%ec%84%a4%ec%a0%95-%ec%98%a4%eb%a5%98-%ed%95%b4%ea%b2%b0/

Model에서 Datagroup 설정하기

Looker에서는 PDT의 재생성 주기를 datagroup으로 관리할 수 있다. Datagroup을 설정하면, PDT가 새로운 데이터를 포함하도록 효율적으로 갱신되도록 만들 수 있다. Datagroup은 주로 데이터의 상태나 특정 이벤트를 기준으로 PDT를 재생성하는데 사용되며, 모든 PDT마다 각기 다른 datagroup을 설정하여 효율적인 데이터 업데이트를 가능하게 한다.

model 파일에 explore 정의 전에 다음처럼 datagroup을 입력하면 된다. 아래의 경우, core.fct_cpa_commissions의 테이블 내 _udpated_at 필드가 업데이트 될 때 재생성 트리거가 발동한다.

Max Cache Age, SQL Trigger, Interval Trigger란?

  • max_cache_age: max_cache_age는 특정 PDT가 재생성되어야 하는 최대 캐시 유효 기간을 지정한다. 예를 들어, max_cache_age: "24 hours"로 설정하면 해당 PDT는 생성 후 최대 24시간 동안 유효하며, 이후에는 재생성이 필요하다. 이 방법은 데이터의 빈번한 변경이 없는 경우에 유용하다.
  • sql_trigger: sql_trigger는 특정 SQL 쿼리 결과에 따라 PDT가 재생성되도록 트리거를 설정하는 방식이다. 일반적으로 데이터의 마지막 업데이트 시간을 체크하는 쿼리를 이용해 PDT를 갱신한다. 예를 들어, sql_trigger: "SELECT MAX(transacted_at) FROM revenue;"와 같이 설정할 수 있다. 데이터의 변경 시점을 감지하여 자동으로 재생성을 실행하는 점에서 실시간성이 중요한 데이터에 적합하다.
  • interval_trigger: interval_trigger는 지정된 시간 간격마다 PDT를 갱신하도록 설정한다. 예를 들어, interval_trigger: "20 minutes"로 설정하면 PDT는 매 20분마다 자동으로 재생성된다. 이 옵션은 데이터 갱신 주기가 정기적인 경우에 유용하다.

중요: sql_triggerinterval_trigger는 동시에 사용할 수 없다. 두 옵션 모두 PDT의 재생성 시점을 관리하지만, 한 번에 하나의 방식만 적용 가능하다. 따라서 트리거 설정 시 이 점을 유의해야 한다. 만약 두 개를 동시에 넣더라도 validation에서 오류가 뜨지 않지만, 트리거가 제대로 동작하지 않는다.

Max Cache Age와 Interval Trigger의 차이

  • max_cache_age는 PDT가 생성된 이후 특정 시간이 지나면 갱신되도록 하는 방식이다. 데이터의 변경 여부와 관계없이 일정 시간이 지나면 갱신된다.
  • 반면 interval_trigger는 주기적으로 일정한 간격으로 갱신을 실행한다. 예를 들어, max_cache_age: "24 hours"interval_trigger: "1 day"는 비슷해 보일 수 있지만, max_cache_age는 데이터가 필요할 때 갱신을 실행하는 반면 interval_trigger는 지정된 주기마다 무조건 재생성을 실행하는 점에서 차이가 있다.

각 PDT의 Datagroup Trigger 설정하기

PDT를 효율적으로 관리하기 위해 각 PDT에 대해 적절한 datagroup_trigger를 설정할 수 있다. 이러한 설정은 여러 PDT가 동일한 데이터 변경 이벤트에 의존하는 경우 유용하다. 예를 들어, 동일한 datagroup을 공유하는 여러 PDT가 있다면, 한 datagroup의 상태 변경에 따라 해당 PDT들이 동시 재생성될 수 있다.

view 파일에서 derived_table 하위에 datagroup_trigger를 다음과 같이 삽입하면 된다.

비즈니스 사례: SQL Trigger에서 발생한 문제와 해결 방법

실제 비즈니스 환경에서 sql_trigger를 사용한 사례를 살펴보겠다. 한 프로젝트에서는 다음과 같이 sql_trigger를 설정했다:

sql_trigger: SELECT MAX(transacted_at) FROM revenue;;

이 설정은 revenue 테이블의 마지막 거래 시점을 기준으로 PDT를 갱신하도록 한다. 하지만 제대로 재생성이 이루어지지 않는 문제가 발생했다. 문제를 파악해보니, 데이터의 timezone 변환이 잘못되어 있었기 때문이었다. 모든 데이터가 UTC로 통일되어야 했지만, 일부 데이터가 다른 타임존으로 기록되어 있었다. 예를 들어, 현재 시간이 UTC로 오전 10시임에도 불구하고 MAX(transacted_at)의 값이 오후 3시로 되어 있었기 때문에, 오전 10시부터 오후 3시까지의 시간 동안 PDT가 재생성되지 않는 상황이 발생한 것이다.

이 문제를 해결하는 동안 임시 조치로 sql_trigger를 주석 처리하고 interval_trigger: "20 minutes"로 설정하여 매 20분마다 PDT가 갱신되도록 했다. 이를 통해 데이터가 제대로 반영되지 않더라도 일정 주기로 재생성하여 최신 데이터를 유지할 수 있었다.

Looker의 PDT 재생성을 설정할 때는 데이터의 특성과 변경 주기에 맞는 옵션을 선택하는 것이 중요하다. sql_trigger와 같은 특정 조건을 이용한 트리거는 실시간성을 제공하지만, timezone과 같은 환경 변수에 따라 의도치 않은 문제가 발생할 수 있다. 반면, interval_trigger와 같은 정기적 갱신 방식은 안정적인 재생성을 보장하지만 데이터의 변경성을 반영하기 어려울 수 있다. 상황에 맞는 적절한 설정을 통해 효율적인 데이터 관리가 이루어질 수 있도록 신중한 접근이 필요하다.

태그: