ABAP 디버깅 시리즈
- 1편 (현재 글) 기본편 – 디버거 켜고 한 줄씩 따라가기
- 2편 실전편 – 브레이크포인트·워치포인트와 상황별 디버깅
SAP를 처음 접하면 반드시 부딪히는 순간이 있습니다. 화면에 빨간 에러 메시지가 떴는데 왜 떴는지 알 수 없을 때, 금액이 이상하게 계산됐는데 어느 로직에서 틀어졌는지 감이 안 올 때입니다.
이럴 때 쓰는 도구가 ABAP 디버거(Debugger) 입니다. 프로그램을 한 줄씩 멈춰 세우고 그 순간의 변수 값을 눈으로 확인하게 해주는 도구죠. 개발자 전용 도구가 아니라, 원인 파악이 필요한 기능 컨설턴트에게도 필수입니다.
이번 1편에서는 오늘 바로 따라 할 수 있는 가장 기본적인 사용법을 다룹니다. 소스 코드를 몰라도 됩니다.
목차
0. 시작하기 전 준비
필요한 권한
디버깅은 아무 계정에서나 되지 않습니다. 아래 권한 오브젝트가 필요합니다.
| 권한 오브젝트 | 필드 | 설명 |
|---|---|---|
S_DEVELOP | ACTVT = 03 | 디버깅 화면 조회(Display) |
S_DEVELOP | ACTVT = 02 | 디버깅 중 변수 값 변경 |
권한이 없으면 /h를 입력해도 아무 반응이 없거나 권한 없음 메시지가 뜹니다. 이 경우 Basis 담당자에게 요청해야 합니다.
반드시 지켜야 할 원칙
- 운영(PRD) 시스템에서는 조회 권한만 사용하세요. 변경 권한으로 값을 바꾸면 실제 전표가 잘못 생성될 수 있습니다.
- 연습은 개발(DEV) 또는 테스트(QAS) 시스템에서 하세요.
- 소스에 직접 넣는 브레이크포인트(
BREAK-POINT)는 반드시 삭제 후 이관하세요. 운영에 반영되면 사용자 화면이 디버거로 넘어가는 대형 사고가 납니다.
1. 디버거의 종류부터 알고 갑시다
Classic Debugger (구 디버거)
- 실행 중인 같은 세션 안에서 디버거가 열립니다.
- 화면이 단순하고 가볍지만, 디버거가 세션을 점유해 다른 작업을 병행할 수 없습니다.
- SAP 릴리즈 6.40 이전의 기본 디버거였습니다.
New Debugger (신 디버거) ← 현재 기본값
- 별도의 외부 세션이 새로 열리면서 디버깅됩니다.
- 프로그램 종류(리포트, 다이얼로그, 스마트폼 등)에 관계없이 사용 가능합니다.
- 여러 개의 데스크톱 탭, 인터널 테이블 편집, 오브젝트 비교(Diff), 콜스택 분석 등 기능이 훨씬 많습니다.
- SAP NetWeaver 7.00 이후 기본값입니다.
확인 방법: 디버거 진입 후 메뉴
Debugger → Change Debugger에서 전환할 수 있습니다. 특별한 이유가 없다면 New Debugger를 쓰세요.
ADT (Eclipse) Debugger
S/4HANA, CDS View, RAP 개발을 한다면 SAP GUI가 아니라 Eclipse + ABAP Development Tools에서 디버깅합니다. 여기서 찍는 브레이크포인트는 성격상 External Breakpoint에 해당해서, 백그라운드나 OData 호출까지 잡아낼 수 있습니다. 이 부분은 2편에서 더 자세히 다룹니다.
2. STEP 1 – 가장 쉬운 진입 방법 /h
초보자가 가장 먼저 익혀야 할 방법입니다. 소스 코드 위치를 몰라도 됩니다.
실습 순서
- 디버깅하고 싶은 트랜잭션을 실행합니다. (예:
SE16또는VA03) - 화면 왼쪽 위 커맨드 필드(트랜잭션 코드 입력하는 그 칸)에
/h를 입력하고 Enter를 누릅니다. - 화면 하단에
Debugging switched on메시지가 뜹니다. - 이제 디버깅하고 싶은 동작(실행 버튼 클릭, 저장 클릭, Enter 등)을 수행합니다.
- 디버거 화면이 열립니다.
/h 계열 명령어 정리
| 명령어 | 기능 | 언제 쓰나 |
|---|---|---|
/h | 일반 디버깅 켜기 | 대부분의 경우 이것만 쓰면 됩니다 |
/hs | 시스템 디버깅 + 업데이트 디버깅 | SAP 표준 프로그램, 시스템 프로그램 내부 추적 |
/ha | 화면 처리(PBO/PAI) 건너뛰고 디버깅 | 다이얼로그 화면 로직이 너무 많아 방해될 때 |
핵심 포인트: /h는 “다음에 실행될 ABAP 코드에서 멈춰라”는 뜻입니다. 그래서 /h 입력 → Enter → 그 다음에 동작을 수행해야 합니다. 순서가 바뀌면 잡히지 않습니다.
3. STEP 2 – 디버거 화면 읽는 법
디버거가 열리면 복잡해 보이지만, 실제로는 크게 세 부분입니다.
① 상단 — 소스 코드 영역
현재 실행 중인 프로그램의 소스가 보이고, 노란 화살표(→) 가 “지금 막 실행하려는 줄”을 가리킵니다.
주의: 화살표가 가리키는 줄은 아직 실행되지 않은 줄입니다. 그 줄의 결과를 보려면 한 번 더 진행해야 합니다.
② 하단 — 변수 영역 (Variables)
확인하고 싶은 변수명을 직접 입력하거나, 소스 코드에서 변수를 더블클릭하면 자동으로 등록되고 현재 값이 표시됩니다.
③ 탭 구성
| 탭 | 용도 |
|---|---|
| Standard | 단일 변수 조회 |
| Structures | 구조체(Structure) 필드별 조회 |
| Tables | 인터널 테이블 내용 조회 |
| Objects | 클래스 인스턴스, 오브젝트 참조 조회 |
| Break./Watchpoints | 브레이크포인트/워치포인트 관리 |
Desktop 1/2/3 탭은 자주 쓰는 화면 조합을 저장해두는 개인 작업 공간입니다.
반드시 봐야 할 시스템 변수
| 변수 | 의미 |
|---|---|
SY-SUBRC | 직전 명령 성공 여부. 0이면 성공, 0이 아니면 실패 |
SY-TABIX | LOOP 중 현재 몇 번째 행인지 |
SY-UNAME | 현재 사용자 ID |
SY-DATUM / SY-UZEIT | 현재 날짜 / 시간 |
SY-MSGID / SY-MSGNO | 메시지 클래스 / 메시지 번호 |
SY-SUBRC만 잘 봐도 “SELECT가 데이터를 못 찾았구나”, “READ TABLE이 실패했구나”를 바로 알 수 있습니다.
4. STEP 3 – 실행 제어 단축키 (F5, F6, F7, F8)
디버깅의 90%는 이 네 개로 끝납니다.
| 키 | 이름 | 동작 | 언제 쓰나 |
|---|---|---|---|
| F5 | Single Step (Step Into) | 한 줄 실행. 서브루틴/메서드/펑션모듈이면 안으로 들어감 | 로직을 처음부터 꼼꼼히 따라갈 때 |
| F6 | Execute (Step Over) | 한 줄 실행. 서브루틴/펑션모듈은 통째로 실행하고 넘어감 | 이미 검증된 표준 FM은 건너뛸 때 |
| F7 | Return (Step Out) | 현재 서브루틴/메서드를 끝까지 실행하고 호출한 곳으로 복귀 | 잘못 들어왔을 때 빠져나오기 |
| F8 | Continue | 다음 브레이크포인트까지 쭉 실행. 없으면 프로그램 종료 | 확인이 끝났을 때 |
초보자가 가장 많이 하는 실수
F5를 계속 눌러서 SAP 표준 코드 깊숙이 들어가 버리는 것입니다. 모르는 표준 FM을 만나면 F6, 실수로 들어갔으면 F7로 나오면 됩니다.
유용한 부가 기능: Goto Statement
특정 구문을 건너뛰거나 이전 줄로 되돌아가고 싶을 때가 있습니다.
- 이동하고 싶은 줄을 클릭
- 마우스 우클릭 → Goto Statement
단, IF 조건을 억지로 통과시키는 등 실제 흐름과 다르게 만들 수 있으니 원인 분석 용도로만 쓰세요.
5. STEP 4 – 첫 브레이크포인트 찍어보기
/h는 편하지만 “프로그램의 특정 지점”에서 멈추게 할 수는 없습니다. 그때 쓰는 게 브레이크포인트(중단점)입니다. 여기서는 가장 기본이 되는 두 가지만 다루고, 종류별 차이와 활용은 2편에서 이어집니다.
방법 A. 에디터에서 클릭 (가장 많이 쓰는 방법)
SE38(리포트) 또는SE80,SE37(펑션모듈)로 소스를 엽니다.- 멈추고 싶은 줄에 커서를 놓습니다.
- 툴바의 정지 표시 아이콘(Set/Delete Breakpoint) 클릭 또는 Ctrl + Shift + F12
- 줄 왼쪽에 정지 아이콘이 생깁니다.
F8로 프로그램을 실행하면 그 줄에서 자동으로 디버거가 열립니다.
중요: 브레이크포인트는 실행 가능한 줄에만 걸립니다. 주석(
*,"),DATA/TYPES같은 선언문, 빈 줄에는 걸리지 않습니다.
방법 B. 소스 코드에 직접 삽입 (Static Breakpoint)
abap
* 모든 사용자에게 항상 동작 — 매우 위험
BREAK-POINT.
* 지정한 사용자 ID에게만 동작 — 그나마 안전
BREAK punes.
실무에서는 권장하지 않습니다. 이관 전에 지우는 걸 잊으면 운영 사고로 직결됩니다. 굳이 쓴다면 BREAK <USER_ID> 형태를 쓰고, 이관 체크리스트에 삭제 항목을 넣어두세요.
6. STEP 5 – 값 확인하기
단일 변수
소스 코드에서 변수명을 더블클릭 → 하단 변수 영역에 자동 등록되고 값이 표시됩니다.
인터널 테이블
Tables탭 클릭- 인터널 테이블명 입력 (예:
LT_BSEG) - Table Contents 영역에 행 데이터가 표시됩니다
또는 소스에서 인터널 테이블을 더블클릭해도 열립니다.
콜스택(Call Stack) 읽기
디버거 화면의 Call Stack 영역을 보면 “지금 이 코드가 어디서 호출됐는지”가 위에서 아래로 표시됩니다. 원인이 현재 위치가 아니라 호출한 쪽에 있는 경우가 많기 때문에, 습관적으로 확인하는 게 좋습니다. 스택 항목을 더블클릭하면 그 지점의 소스로 이동합니다.
7. 여기까지의 정리
1편에서 익힌 것은 이렇습니다.
- 진입:
/h또는 에디터 브레이크포인트 - 이동: F5 / F6 / F7 / F8
- 확인: 변수 더블클릭, 상태 판단은
SY-SUBRC
이 세 가지만 손에 익어도 단순한 리포트의 흐름은 충분히 따라갈 수 있습니다. 지금 바로 개발 시스템에서 간단한 리포트를 하나 열어 /h를 입력하고 F5를 눌러보세요. 한 시간만 만져보면 감이 잡힙니다.
하지만 실무에서 마주치는 문제들, 예를 들어
- 에러 메시지가 어디서 발생했는지 찾기
- 변수 값이 어느 시점에 오염되는지 추적하기
- 백그라운드 잡이나 RFC 인터페이스 디버깅하기
같은 상황은 기본 조작만으로는 해결되지 않습니다.
👉 2편 실전편 – 브레이크포인트·워치포인트와 상황별 디버깅 에서 이어집니다.
