Zeppelin 의 Dynamic form 사용해보기 (Text Input)

지정한 기간에 대한 데이터를 조회해볼 일이 있어 노트북을 작성하다가, 아무래도 자주 반복되지 싶어서 쿼리에 다이나믹 폼을 추가했다. 다이나믹폼은 제플린이 제공하는 기능이고, 텍스트박스/체크박스/드롭다운으로 간단히 외부 변수를 주입할 수 있게 되어있는데, 매번 짤 때마다 새로운 느낌이길래 이번 기회에 블로그로 정리해둔다. 나중엔 안찾아보고 촵촵 짜면 참 좋겠다…

일단 변수가 필요한 쿼리를 준비한다. 아래는 log_dt를 기준으로 특정 기간에 해당하는 로그가 어느 요일에 속하는지를 분류하는 쿼리인데, 내부 데이터와 연계되어 있을 수 있어 테이블명과 where 에 들어가는 조건문들은 모두 없앤 상태다. 로그테이블에다 이렇게 쿼리날리면 데이터팀에서 쫓아옵ㄴ..

with log_week as (
    select log_date as logtime, 
        case when day_of_week(log_date) = 1 then 1 else 0 end as mon,
        case when day_of_week(log_date) = 2 then 1 else 0 end as tue,
        case when day_of_week(log_date) = 3 then 1 else 0 end as wed,
        case when day_of_week(log_date) = 4 then 1 else 0 end as thu,
        case when day_of_week(log_date) = 5 then 1 else 0 end as fri,
        case when day_of_week(log_date) = 6 then 1 else 0 end as sat,
        case when day_of_week(log_date) = 7 then 1 else 0 end as sun
    from logdummy
    where log_dt >= '2019-02-10' and log_dt <= '2019-02-11'
)
select date_format(logtime, '%H') as time, 
    sum(mon) as mon, 
    sum(tue) as tue, 
    sum(wed) as wed, 
    sum(thu) as thu, 
    sum(fri) as fri, 
    sum(sat) as sat, 
    sum(sun) as sun
from log_week
group by date_format(logtime, '%H')
order by date_format(logtime, '%H')
limit 24

저 중에서 log_dt의 시작과 끝 날짜를 text input form 으로 변경하려고 한다.
변수를 받을 위치에 ${formName}를 넣어주면 되지만, 아무 값도 없으면 아무 데이터도 나오지 않아 기본값이 필요하다.

아무것도 입력안했을 때의 기본값으로는 오늘 날짜를 넣어주려고 하고, 문서를 보니 기본값은 ${formName=defaultValue} 라고 입력하라고 되어있다. 오늘 날짜는 current_date 를 넣으면 되는데…. 예제처럼 똑같이 넣어보면 아래같이 된다. 🥺 웃프다..

왜냐면 form 에서 받은 데이터를 ' '로 묶어버려서 날짜를 처리하는 함수가 텍스트가 되어버렸기 때문이다.
그래서 입력받은 값의 길이를 보고, 길이가 0보다 크면 (length() > 0) 폼에서 받은 인자를 넣어주고(then), 0보다 작으면 current_date 인자를 넣어주게(else) 했다.

☑️ 값이 있으면, 입력한대로 뱉는 then

☑️ 값이 없으면, 오늘 날짜를 뱉는 else

쿼리 테스트가 끝났으니 원래 쿼리의 '2019-02-10' 대신 case when length('${start_date}') > 0 then '${start_date}' else cast(current_date as varchar) end 과 종료일 쿼리를 각각 넣고, 잘 돌아가는지 돌려본다. 입력한 어제날짜부터 입력하지 않은 오늘 날짜까지, 원하는대로 짠 하고 나왔다.

받은 데이터가 날짜인지 아닌지 체크하는 것도 해보고 싶었는데, 일단은 할 줄 모르는게 크고 + 오버스펙이란 생각이 들어서 이만 턴을 종료한다. 어차피 사용자 탓이니, 잘 쓰기만 하면 되는거 아닌가!
어쨋든 실데이터와 어울리는 자연스러운 모자이크를 끝으로, 오늘의 삽질 끗~

Sliding Sidebar