자재마스터(MM01/MM02/MM03) 에 "특정 조건의 자재는 저장 못 하게 막아 달라" · "특정 사용자만 변경 가능하게" · "자재유형이 X 인 경우 자재 그룹 필수 입력" 같은 회사 정책 검증 요건이 들어오면 가장 먼저 떠올려야 하는 곳이 BAdI 입니다. MM01/MM02 의 표준 화면 동작은 SAP 가 제공하는 검증 외에 회사 특화 규칙이 추가되는 케이스가 매우 많은데, BAdI 가 그 확장의 표준 진입점.
문제는 "자재마스터 관련 BAdI 가 도대체 몇 개나 있고 어디에 무엇을 걸어야 하는가" 입니다. SE19 에서 "MATERIAL" 로 검색하면 6개 이상이 줄줄이 나오는데, 그중 어느 것을 골라 어느 메소드에 코드를 넣어야 저장이 차단되는지가 신입 입장에서는 막막합니다. 이 글은 그 진입점을 한 화면에 정리한 메모입니다.
이 글은 MM01/MM02/MM03 에서 자주 쓰는 자재마스터 BAdI 6종의 용도·메소드·제한 로직 거는 위치를 정리한 메모입니다. 가장 자주 쓰이는 BADI_MATERIAL_CHECK 의 CHECK_DATA 메소드 예시 코드까지 같이 다룹니다.
핵심 — 자재마스터 BAdI 6종 한눈 비교
SAP NetWeaver 표준에서 제공하는 자재마스터 관련 BAdI 들.
| BAdI 명 | 패키지 | 용도 |
|---|---|---|
BADI_MATERIAL_CHECK |
MGA | 저장 시 검증 / 차단 — 가장 자주 쓰는 곳 (★) |
BADI_MATERIAL_OD |
MGA | Object Definition — 화면·PF Status·추가 데이터 POST |
BADI_MATERIAL_REF |
MGA | 참조 자재(MM01 에서 자재 복사) 처리 시 검증 |
BADI_MATERIAL_F4 |
MG | 자재번호 F4 도움말 확장 (Enhancement Spot) |
BADI_MATERIAL_CC |
MGV | Change Control — 변경 이력·승인 흐름 확장 |
BADI_MATERIAL_ALE_CR/IN |
MGV_MATNR_LAMA | ALE 분산 시스템용 (생성 CR / 송신 IN) |
핵심 한 줄: 저장 차단·필드 검증·필수 입력 같은 "제한 로직" 은 BADI_MATERIAL_CHECK · CHECK_DATA 한 곳에 모두 들어갑니다. 화면 동작·필드 활성화·추가 탭은 BADI_MATERIAL_OD 영역. 헷갈리면 일단 CHECK 부터 보면 됩니다.
1단계 — BADI_MATERIAL_CHECK 인터페이스 메소드
IF_EX_BADI_MATERIAL_CHECK 인터페이스에는 메소드 6개가 있습니다. 그중 실무에서 99% 의 검증 로직이 들어가는 곳은 CHECK_DATA.
| 메소드 | 언제 호출 / 용도 |
|---|---|
CHECK_DATA (★) |
자재마스터 저장 직전 — 모든 뷰의 데이터 일괄 검증 / 저장 차단 |
CHECK_CHANGE_MARA_MEINS |
기본 단위(MEINS) 변경 시 — 사용 중인 자재인지 체크 |
CHECK_CHANGE_PMATA |
Pricing 참조 자재 변경 시 — 가격 조건 사용 중 여부 |
CHECK_DATA_RETAIL |
Retail 자재 전용 — Retail 환경에서만 호출 |
FRE_SUPPRESS_MARC_CHECK |
Forecasting 체크 억제 — 자재유형별 예외 처리 |
CHECK_MASS_MARC_DATA |
Mass Maintenance(MASS T-Code) 대량 변경 시 검증 |
대부분의 회사 정책 검증(자재유형별 필수 필드·자재그룹 정합성·플랜트별 제약 등) 은 CHECK_DATA 한 메소드 안에서 분기 처리하는 것이 표준 패턴입니다.
2단계 — CHECK_DATA 시그니처
CHECK_DATA 의 표준 시그니처. 모든 자재마스터 뷰의 데이터가 IMPORTING 으로 들어옵니다.
METHODS check_data
IMPORTING
VALUE(wmara) TYPE mara " 일반 데이터
VALUE(wmarc) TYPE marc " 플랜트 데이터
VALUE(wmard) TYPE mard " 저장위치 데이터
VALUE(wmbew) TYPE mbew " 자재 평가
VALUE(wmlgn) TYPE mlgn " 창고 일반
VALUE(wmlgt) TYPE mlgt " 창고 타입
VALUE(wmvke) TYPE mvke " 영업 데이터
VALUE(wstat) TYPE mgstat
VALUE(wmfhm) TYPE mfhm " 생산 자원/도구
VALUE(wmpop) TYPE mpop " 예측 파라미터
VALUE(ssteuertab) TYPE mgint_mg03steuer
VALUE(ssteummtab) TYPE mgint_mg03steumm
VALUE(wmeinh) TYPE mgint_smeinh " 추가 단위
VALUE(smean_me_tab) TYPE mgint_me_mean_tab " EAN/UPC
CHANGING
VALUE(cmara) TYPE maru " 자재 일반(변경 가능)
VALUE(stext) TYPE mgint_short_desc " 자재 내역
EXCEPTIONS
application_error. " ★ RAISE 시 저장 차단

