본문 바로가기

Stack/Lowcode

[Mendix] Spotfire 연동 2탄: 배치 스케줄링 & 데이터 중복 방지 (feat. Full Refresh)

반응형

 

지난 포스팅에서 복잡한 Join 문제를 해결하기 위해 Reporting Entity(납작한 통계 테이블)를 만들고, ETL Microflow까지 구현했습니다. 이제 남은 건 이 로직을 "자동으로" 돌리는 것뿐이었죠.

하지만 역시나 Mendix, 호락호락하지 않았습니다. 두 가지 난관이 기다리고 있었는데요.

  1. 스케줄러 버튼이 없다? (Runtime vs Studio Pro)
  2. 데이터가 계속 쌓인다? (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.]

  1. 생성: Project Explorer에서 모듈 우클릭 > Add > Other > Scheduled event 선택.
  2. 설정:
    • 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 구현 로직:

  1. Clean Up: Dashboard_ExternalInspection의 모든 데이터를 가져와서(Retrieve All) → 삭제(Delete)합니다.
  2. Load: 원본 데이터를 가져옵니다.
  3. Create: Loop를 돌며 대시보드 데이터를 새로 생성합니다.
  4. Commit: (중요!) Loop 안에서 커밋하지 않고, 다 만든 뒤 마지막에 한 방에 Commit 합니다. (성능 최적화)

4. 마무리: 개꿀따리!

주어진 시간도 부족했는데, Full Refresh 방식을 택하니 Retrieve -> Delete All 액션만 추가해서 아주 손쉽게 해결했습니다.

Spotfire 연동을 위한 Mendix 데이터 처리, 고민하지 말고 **"납작한 테이블(Flat Table)"**과 "Full Refresh" 조합으로 가세요. 개발 속도와 정신건강 모두 챙길 수 있습니다!

반응형