SAP 표준 트랜잭션에 자체 로직을 끼워 넣어야 할 때 가장 먼저 부딪히는 질문은 "이 화면에 사용 가능한 BAdI 가 무엇이 있는가" 입니다. 정의된 BAdI 가 명확히 보이지 않으면 표준 코드를 수정하는 위험한 길로 가게 되고, 반대로 정확한 BAdI 만 찾아내면 표준 영향 없이 안전하게 확장할 수 있습니다.
BAdI 는 SAP 가 표준 흐름 곳곳에 미리 박아둔 "확장 포인트" 입니다. 화면 진입·저장·체크·취소 같은 핵심 시점마다 SAP 가 cl_exithandler=>get_instance 를 호출해서 등록된 구현체에 흐름을 넘겨주는 구조입니다. 그래서 "어떤 BAdI 가 호출되는지" 를 알아내는 표준 방법은 곧 이 호출 지점을 추적하는 일과 같습니다.
이 글에서는 BAdI 찾기 방법을 두 가지 시나리오로 정리합니다. (1) 특정 프로그램·트랜잭션이 사용할 수 있는 BAdI 목록을 한 번에 보고 싶을 때, (2) 트랜잭션을 실제로 실행하면서 그 흐름에 호출되는 BAdI 만 골라내고 싶을 때. 실무에서는 두 방법을 모두 익혀두고 상황에 맞게 골라 써야 합니다.
핵심 — BAdI 종류와 찾는 방식의 차이
BAdI 는 크게 Classic BAdI (SE18/SE19) 와 Kernel BAdI / Enhancement Spot (ENHS) 두 종류로 나뉩니다. 둘 다 결국 인터페이스 호출이지만 정의·관리 트랜잭션이 다르므로 찾는 도구도 살짝 다릅니다. 화면 동작과는 별개로 어떤 종류인지에 따라 검색 시작점이 달라집니다.
| 🔍 구분 | Classic BAdI | Kernel BAdI (Enhancement Spot) |
|---|---|---|
| 정의 T-Code | SE18 |
SE18 (Enhancement Spot 모드) / SE80 |
| 구현 T-Code | SE19 |
SE19 (New BAdI 모드) |
| 호출 패턴 | cl_exithandler=>get_instance |
GET BADI / CALL BADI |
| 저장 테이블 | SXS_ATTR / SXS_INTER |
ENH_SPOT / BADI_DEF |
| 다중 활성 | 기본 단일 — Multiple Use 플래그 필요 | 기본 다중 가능 |
| 주 사용 시점 | ECC / 레거시 모듈 | 최근 NetWeaver / S/4HANA 신규 모듈 |
호출 패턴 차이가 중요합니다. Classic BAdI 는 거의 항상 cl_exithandler=>get_instance 한 줄을 거쳐 호출됩니다. 그래서 그 메소드에 브레이크포인트 하나 걸어두면 트랜잭션 실행 중 통과하는 모든 Classic BAdI 를 잡을 수 있습니다. Kernel BAdI 는 GET BADI 키워드로 호출되므로 별도 추적이 필요하지만 실무에서 마주치는 비중은 Classic 이 압도적입니다.
1단계 — SE84 로 키워드 검색 (이름의 일부라도 알 때)
이름 일부나 기능명을 알고 있다면 가장 빠른 방법은 SE84 (Repository Information System) 입니다. Enhancement 카테고리 안에 BAdI 정의·구현이 모두 정리되어 있습니다.
SE84
→ Enhancements
→ Business Add-Ins
→ Definitions (BAdI 정의 검색)
→ Implementations (BAdI 구현 검색)
검색 화면에서 BAdI 이름·패키지·짧은 설명 필드에 와일드카드(MATERIAL / ME21N) 로 검색합니다. SAP 가 어느 BAdI 를 어느 패키지에 분류해 두었는지 한눈에 확인 가능합니다.
이 방식은 "MM01 자재 마스터 저장 시 체크 로직" 같이 개념이 머릿속에 있을 때 적합합니다. 단점은 SAP 가 분류한 키워드와 실무에서 사용하는 키워드가 항상 일치하지 않는다는 점입니다. 키워드만으로 안 보일 때는 다음 단계로 넘어갑니다.
2단계 — 패키지 추적으로 후보 BAdI 좁히기
T-Code 가 속한 패키지를 먼저 알아낸 다음, 그 패키지에 정의된 모든 BAdI 를 한 번에 조회 하는 방법입니다.
1) SE93에 T-Code 입력 → 디스플레이
2) "프로그램" 필드에서 메인 프로그램명 확인
3) SE80 → 프로그램 입력 → 속성에서 "패키지" 확인
4) SE84 → Enhancements → Business Add-Ins → Definitions
→ "Package" 필드에 위 패키지명 입력 → 실행
같은 패키지 안의 BAdI 는 같은 업무 영역에 묶여 있을 가능성이 높습니다. 예를 들어 자재 마스터(MGA · MG) 패키지를 잡고 검색하면 BADI_MATERIAL_CHECK · BADI_MATERIAL_REF · BADI_MATN1 같은 후보가 한꺼번에 나옵니다.
상위 패키지(APPLICATION_LOGISTICS 같은) 까지 펼치면 후보가 너무 많아지므로, 가능한 한 가장 좁은 sub-package 부터 검색하는 게 효율적입니다.
3단계 — CL_EXITHANDLER=>GET_INSTANCE 디버깅 (가장 강력한 방법)
실무에서 가장 자주 쓰이는 방법입니다. 모든 Classic BAdI 는 cl_exithandler=>get_instance 를 거쳐 인스턴스화되므로 이 메소드에 외부 브레이크포인트를 걸어두면 트랜잭션을 실행하면서 통과하는 모든 BAdI 가 자동으로 디버거에 멈춥니다.
1) SE24 → 클래스명 CL_EXITHANDLER 입력 → 디스플레이
2) 메소드 목록에서 GET_INSTANCE 더블클릭
3) 메소드 소스 안의 적절한 라인에 외부 브레이크포인트 설정
- 추천 위치: EXIT_NAME 파라미터를 읽는 첫 라인
4) 분석할 T-Code 실행 (예: MM03)
5) 화면 진입·저장·체크 같은 동작을 하나씩 수행
6) 디버거가 멈출 때마다 변수 EXIT_NAME 값 확인
→ 그 값이 곧 그 시점에 호출되는 BAdI 이름
이 방법의 진가는 "내가 이 버튼을 누를 때 호출되는 BAdI" 를 정확히 잡아낼 수 있다는 점입니다. SE84 검색은 "이 영역에 어떤 BAdI 가 있는가" 까지만 답해주지만 디버거 추적은 "내가 지금 만지는 흐름이 어떤 BAdI 를 거치는가" 를 직접 보여줍니다.
추가 팁으로, 세션 브레이크포인트 대신 외부 브레이크포인트 로 걸어두면 다른 사용자(예: 사용자 ID 가 다른 화면 호출자) 흐름까지 잡힙니다. 다만 운영기에서는 외부 BP 가 광범위하게 걸리므로 개발기·QA 환경에서만 사용하시기 바랍니다.
4단계 — SXS_ATTR / SXS_INTER 테이블 직접 조회
BAdI 정의는 메타데이터 테이블에 저장되어 있어서 SE16/SE16N 로 직접 조회할 수도 있습니다. 화면 도구 없이 SQL 감각으로 빠르게 훑고 싶을 때 유용합니다.
| 📋 테이블 | 담는 정보 |
|---|---|
SXS_ATTR |
Classic BAdI 정의 속성 (이름·패키지·필터 여부·다중 사용 여부) |
SXS_INTER |
BAdI 와 인터페이스 매핑 (인터페이스명 ↔ BAdI 이름) |
SXC_EXIT |
활성화된 BAdI 구현 매핑 |
ENH_BADI_IMPL |
Kernel BAdI 의 활성 구현 목록 |
예시: SXS_ATTR 에서 EXIT_NAME = 'BADI_MATERIAL' 로 검색하면 자재 마스터 관련 Classic BAdI 정의가 일괄 조회됩니다. 검색이 안 잡힐 때 SAP 명명 규칙(BADI_·BADI·EXIT) 를 와일드카드로 흩뿌리는 게 요령입니다.
5단계 — Where-Used List 로 BAdI 호출 위치 역추적
BAdI 이름을 알아낸 후, 그 BAdI 가 표준 코드 어디서 호출되는지 를 확인하면 호출 시점·전후 컨텍스트를 더 명확히 파악할 수 있습니다.
1) SE24 → 클래스 CL_EXITHANDLER → 메소드 GET_INSTANCE
2) Where-Used List 호출 (Ctrl+Shift+F3)
3) 호출 위치 목록에서 관심 패키지 / 함수 그룹 으로 필터
4) 또는 SE11에서 BAdI 인터페이스명(IF_EX_*) 더블클릭
→ Where-Used → "Programs" 선택
호출 위치를 알면 BAdI 가 어떤 데이터 상태에서 호출되는지 (예: 저장 전 / 저장 후 / 화면 PAI 시점) 가 명확해집니다. 같은 트랜잭션이라도 시점에 따라 사용 가능한 데이터가 다르므로 이 단계가 BAdI 선택의 마지막 검증이 됩니다.
흔히 빠뜨리는 함정
Multiple Use 가 아닌 Classic BAdI 는 1개만 활성화
Classic BAdI 정의에 Multiple Use 플래그가 꺼져 있으면 같은 시점에 활성 구현체가 단 하나만 동작합니다. 다른 회사가 이미 구현해 둔 상태에서 추가 구현을 활성화하면 SINGLE_EXIT_MULTIPLY_ACTIVE 예외가 발생합니다. 구현 활성화 전 반드시 정의 화면에서 Multiple Use 여부를 확인하시기 바랍니다.
Filter-Dependent BAdI 는 필터값에 따라 다른 구현 호출
일부 BAdI 는 Filter (예: 회사 코드·플랜트·자재 유형) 에 따라 다른 구현체가 호출되도록 설계되어 있습니다. 디버거에서 한 흐름만 잡아보면 다른 필터 케이스에서 호출되는 구현이 무엇인지 알 수 없으므로 SXS_ATTR 의 FLT_TYPE 컬럼을 함께 확인해야 합니다.
Kernel BAdI 는 GET_INSTANCE 안 거침
Kernel(신) BAdI 는 GET BADI · CALL BADI 키워드로 호출되므로 CL_EXITHANDLER 브레이크포인트로는 잡히지 않습니다. SAT (Runtime Analysis) 의 호출 트레이스를 뜨거나, 메인 프로그램을 SE80 에서 열어 키워드 검색하는 방식으로 보강해야 합니다.
"User-Exit / Customer-Exit" 는 BAdI 와 다른 메커니즘
이름이 비슷한 SMOD/CMOD User-Exit 은 인터페이스 기반이 아니라 Include 기반 입니다. BAdI 검색 도구로는 잡히지 않으므로 SMOD 의 Enhancement 분류로 별도 조회해야 합니다. "확장 가능한 표준 지점" 을 통합으로 보고 싶다면 SE84 의 Enhancements → Customer Exits / Business Add-Ins 두 노드를 모두 탐색해야 합니다.
Implementation 화면에서 본 BAdI 가 다 활성된 것은 아님
SE19 에서 구현이 표시된다고 모두 호출되는 것은 아닙니다. Active 플래그 + Filter 매칭 + Implementation 의 Switch 활성 여부까지 모두 맞아야 실제 호출됩니다. 디버거에서 호출이 안 보이면 활성 상태를 다시 확인하시기 바랍니다.
실전 예시 — MM03 자재 마스터 조회 흐름에서 BAdI 찾기
가장 자주 마주치는 시나리오로 MM03 (자재 마스터 조회) 진입 시 호출되는 BAdI 를 찾아보겠습니다.
1) SE24 → CL_EXITHANDLER → GET_INSTANCE
→ 외부 브레이크포인트 설정
2) MM03 실행 → 자재 입력 → Enter
3) View 선택 화면에서 Basic Data 1 선택 → Enter
4) 디버거가 멈출 때마다 EXIT_NAME 값 메모:
- BADI_MATERIAL_CHECK (자재 데이터 체크)
- BADI_MATERIAL_REF (참조 자재 처리)
- BADI_MATERIAL_OD (조직 데이터 결정)
5) 저장 시점에서 추가로 호출되는 BAdI 확인 :
- BADI_MATERIAL_SAVE
- BADI_MATERIAL_UPDATE
이렇게 얻은 BAdI 목록 중 목적에 가장 가까운 시점 의 BAdI 를 골라 구현합니다. 자재 코드 형식 체크라면 BADI_MATERIAL_CHECK, 저장 후 외부 시스템 연동이라면 BADI_MATERIAL_UPDATE 가 적합합니다. 비슷한 시점이 여러 개 보일 때는 인터페이스의 메소드 시그니처와 Importing/Changing 파라미터를 비교해서 다루고자 하는 데이터에 접근 가능한 BAdI 를 선택하면 됩니다.
같이 보면 좋은 글은 "MM01~03 BAdI 제한 로직 거는 곳 — BADI_MATERIAL_CHECK CHECK_DATA" 입니다.
요약
| 단계 | 방법 | 언제 사용 |
|---|---|---|
| 1 | SE84 키워드 검색 |
이름·기능명을 대충 알 때 |
| 2 | 패키지 추적 후 SE84 Package 검색 |
T-Code 만 알 때 후보 좁히기 |
| 3 | CL_EXITHANDLER=>GET_INSTANCE 디버깅 |
실행 흐름에 실제 호출되는 BAdI 추적 |
| 4 | SXS_ATTR / SXS_INTER 테이블 직접 조회 |
메타데이터로 빠르게 훑기 |
| 5 | Where-Used List 역추적 | 호출 시점·컨텍스트 최종 검증 |
BAdI 를 찾는 가장 확실한 길은 "이름으로 검색하는 정적 방법" 과 "실행하며 추적하는 동적 방법" 을 함께 쓰는 것 입니다. 정적 검색으로 후보를 좁히고, 디버거로 실제 호출 시점을 확인한 다음, Where-Used 로 호출 컨텍스트까지 검증하면 표준 흐름을 건드리지 않고도 정확한 확장 포인트를 잡아낼 수 있습니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
BAdI 종류·테이블 구조·메소드명은 SAP NetWeaver 표준(ECC 6.0 / S/4HANA on-premise) 기준이며, 사내 환경의 커스터마이징·릴리스에 따라 일부 동작이 다를 수 있으니 운영 시스템 적용 전 개발·QA 환경에서 검증하시기 바랍니다.