핵심 파라미터:
WMARA— 자재 일반(MARA 그대로). 가장 자주 쓰이는 입력WMARC— 플랜트(MARC). 플랜트별 제약 검증에 사용WMBEW— 평가(MBEW). 가격·평가 클래스 검증CMARA(CHANGING) — 자재 일반의 변경 가능 버전. 값 수정도 가능하지만 보통 검증만APPLICATION_ERROR(EXCEPTION) — 이 예외를 RAISE 하면 저장이 차단 됨
저장 차단의 핵심: 검증 실패 시 MESSAGE ... TYPE 'E' 또는 RAISE application_error 으로 BAdI 메소드를 빠져나가면 SAP 가 저장을 거부합니다.
3단계 — BAdI 구현 클래스 생성 (SE19)
표준 BAdI 의 사용자 정의 구현은 SE19 에서 생성. Classic BAdI(SXSD/XD 타입) 와 Kernel BAdI(ENHS/XS 타입) 의 생성 흐름이 약간 다릅니다.
SE19 진입
→ "Classical BAdI" 라디오 → Implementation Name: ZIM_MATERIAL_CHECK 입력
→ Create 버튼
→ 팝업: BAdI Name: BADI_MATERIAL_CHECK 입력 → OK
→ Short Text: "자재마스터 저장 검증 - 자사 정책"
→ Save → Transport 지정
→ Implementation 화면에서 "Interface" 탭 클릭
→ CHECK_DATA 메소드 더블 클릭
→ 코드 입력 → Activate (Ctrl + F3)


SE18 vs SE19 차이:
SE18— BAdI Definition 조회 (BAdI 가 어떤 메소드를 가졌는지 시그니처 확인)SE19— BAdI Implementation 생성/조회 (실제 코드 작성)
4단계 — CHECK_DATA 검증 로직 예제
자주 들어오는 회사 정책 검증 4가지 시나리오를 한 메소드 안에 묶어둔 예시.
METHOD if_ex_badi_material_check~check_data.
" ============================================================
" 시나리오 1: 자재유형 FERT 인 경우 자재그룹(MATKL) 필수
" ============================================================
IF wmara-mtart = 'FERT' AND wmara-matkl IS INITIAL.
MESSAGE '완제품(FERT) 은 자재 그룹이 필수입니다.' TYPE 'E'.
ENDIF.
" ============================================================
" 시나리오 2: 특정 플랜트(예: 9999 — 폐쇄 예정) 신규 자재 차단
" ============================================================
IF wmarc-werks = '9999'.
MESSAGE |플랜트 { wmarc-werks } 는 신규 자재 생성이 차단되었습니다.|
TYPE 'E'.
ENDIF.
" ============================================================
" 시나리오 3: 자재유형 ROH(원료) + 위험물 표시 누락 차단
" ============================================================
IF wmara-mtart = 'ROH' AND wmara-stoff IS INITIAL.
MESSAGE '원료(ROH) 는 위험물 코드(STOFF) 등록이 필요합니다.' TYPE 'E'.
ENDIF.
" ============================================================
" 시나리오 4: 자재 내역(STEXT) 자동 정리 — 앞뒤 공백 제거
" ============================================================
CONDENSE stext.
TRANSLATE stext TO UPPER CASE.
" ============================================================
" 시나리오 5: 회사 권한 — 특정 사용자만 변경 가능
" ============================================================
AUTHORITY-CHECK OBJECT 'M_MATE_MAR'
ID 'MATNR' FIELD wmara-matnr
ID 'ACTVT' FIELD '02'. " 02 = Change
IF sy-subrc <> 0.
MESSAGE |자재 { wmara-matnr } 변경 권한이 없습니다.|
TYPE 'E'.
ENDIF.
ENDMETHOD.
주요 포인트:
MESSAGE ... TYPE 'E'한 줄이면 저장 즉시 차단 — 별도RAISE안 해도 됨CMARA(CHANGING) 으로 자재 일반 데이터 값을 수정도 가능 — 단, 데이터 무결성 깨질 위험 있어 검증 위주로 사용 권장- 한 메소드 안에서 여러 시나리오 분기. 시나리오마다 별도 BAdI Implementation 만들지 말고 묶어두는 게 유지보수 면에서 효율적
5단계 — IMG 경로 / BAdI 등록 위치
SE19 외에 IMG 경로로도 BAdI 등록 화면 진입 가능. 운영팀이 자재마스터 정책을 IMG 기반으로 관리하면 이 경로가 표준입니다.
SPRO → IMG
→ Logistics - General
→ Material Master
→ Business Add-Ins (BAdIs) for the Material Master
↓
├ Configure BAdI Material Check ← BADI_MATERIAL_CHECK 등록
├ Configure BAdI Material OD ← BADI_MATERIAL_OD 등록
├ Configure BAdI Material Reference ← BADI_MATERIAL_REF 등록
└ ...

