기존 모듈을 재사용하려는데 Microflow의 파라미터, 호출하는 REST 주소, Enum 값을 하나씩 Studio Pro에서 열어 보기 번거로웠다. MPK 파일은 zip이고, 안의 프로젝트 파일은 SQLite DB이며, 각 문서는 BSON으로 저장돼 있다. Python으로 필요한 정보만 뽑았다.
문제
모듈 구조를 문서로 정리하거나 다른 사람에게 설명하려면 Studio Pro 화면을 하나씩 캡처해야 함
원인
Mendix 모델은 Studio Pro에서만 보도록 만들어져 있음
해결
MPK 압축 해제 → project.mpr을 SQLite로 열기 → Unit 테이블의 BSON을 디코드해서 필요한 항목만 출력
파일 구조
MPK (zip)
project.mprSQLite DB
위젯, 리소스 파일이번 작업에는 사용 안 함
Unit 테이블
Unit 행 하나
UnitID, ContainmentName문서 식별자
Contents (BSON)$Type으로 종류 구분
| $Type | 내용 |
|---|---|
DomainModels$DomainModel | 모듈의 엔티티, 속성, 연관 |
Microflows$Microflow | Microflow 액티비티, 파라미터 |
Enumerations$Enumeration | Enum 값의 Name, Caption |
준비
터미널
pip install pymongo # bson 모듈이 함께 설치됨
unzip MyApp.mpk -d mpk
ls mpk # project.mpr 확인엔티티와 속성 목록
Python
import sqlite3, bson
con = sqlite3.connect('mpk/project.mpr')
def units():
for uid, name, blob in con.execute('SELECT UnitID, ContainmentName, Contents FROM Unit'):
yield bson.decode(blob)
def walk(o, fn):
if isinstance(o, dict):
fn(o)
for v in o.values(): walk(v, fn)
elif isinstance(o, list):
for x in o: walk(x, fn)
for d in units():
if d.get('$Type') != 'DomainModels$DomainModel':
continue
for e in d.get('Entities', []):
if not isinstance(e, dict): continue
print('[' + e.get('Name', '?') + ']')
for a in e.get('Attributes', []):
if not isinstance(a, dict): continue
t = a.get('Type') or {}
kind = t.get('$Type', '').replace('DomainModels$', '').replace('AttributeType', '')
print(' ', a.get('Name'), ':', kind)Microflow 파라미터와 호출 대상
Python
def mf_summary(target_name):
for d in units():
if d.get('$Type') != 'Microflows$Microflow' or d.get('Name') != target_name:
continue
out = []
def pick(o):
t = o.get('$Type', '')
if t == 'Microflows$MicroflowParameterObject':
vt = o.get('VariableType') or {}
out.append('PARAM ' + str(o.get('Name')) + ' : ' + str(vt.get('Entity', vt)))
elif 'Location' in o and isinstance(o.get('Location'), str) and o['Location'].startswith('http'):
out.append('URL ' + o['Location'])
walk(d, pick)
return out
for line in mf_summary('SUB_SendMail') or []:
print(line)읽기 전용으로만 쓴다project.mpr을 직접 수정하면 Studio Pro에서 열리지 않을 수 있다. 항상 압축을 푼 사본에서 조회만 한다.
버전에 따라 구조가 다르다최근 Mendix 버전은 프로젝트 파일 형식이 바뀌어 문서가 별도 폴더의 개별 파일로 나뉜다. 이 글은 단일 SQLite 파일 형식 기준이다. 속성 키 이름도 버전마다 다를 수 있어, 먼저 BSON 하나를 통째로 출력해 키를 확인하는 편이 빠르다.
이렇게 썼다
- 기존 메일 발송 모듈의 Microflow 파라미터와 필드 이름을 확인해 새 위젯에서 재사용
- Enum 값의 Name을 확인해 JS에서 보내는 값과 맞춤
- 엔티티, 속성 목록을 뽑아 테이블 명세서 초안 작성
점검 목록
- 원본 MPK가 아니라 사본을 열었는가
- Mendix 버전에 맞는 파일 형식인지 확인했는가
- 키 이름을 추측하지 않고 BSON 전체 출력으로 확인했는가
시리즈 목차 16편
- PI 담당자가 로우코드로 사내 시스템을 직접 만들고 운영한 기록
- Mendix Datagrid2 대신 HTMLSnippet과 JS로 목록 화면 만들기
- Mendix SPA에서 HTMLSnippet JS가 꼬이는 이유: 이벤트 중복과 DOM 공존
- Mendix mx.data.commit이 조용히 실패할 때
- Mendix Java heap OOM 추적기: base64 이미지 컬럼
- Mendix 커밋 롤백, 용량 문제가 아니었다: FileDocument 전환기
- Mendix 첫 접속 지연 줄이기: 워밍업과 캐시
- Mendix SAML SSO 자동 로그인과 딥링크 유지
- Mendix Studio Pro에서 안 바뀌는 스타일 main.scss로 바꾸기
- Mendix MPK 파일 열어서 마이크로플로우 구조 보기 (현재 글)
- SSO 로그 테이블로 MAU와 재방문율 구하는 SQL
- Mendix DateTime이 BI 도구에서 하루 빠르게 보이는 이유
- 대시보드 숫자가 틀렸을 때 확인하는 순서
- 보기 좋은 대시보드에서 할 일을 알려주는 대시보드로
- 여러 점검 시스템을 하나로 합치는 데이터 모델
- 데이터 비전공자에게 분석 결과 보고하기