
지난 포스팅에서 복잡한 Join 문제를 해결하기 위해 Reporting Entity(납작한 통계 테이블)를 만들고, ETL Microflow까지 구현했습니다. 이제 남은 건 이 로직을 "자동으로" 돌리는 것뿐이었죠.
하지만 역시나 Mendix, 호락호락하지 않았습니다. 두 가지 난관이 기다리고 있었는데요.
- 스케줄러 버튼이 없다? (Runtime vs Studio Pro)
- 데이터가 계속 쌓인다? (Duplicate Issue)
1. Mendix 스케줄러: "버튼이 왜 없어?"
일단 매일 밤 데이터를 갱신해야 하니 스케줄러를 찾아봤습니다. 웹 런타임 화면(ScheduledEvents)에 들어갔는데... [Add] 버튼이 없습니다.
알고 보니 Mendix의 Scheduled Event는 런타임에서 설정하는 게 아니라, Studio Pro(개발 툴)에서 코딩하듯이 객체를 생성해야 하는 것이었습니다. 런타임 화면은 그저 "잘 돌고 있나?" 감시(Monitoring)하는 용도였던 거죠.
🚀 해결: Studio Pro에서 스케줄 객체 생성
[Image Prompt: A screenshot of Mendix Studio Pro Project Explorer. Context menu is open on a module named 'Inspection'. The path 'Add > Other > Scheduled event' is highlighted.]
- 생성: Project Explorer에서 모듈 우클릭 > Add > Other > Scheduled event 선택.
- 설정:
- Frequency: Day (매일), Interval: 1
- Start date/time: UTC 기준 설정 (한국 밤 12시 = UTC 15:00)
- Microflow: 지난번에 만든 ETL 로직(SUB_Sync_DashboardData) 연결.
설정만 해주니 바로 해결되었습니다. 아주 간단하죠?
2. 데이터 중복 이슈: "계속 쌓이기만 하네..."
스케줄러 테스트를 위해 수동으로 마이크로플로우를 몇 번 돌려봤는데, 문제가 발생했습니다. Create Object만 해놓으니 기존 데이터 위에 새 데이터가 쌓여서 1만 건이 2만 건, 3만 건으로 늘어나는 것이었습니다.
대시보드는 최신 현황을 보여줘야 하는데, 중복 데이터가 생기면 안 되죠. 여기서 두 가지 전략을 고민했습니다.
- 전략 A: Upsert (Update or Insert)
- ID를 비교해서 있으면 수정, 없으면 생성.
- 히스토리가 남지만 로직이 복잡함.
- 전략 B: Full Refresh (Delete All & Create All)
- 기존 테이블을 싹 비우고 새로 채워 넣기.
- 구현이 단순하고, 원본에서 삭제된 데이터도 깔끔하게 반영됨.
3. 결론: 정신건강을 위해 Full Refresh 선택
데이터가 약 1만 건 수준이고, Insert 양이 많지 않은 상황이었습니다. 굳이 복잡하게 비교 로직을 짤 필요가 없었죠.
무엇보다... 예전에 데이터 포털 개발할 때 Upsert 방식을 써봤는데, Mendix Microflow로 그 분기 처리(Decision)와 비교 로직을 구현하는 게 정말 끔찍했던 기억이 있습니다. (이건 비밀입니다 ㅎㅎ)
그래서 Full Refresh 방식으로 결정했습니다. 로직은 다음과 같이 수정했습니다.
[Image Prompt: A diagram of a Mendix Microflow logic for Full Refresh. Start -> Retrieve All (Dashboard Entity) -> Delete Object(s) -> Retrieve All (Source Entity) -> Loop (Source) -> Create Object (Dashboard) -> Add to List -> End Loop -> Commit List -> End.]
🛠️ Full Refresh 구현 로직:
- Clean Up: Dashboard_ExternalInspection의 모든 데이터를 가져와서(Retrieve All) → 삭제(Delete)합니다.
- Load: 원본 데이터를 가져옵니다.
- Create: Loop를 돌며 대시보드 데이터를 새로 생성합니다.
- Commit: (중요!) Loop 안에서 커밋하지 않고, 다 만든 뒤 마지막에 한 방에 Commit 합니다. (성능 최적화)
4. 마무리: 개꿀따리!
주어진 시간도 부족했는데, Full Refresh 방식을 택하니 Retrieve -> Delete All 액션만 추가해서 아주 손쉽게 해결했습니다.
Spotfire 연동을 위한 Mendix 데이터 처리, 고민하지 말고 **"납작한 테이블(Flat Table)"**과 "Full Refresh" 조합으로 가세요. 개발 속도와 정신건강 모두 챙길 수 있습니다!