SAP 의 표준 화면에 회사 자체 영역(서브스크린·메뉴 항목·자동 처리 로직) 을 끼워 넣는 가장 오래된 방식이 Customer Exit (SMOD/CMOD) 입니다. BAdI 가 등장하기 전부터 SAP 가 제공해 온 메커니즘이며, ECC / S/4HANA on-premise 환경에서는 여전히 많은 표준 모듈이 이 방식만 지원하므로 BAdI 로 대체되지 않는 영역에서는 지금도 필수 도구입니다.
이 글에서는 CMOD 프로젝트를 이용한 Screen Exit 생성 / 비활성화 흐름 을 정리합니다. SMOD 와 CMOD 의 역할 분리·Enhancement 등록·서브스크린 작성·ZX Include 흐름 로직·프로젝트 활성화 / 비활성화로 화면을 손쉽게 켜고 끄는 패턴까지 한 번에 다룹니다.
SMOD / CMOD 는 회사 ID(Client) 당 한 프로젝트의 한 Enhancement 만 활성 가능한 단점이 있지만, 켜고 끄기가 직관적 이라 검증 / 임시 화면 / 회사 정책에 따른 ON / OFF 가 필요한 시나리오에서 강점이 있습니다.
핵심 — SMOD vs CMOD vs BAdI
| 구분 | SMOD (Enhancement) | CMOD (Project) | BAdI (SE18/SE19) |
|---|---|---|---|
| 역할 | SAP 가 정의한 Enhancement | 고객이 만드는 활성화 컨테이너 | 정의 + 구현 OO 객체 |
| 대상 | Function · Menu · Screen exit | 여러 SMOD enhancement 묶음 | 인터페이스 + 메소드 |
| 활성화 단위 | Enhancement 단독은 활성화 불가 | 프로젝트 단위 ON / OFF | 구현체 단위 ON / OFF |
| 동시 다중 사용 | 불가 (Enhancement 1개 = 프로젝트 1개) | 불가 | Multiple Use 옵션 시 가능 |
| 주요 T-Code | SMOD |
CMOD |
SE18 / SE19 |
| 코드 방식 | Include 기반 (ZX*) | 프로젝트는 코드 없음 | OO Class 메소드 구현 |
핵심 분담: SMOD 는 SAP 가 미리 만들어 둔 확장 지점의 카탈로그, CMOD 는 그중 사용할 것을 골라 활성화하는 회사의 프로젝트. 코드는 SMOD 이 정의한 ZX Include 에 작성하고, 그 SMOD Enhancement 가 CMOD 프로젝트에 등록되고 그 프로젝트가 활성화돼야 실제 동작합니다.
1단계 — SMOD 에서 표준 Enhancement 이름 찾기
회사가 확장할 표준 트랜잭션이 어떤 Enhancement 를 제공하는지 SMOD 에서 먼저 확인합니다.
SMOD → F4 도움말 → 패키지 / 키워드 검색
→ 또는 SE84 → Enhancements → Customer Exits → Components 에서 검색
대표적인 MM 모듈 Enhancement 예시:
| Enhancement | 대상 화면 | 담는 것 |
|---|---|---|
MM06E005 |
PO (ME21 / ME22 / ME23) | EXIT_FM · Screen Exit · Menu Exit |
MGA00001 |
자재 마스터 (MM01~03) | 고객 데이터 서브스크린 |
MEREQ001 |
PR (ME51N~53N) | 고객 데이터 추가 영역 |
MB_CF001 |
자재 이동 (MIGO) | Function Exit (저장 시 호출) |
SMOD 에서 Enhancement 이름을 조회하면 컴포넌트 목록(Function Exit · Menu Exit · Screen Exit) 이 보입니다. Screen Exit 항목 옆에 표시된 SAPMxxx + Dynpro 번호(예: SAPMM06E · 0101) 가 회사가 화면을 작성할 빈 서브스크린 슬롯입니다.
2단계 — CMOD 에서 프로젝트 생성
회사 측 프로젝트를 만듭니다. Z 네이밍으로 생성.
CMOD → 프로젝트: ZMM_PO_EXTEND → 생성
→ 짧은 설명: PO 화면 확장 프로젝트
→ 저장 → CTS 선택
프로젝트는 단순 컨테이너. 어떤 Enhancement 를 묶을지 다음 단계에서 결정합니다.
3단계 — 프로젝트에 Enhancement 등록
CMOD → ZMM_PO_EXTEND → Enhancement Assignment 클릭
→ MM06E005 입력 → Enter → 저장
이 시점부터 프로젝트는 MM06E005 가 제공하는 모든 컴포넌트(Function Exit · Menu Exit · Screen Exit) 를 다룰 권한을 가집니다.
제약 — 같은 Enhancement 는 다른 프로젝트와 동시 사용 불가. 다른 활성 프로젝트가 같은 MM06E005 를 이미 점유하고 있다면 에러가 발생합니다. SMOD 에서 "Used in Project" 컬럼을 미리 확인하시기 바랍니다.
4단계 — Components 탭에서 Screen Exit 작성
프로젝트 메뉴에서 Components 버튼 클릭 → Enhancement 의 모든 컴포넌트가 보입니다.
CMOD → ZMM_PO_EXTEND → Components
→ Screen Exits 영역:
- SAPMM06E / 0101 → 더블클릭 → SE51 / SE80 으로 이동
→ 서브스크린 디자인:
- 필드 / 텍스트 / 버튼 배치
- 흐름 로직(PBO / PAI) 작성
→ 저장 → 활성화
화면 디자인은 일반 Dynpro 와 같습니다. 단 유형은 Subscreen 으로. 일반 Dynpro 로 만들면 표준이 끼워 넣지 못합니다.
5단계 — ZX Include 에서 데이터 교환
Screen Exit 의 PBO / PAI 모듈은 ZX* 로 시작하는 Customer Include 에 작성합니다. SMOD Enhancement 에 미리 박혀 있는 빈 Include 입니다.
" ZXM06U22 (Enhancement MM06E005 의 Customer Include 예시)
" 표준 호출: CALL FUNCTION 'EXIT_SAPMM06E_017'
" = 사용자가 PO Item 화면에서 변경 시 호출되는 펑션 exit
" 글로벌 데이터 영역
TABLES: ekko, ekpo.
DATA: gv_zmosen TYPE zmosen.
" PBO 처리
gv_zmosen = ekpo-zmosen.
" PAI 처리는 별도 펑션 exit (EXIT_SAPMM06E_018 등) 에서
ekpo-zmosen = gv_zmosen.
Screen Exit 의 PBO / PAI MODULE 본체는 SAP 가 호출 시점에 자동 진입하며, 회사 코드는 ZX Include 안에 작성합니다.
6단계 — 프로젝트 활성화
가장 중요한 단계입니다. 이 단계를 잊으면 화면이 표시되지 않습니다.
CMOD → ZMM_PO_EXTEND → Project → Activate
→ 활성화 메시지 확인:
"Project ZMM_PO_EXTEND activated"
활성화 직후 ME21N 진입 → 추가한 Customer 탭 / 서브스크린이 표시되어야 정상입니다. 표시 안 되면 다음 함정 섹션을 확인하시기 바랍니다.
7단계 — Screen Exit 없애기 (운영 중 ON / OFF)
CMOD 의 강점은 켜고 끄기가 직관적. 4가지 방법이 있습니다.
| 방법 | 하는 일 | 언제 사용 |
|---|---|---|
| 프로젝트 비활성화 | CMOD → Project → Deactivate |
전체 비활성화. 코드 / 화면은 유지 |
| Enhancement 제거 | Enhancement Assignment 에서 MM06E005 삭제 | 해당 Enhancement 만 빼고 다른 건 유지 |
| 서브스크린 비우기 | SE51 에서 서브스크린의 필드 전부 삭제 | 슬롯은 잡되 화면 표시만 없앰 |
| PBO 에서 전체 숨김 | LOOP AT SCREEN 에서 모든 필드 invisible | 조건부 숨김 (예: 회사 코드 별) |
일반적인 운영 시나리오는 "프로젝트 비활성화". 추후 다시 켜고 싶을 때 재활성화만 하면 즉시 복원됩니다. 코드 / 화면은 그대로 유지되므로 롤백이 안전합니다.
" 방법 4 — 조건부 PBO 숨김 예시
LOOP AT SCREEN.
IF gs_ekpo-bukrs <> '1000'. " 특정 회사만 표시
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
흔히 빠뜨리는 함정
활성화 누락
가장 흔합니다. 화면 / Include 코드 모두 완성했는데 ME21N 에서 안 보이는 가장 큰 원인. CMOD 메뉴 → Project → Activate 한 번 더 확인.
Enhancement 가 다른 프로젝트에 이미 점유
회사가 이미 다른 프로젝트에서 같은 Enhancement(MM06E005 등) 를 사용 중이면 신규 프로젝트에서 등록 불가. 기존 프로젝트의 컴포넌트에 새 작업을 추가 하는 것이 표준 방법입니다. SMOD 의 "Used in Project" 컬럼으로 사전 확인.
Screen 유형 오류
서브스크린 영역에 끼울 화면은 반드시 Type = Subscreen. 일반 Dynpro 로 만들면 SE38 으로 호출은 되지만 표준의 CALL CUSTOMER-SUBSCREEN 에 끼울 수 없습니다.
ZX Include 미저장 / 미활성화
화면은 만들었는데 ZX Include 의 코드를 활성화하지 않으면 PBO / PAI 가 비어 있어 데이터가 화면에 안 나옵니다. 함수 그룹(XM06 같은) 전체를 활성화해야 안전합니다.
CTS 분할
화면(SE51) · ZX Include · CMOD 프로젝트가 각각 다른 CTS 에 담기면 운영 이송 시 일부만 가서 사고. 한 CTS 에 묶거나 같이 가도록 미리 정리.
동일 Enhancement 에 BAdI 가 함께 동작
같은 영역에 BAdI 와 Customer Exit 이 모두 등록된 경우 Customer Exit 이 먼저, 그 다음 BAdI 호출 순서입니다. 두 곳에서 같은 데이터를 다르게 수정하면 의도와 다른 결과가 나옵니다. 활성 상태 점검 시 양쪽 모두 확인.
Upgrade 영향
SAP Release Upgrade(예: ECC → S/4HANA) 시 일부 Customer Exit 이 BAdI 로 마이그레이션되거나 사라질 수 있습니다. SAP Note 에서 Enhancement 이름이 새 버전에서 유지되는지 사전 확인이 안전합니다.
Screen Exit 매핑 위치 헷갈림
한 Enhancement 안에 여러 Screen Exit 슬롯이 있을 수 있습니다(SAPMM06E 0101 · 0111 · 0121). 어떤 슬롯이 어느 탭에 노출되는지는 실제 화면 진입 후 디버깅 으로 확인하는 것이 가장 정확합니다.
CMOD / SMOD ↔ BAdI 선택 기준
CMOD 가 더 적합한 경우:
- ECC / 레거시 모듈로 BAdI 가 제공되지 않는 영역
- 회사 단위의 ON / OFF 전환이 자주 필요한 정책성 화면
- Menu Exit + Screen Exit + Function Exit 을 한 묶음으로 관리
BAdI 가 더 적합한 경우:
- S/4HANA 신규 모듈
- 여러 구현이 동시 활성화돼야 하는 시나리오(Multiple Use)
- OO 인터페이스 기반의 명확한 시그니처가 필요한 경우
- BAdI 정의에 SUBSCRIBE Subscreen 매핑이 있는 영역
같이 보면 좋은 글:
- "Screen Exit 커스텀 필드 추가 — MAP_DYNPRO_FIELDS BAdI 활용 방법" — 표준이 BAdI 슬롯을 미리 만들어 둔 영역에서 단일 필드 추가
- "BAdI 정의로 Screen Exit 구축 — Function Group · Screen · SUBSCRIBE 매핑" — 신규 BAdI 정의로 풀 커스텀 화면
- "BAdI 찾는 방법 5가지 — CL_EXITHANDLER 디버깅·SE84·SXS_ATTR 메타테이블" — 어떤 BAdI / Customer Exit 이 호출되는지 추적
이 세 글과 함께 보면 SAP 의 화면 확장 메커니즘 4가지(Customer Exit / 표준 슬롯 BAdI / 신규 BAdI / Where-Used 추적) 가 한눈에 정리됩니다.
요약
| 단계 | 하는 일 | T-Code / 객체 |
|---|---|---|
| 1 | Enhancement 이름 확인 | SMOD / SE84 |
| 2 | CMOD 프로젝트 생성 | CMOD |
| 3 | Enhancement 등록 | Enhancement Assignment |
| 4 | Screen Exit 화면 작성 | Components → SE51 |
| 5 | ZX Include 코드 작성 | SE38 / SE80 |
| 6 | 프로젝트 활성화 | CMOD → Project → Activate |
| 7 | 비활성화 (ON / OFF) | CMOD → Project → Deactivate |
CMOD / SMOD 는 옛날 방식이지만 "프로젝트 단위로 켜고 끄기" 가 단순하고 직관적 이라 BAdI 가 제공되지 않는 영역이나 운영 ON / OFF 가 잦은 정책 화면에서 여전히 유효한 도구입니다. 신규 개발에서는 BAdI 가 권장되지만, 기존 Customer Exit 이 회사 시스템에 박혀 있다면 그 흐름을 정확히 이해하고 유지하는 것이 중요합니다. 운영 중 임시 비활성화 / 재활성화 시에는 프로젝트 단위 Deactivate / Activate 패턴을 사용하시면 가장 안전합니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
SMOD / CMOD Enhancement 구조 · Screen Exit 작성 흐름 · ZX Include 호출 시점은 SAP NetWeaver 표준(ECC 6.0 / S/4HANA on-premise) 기준이며, Enhancement 이름 · Screen 슬롯 번호 · 회사 Customer Exit 정책에 따라 일부 동작이 다를 수 있으니 운영 시스템 적용 전 개발·QA 환경에서 검증하시기 바랍니다. Upgrade 시 Enhancement 가 마이그레이션 / 폐기될 가능성도 SAP Note 로 사전 확인하시기 바랍니다.