Mendix mx.data.commit이 조용히 실패할 때

2026.10.04
  • 시리즈 4/16
  • 개발
  • Mendix 10
  • 권한

JS 위젯에서 mx.data.commit으로 저장했더니 오류 메시지 없이 값이 반영되지 않았다. 원인은 엔티티 접근 규칙이었다. 저장과 삭제를 Microflow 호출로 바꾸고, 권한은 화면과 서버 두 곳에서 따로 걸었다.

문제

관리자 계정에서는 저장되는데 일반 사용자는 저장 버튼을 눌러도 값이 그대로

원인

클라이언트 커밋은 사용자 역할의 엔티티 접근 규칙을 그대로 따름. 쓰기 권한이 없는 속성은 반영되지 않음

해결

저장과 삭제는 Microflow로 처리하고, 화면 노출 제어와 서버 권한을 분리해서 설정

클라이언트 커밋과 Microflow 호출의 차이

구분mx.data.commitMicroflow 호출
권한 기준사용자 역할의 엔티티 접근 규칙Microflow 설정에 따름
검증 로직클라이언트에 흩어짐서버 한 곳에 모임
실패 확인원인 파악이 어려움로그와 오류 메시지로 확인
추가 처리별도 구현 필요이력 기록, 메일 발송을 같은 흐름에

파라미터는 비영속 객체에 담아 넘긴다

mx.data.action은 문자열을 Microflow 파라미터로 바로 넘길 수 없다. 비영속(non-persistent) 엔티티를 하나 만들어 값을 담고, 그 객체를 넘긴다.

JS 위젯
mx.data.create비영속 파라미터 객체 생성
obj.set날짜 범위, 입력값 담기
서버
Microflow파라미터 객체를 받아 검증, 저장
DB
파라미터 객체 패턴
JS: 파라미터 객체로 Microflow 호출
function callWithParam(mfName, values, onDone) {
  mx.data.create({
    entity: 'Issue.SaveParam',            // 비영속 엔티티
    callback: function (p) {
      Object.keys(values).forEach(function (k) { p.set(k, values[k]); });
      mx.data.action({
        params: { actionname: mfName, applyto: 'selection', guids: [p.getGuid()] },
        callback: function (result) { onDone(null, result); },
        error: function (err) { onDone(err); }
      });
    },
    error: function (err) { onDone(err); }
  });
}

callWithParam('Issue.ACT_SaveIssue', {
  IssueGuid: currentGuid,
  Title: titleInput.value,
  DueDate: dueInput.value
}, function (err) {
  if (err) { showMessage('저장하지 못했습니다.'); return; }
  reloadList();
});
비영속 엔티티에도 접근 규칙이 필요하다비영속 엔티티라도 사용자 역할에 생성, 쓰기 권한을 주지 않으면 obj.set이 동작하지 않는다.

권한은 두 곳에서 따로 건다

화면
버튼 숨김, 입력 잠금사용성을 위한 제어
판단 기준로그인 사용자 역할, 담당자 여부
서버
엔티티 접근 규칙역할별 읽기, 쓰기 범위
Microflow 내부 확인담당자 본인인지 다시 확인
화면 제어는 편의, 실제 차단은 서버
역할화면서버
관리자전체 편집전체 CRUD
조치 담당자조치 내용 탭만 편집조치 관련 속성만 쓰기, Microflow에서 담당자 본인 확인
일반조회만읽기만
JS: 화면 노출 제어
var roles = mx.session.getUserRoleNames ? mx.session.getUserRoleNames() : [];
var isAdmin = roles.indexOf('Admin') > -1;

function canEditClear(row) {
  return isAdmin || row.clearPersonId === currentUserId;
}
모듈별 관리자 역할모듈이 여러 개면 관리자 역할을 모듈마다 나누는 편이 안전했다. 한 모듈의 관리자에게 다른 모듈 엔티티 쓰기 권한이 같이 열리는 것을 막을 수 있다.

점검 목록

  • JS에서 영속 객체를 직접 commit, remove하는 코드가 남아 있지 않은가
  • Microflow의 "Apply entity access" 설정을 의도대로 했는가
  • 화면에서 숨긴 기능을 서버에서도 막았는가
  • 일반 사용자 계정으로 저장, 삭제를 직접 해 봤는가
시리즈 목차 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
  • #mxdata
  • #Microflow
  • #EntityAccess
  • #권한
  • #JavaScript

댓글