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

[SAP ABAP] CMOD / SMOD Screen Exit 만들기·없애기 — Customer Exit Project 활성화·비활성화 (Enhancement Assignment)

by Song.sh 2026. 5. 21.

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 화면 작성 ComponentsSE51
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 로 사전 확인하시기 바랍니다.