IMG 경로로 등록해도 결국 SE19 의 구현 클래스가 생성됩니다. 둘은 같은 결과를 다른 진입점으로 만드는 차이.
6단계 — BAdI vs User-Exit / 다른 확장 메커니즘 비교
자재마스터 확장은 BAdI 외에 다른 메커니즘도 있어 헷갈리기 쉽습니다. 표로 정리.
| 메커니즘 | 위치 | 권장 시나리오 |
|---|---|---|
| BAdI (BADI_MATERIAL_*) | SE19 / IMG | 저장 검증·필수 입력·필드 정리 (가장 권장) |
| User-Exit (MGA00001 등) | CMOD/SMOD | 레거시 — BAdI 가 없는 옛 환경에서만 |
| Field Selection (OMS9) | IMG / OMS9 | 필드 화면 활성/비활성 (코드 없이 설정만) |
| Customizing (OMSK 등) | IMG | 자재유형별 필수/선택 표준 설정 |
| Screen Exit (BADI_MATERIAL_OD) | SE19 + IMG | 신규 탭·필드 화면 추가 |
순서 권장:
- 표준 Customizing(OMSK·OMS9) 으로 해결 가능 → 우선 시도
- 안 되면 BADI_MATERIAL_CHECK 로 검증 로직
- 화면·필드 추가는 BADI_MATERIAL_OD
- User-Exit 는 마지막 차선책
7단계 — BADI_MATERIAL_OD 의 주요 메소드 (참고)
화면·POST·PF-Status 같이 동작 자체를 확장해야 한다면 BADI_MATERIAL_OD. 인터페이스 IF_EX_BADI_MATERIAL_OD 에 11개 메소드가 있습니다.
| 메소드 | 용도 |
|---|---|
READ_OTHER_MATERIAL_DATA |
추가 자재 데이터 읽기 (커스텀 테이블·필드) |
CHANGE_CHECK_OTHER_MAT_DATA |
추가 데이터 변경 체크 |
MATERIAL_POST_OTHER_DATA |
자재 저장 시 추가 데이터 POST (POST_ERROR 예외 가능) |
PF_STATUS_SETZEN |
GUI Status 설정 (버튼 활성/비활성) |
MATERIAL_REFERENCE_OD_RT |
참조 자재 처리 (Retail 환경) |
MG_IDOC_CREATE_FULL |
자재 IDOC 생성 시 추가 데이터 매핑 |
OD 의 메소드들은 화면 동작·데이터 흐름을 다루기 때문에 BAdI 코드가 본격적으로 무거워집니다. 검증만 필요한 경우라면 OD 까지 건드리지 말고 CHECK 한 곳만 사용하는 것이 안전.
흔히 빠뜨리는 함정
MM03(조회) 에서도 BAdI 가 호출됨
" ❌ MM01/MM02 만 막으려는 의도인데 MM03 조회 시에도 메시지 뜸
IF wmara-mtart = 'FERT' AND wmara-matkl IS INITIAL.
MESSAGE '자재 그룹 필수' TYPE 'E'.
ENDIF.
CHECK_DATA 는 MM01/MM02/MM03 + BAPI_MATERIAL_SAVEDATA 모두에서 호출됩니다. 의도가 "생성·변경 시에만 차단" 이면 sy-tcode 분기로 명시 제어.
CHECK sy-tcode CA 'MM01MM02MASS'. " 조회(MM03) 는 검증 제외
BAPI 호출 시 SY-TCODE 비어 있음
" ❌ MM01/MM02 만 체크하려는데 BAPI 호출 시 sy-tcode 비어서 검증 빠짐
IF sy-tcode = 'MM01' OR sy-tcode = 'MM02'.
...
ENDIF.
BAPI_MATERIAL_SAVEDATA 같은 외부 호출에서는 sy-tcode 가 빈 값일 수 있습니다. BAPI 도 차단 대상이면 빈 값까지 포함해 분기.
CMARA 변경 후 데이터 정합성 깨짐
" ⚠️ CMARA 의 값을 마음대로 바꾸면 자재마스터 정합성 깨질 수 있음
cmara-mtart = 'ROH'. " 자재유형 강제 변경
CHECK_DATA 의 CMARA 는 CHANGING 이지만 자재유형·플랜트 키 같은 핵심 필드를 BAdI 안에서 바꾸면 후속 처리에서 깨질 위험. 단순 정리(공백 정리·대소문자 변환) 이상은 가능한 한 자제.
권한 체크 누락
회사 정책이 "특정 자재유형은 특정 사용자만 변경 가능" 이라면 AUTHORITY-CHECK OBJECT 'M_MATE_MAR' 으로 추가 검증. BAdI 메시지로만 막으면 일부 우회 경로(예: 일괄 업로드 자체 프로그램) 에서 통과될 수 있음.
한 BAdI 에 너무 많은 시나리오
CHECK_DATA 한 메소드에 50가지 검증을 다 넣으면 유지보수 어려움. 시나리오가 많아지면 내부에 별도 FORM 또는 메소드 호출 로 분리해 가독성 유지.
METHOD if_ex_badi_material_check~check_data.
PERFORM check_fert_required USING wmara CHANGING stext.
PERFORM check_plant_blocked USING wmarc.
PERFORM check_user_auth USING wmara.
...
ENDMETHOD.
Mass Maintenance 누락
대량 변경 트랜잭션(MASS) 은 CHECK_MASS_MARC_DATA 메소드를 호출하므로 거기에도 같은 검증 로직 한 줄 더 넣어야 우회 방지.
Implementation 비활성화
SE19 에서 Implementation 만들었는데 활성화(Ctrl+F3) 안 함
→ BAdI 등록은 됐지만 호출 안 됨
Implementation 의 좌측 아이콘 색(빨강 → 검정) 으로 활성화 확인. Ctrl + F3 누락 시 함정.
요약
| 단계 | 작업 | 핵심 |
|---|---|---|
| 1 | BAdI 선택 | 검증 = BADI_MATERIAL_CHECK / 화면 = BADI_MATERIAL_OD |
| 2 | 메소드 선택 | 99% 의 검증은 CHECK_DATA 한 곳 |
| 3 | Implementation 생성 | SE19 → ZIM_MATERIAL_CHECK → BADI_MATERIAL_CHECK 매핑 |
| 4 | 검증 로직 | MESSAGE ... TYPE 'E' 한 줄로 저장 차단 |
| 5 | 활성화 | Ctrl + F3 — 빨강→검정 아이콘 확인 |
| 6 | 분기 처리 | MM03 조회 + BAPI 호출 + MASS 모두 동일 메소드 → sy-tcode 분기로 제어 |
자재마스터 BAdI 는 종류가 많지만 실무에서 95% 이상의 "제한 로직" 은 BADI_MATERIAL_CHECK 의 CHECK_DATA 메소드 한 곳에 모입니다. 화면·동작 확장이 필요한 케이스만 BADI_MATERIAL_OD 까지 가고, 그 외 BAdI(REF/F4/CC/ALE) 는 특수 시나리오용. SE19 진입 → BAdI 선택 → 인터페이스 메소드에 코드 → 활성화. 이 4단계 흐름만 익숙해지면 모든 자재마스터 검증 요건에 같은 패턴으로 대응할 수 있습니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
본문의 BAdI Definition · Interface 시그니처 · 메소드 목록은 SAP NetWeaver 표준(ECC 6.0 / S/4HANA on-premise 표준 패키지 MGA · MGV) 기준입니다. BADI_MATERIAL_CHECK 는 Classic BAdI(SXSD/XD) 타입이며 SE19 의 "Classical BAdI" 흐름으로 구현하고, BADI_MATERIAL_OD·BADI_MATERIAL_F4·BADI_MATERIAL_CC 는 Enhancement Spot(ENHS/XS) 형식이 같이 제공되어 신규 환경에서는 Kernel BAdI 흐름도 가능합니다.
CHECK_DATA 는 MM01/MM02/MM03 + BAPI_MATERIAL_SAVEDATA + Mass Maintenance(MASS T-Code) 모두에서 공통 호출되므로 의도하는 시나리오만 차단하려면 sy-tcode 분기 처리가 필요합니다. 본문의 검증 시나리오 예시(자재유형 FERT 자재 그룹 필수·플랜트 9999 차단·ROH 위험물 필수 등) 는 회사 정책 예시로 일반화한 형태이며, 사내 환경에서는 실제 정책에 맞춰 분기 조건을 조정하시기 바랍니다.