본문 바로가기
BAPI · BADI · RFC · Interface

[SAP ABAP/MM] MM01~03 BAdI 제한 로직 거는 곳 — BADI_MATERIAL_CHECK·CHECK_DATA 한 메소드로 저장 차단

by Song.sh 2026. 5. 21.

자재마스터(MM01/MM02/MM03) 에 "특정 조건의 자재는 저장 못 하게 막아 달라" · "특정 사용자만 변경 가능하게" · "자재유형이 X 인 경우 자재 그룹 필수 입력" 같은 회사 정책 검증 요건이 들어오면 가장 먼저 떠올려야 하는 곳이 BAdI 입니다. MM01/MM02 의 표준 화면 동작은 SAP 가 제공하는 검증 외에 회사 특화 규칙이 추가되는 케이스가 매우 많은데, BAdI 가 그 확장의 표준 진입점.

 

문제는 "자재마스터 관련 BAdI 가 도대체 몇 개나 있고 어디에 무엇을 걸어야 하는가" 입니다. SE19 에서 "MATERIAL" 로 검색하면 6개 이상이 줄줄이 나오는데, 그중 어느 것을 골라 어느 메소드에 코드를 넣어야 저장이 차단되는지가 신입 입장에서는 막막합니다. 이 글은 그 진입점을 한 화면에 정리한 메모입니다.

 

이 글은 MM01/MM02/MM03 에서 자주 쓰는 자재마스터 BAdI 6종의 용도·메소드·제한 로직 거는 위치를 정리한 메모입니다. 가장 자주 쓰이는 BADI_MATERIAL_CHECKCHECK_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 신규 탭·필드 화면 추가

순서 권장:

  1. 표준 Customizing(OMSK·OMS9) 으로 해결 가능 → 우선 시도
  2. 안 되면 BADI_MATERIAL_CHECK 로 검증 로직
  3. 화면·필드 추가는 BADI_MATERIAL_OD
  4. 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_CHECKCHECK_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 위험물 필수 등) 는 회사 정책 예시로 일반화한 형태이며, 사내 환경에서는 실제 정책에 맞춰 분기 조건을 조정하시기 바랍니다.