Mendix MPK 파일 열어서 마이크로플로우 구조 보기

2026.10.04
  • 시리즈 10/16
  • 개발
  • Mendix 10
  • Python

기존 모듈을 재사용하려는데 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 행 하나
UnitID, ContainmentName문서 식별자
Contents (BSON)$Type으로 종류 구분
Mendix 10 초기 버전 기준
$Type내용
DomainModels$DomainModel모듈의 엔티티, 속성, 연관
Microflows$MicroflowMicroflow 액티비티, 파라미터
Enumerations$EnumerationEnum 값의 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편
  1. PI 담당자가 로우코드로 사내 시스템을 직접 만들고 운영한 기록
  2. Mendix Datagrid2 대신 HTMLSnippet과 JS로 목록 화면 만들기
  3. Mendix SPA에서 HTMLSnippet JS가 꼬이는 이유: 이벤트 중복과 DOM 공존
  4. Mendix mx.data.commit이 조용히 실패할 때
  5. Mendix Java heap OOM 추적기: base64 이미지 컬럼
  6. Mendix 커밋 롤백, 용량 문제가 아니었다: FileDocument 전환기
  7. Mendix 첫 접속 지연 줄이기: 워밍업과 캐시
  8. Mendix SAML SSO 자동 로그인과 딥링크 유지
  9. Mendix Studio Pro에서 안 바뀌는 스타일 main.scss로 바꾸기
  10. Mendix MPK 파일 열어서 마이크로플로우 구조 보기 (현재 글)
  11. SSO 로그 테이블로 MAU와 재방문율 구하는 SQL
  12. Mendix DateTime이 BI 도구에서 하루 빠르게 보이는 이유
  13. 대시보드 숫자가 틀렸을 때 확인하는 순서
  14. 보기 좋은 대시보드에서 할 일을 알려주는 대시보드로
  15. 여러 점검 시스템을 하나로 합치는 데이터 모델
  16. 데이터 비전공자에게 분석 결과 보고하기
  • #Mendix
  • #MPK
  • #SQLite
  • #BSON
  • #Python
  • #리버스엔지니어링

댓글