이번 글에서는 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_trigger
와interval_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
와 같은 정기적 갱신 방식은 안정적인 재생성을 보장하지만 데이터의 변경성을 반영하기 어려울 수 있다. 상황에 맞는 적절한 설정을 통해 효율적인 데이터 관리가 이루어질 수 있도록 신중한 접근이 필요하다.