SAP ABAP 개발 환경에서 AI 어시스턴트(Claude Code)를 활용하여 소스 코드를 읽고, 분석하고, 수정할 수 있다면 개발 생산성을 크게 높일 수 있다.
현재 VS Code 계열 에디터(VS Code, Antigravity 등)에서는 abap-fs 확장을 통해 SAP 시스템의 ABAP 오브젝트를 가상 파일시스템(adt://)으로 마운트하고, MCP(Model Context Protocol) 서버를 통해 AI가 읽기 작업은 수행할 수 있다.
그러나 쓰기(저장) 는 제한적이다. 특히 GitHub Copilot은 VS Code Language Model Tool API를 통해 가상 파일시스템에 직접 쓸 수 있지만, Claude Code 같은 외부 AI 도구는 MCP 프로토콜로만 통신하므로 이 경로에 접근할 수 없다.
Claude Code가 ABAP 소스 코드를 수정하고 SAP에 저장할 수 있는 MCP 브리지 확장을 개발한다.
| 항목 | 값 |
|---|---|
| SAP NetWeaver 릴리즈 | 7.40 (ECC) |
| 에디터 | Antigravity (VS Code 포크, 내부 엔진 v1.107) |
| AI 도구 | Claude Code (Anthropic, Opus 모델) |
| MCP 서버 | abap-fs (HTTP, localhost:4847), mcp-abap-adt (stdio) |
| OS | Windows 11 Pro |
개발 과정에서 아키텍처는 3차례 변경되었다.
Claude Code → MCP → abap-writer → ADT REST → SAP
Lock (POST) → Write (PUT) → Unlock
❌ "invalid lock handle" 에러
Claude Code → MCP → abap-writer → abap-adt-api → SAP
동일한 Lock/Write 시퀀스
❌ 동일한 에러 (서버 측 버그)
Claude Code → MCP → abap-writer (VS Code 확장)
📖 ADT REST → SAP (읽기 전용)
✏️ PowerShell → Win32 API → SAP GUI
Ctrl+A → Del → Ctrl+V → Ctrl+S → Ctrl+F3
| 도구 | 용도 | 통신 방식 |
|---|---|---|
abap_read_source | SAP 소스 읽기 | ADT REST (항상 동작) |
modify_buffer | 에디터 버퍼 수정 (DIRTY, 미저장) | VS Code API |
replace_in_buffer | 에디터 버퍼 내 문자열 치환 | VS Code API |
preview_diff | 버퍼 vs SAP 소스 비교 | ADT REST + VS Code API |
sync_to_sapgui | SAP GUI를 통해 저장/활성화 | PowerShell + SendKeys |
check_activation | 활성화 상태 확인 | ADT REST |
syntax_check | 구문 체크 | ADT REST |
buffer_status | 버퍼 열림/DIRTY 상태 확인 | VS Code API |
| 모드 | 동작 |
|---|---|
| manual (추천) | 사용자가 SE38 편집 모드 직접 진입, 스크립트는 붙여넣기/저장/활성화만 |
| checkpoint | 기존 로그인 세션 탐지 후 /nse38로 네비게이션, 각 단계 확인창 |
| full_auto | checkpoint와 동일하지만 확인창 없음 (위험) |
| clipboard_only | 클립보드 복사만, 나머지 수동 |
vsix 패키지에는 node_modules와 .env가 포함되지 않는다. 설치 후 수동 세팅 필요:
시도: CSRF 토큰 획득 후, Lock(POST ?_action=LOCK) → Write(PUT /source/main?lockHandle=...) → Unlock 시퀀스로 소스 저장.
결과:
Lock은 성공하고 Handle도 정상 반환되지만, 이어지는 Write 요청에서 동일한 Handle이 "invalid"로 거부됨.
조사 내용:
X-sap-adt-sessiontype: stateful 헤더 모든 요청에 포함sap-contextid 헤더 캡처 및 재전송abapsource:sourceUri 파싱하여 정확한 URL 사용모든 변형에서 동일한 에러 발생.
시도: abap-fs가 내부적으로 사용하는 abap-adt-api 패키지를 직접 임포트하여 검증된 코드로 Lock/Write 수행.
결과: 동일한 에러. 라이브러리는 정상이며 문제는 서버 측에 있음을 확인.
시도: Windows COM 인터페이스로 SAP GUI 스크립팅 엔진에 접근.
결과: TYPE_E_CANTLOADLIBRARY (0x80029C4A) — 서버 프로파일 파라미터 sapgui/user_scripting이 FALSE 설정.
클라이언트 측 스크립팅은 활성화되어 있었으나, 서버 측 설정 변경은 BASIS 관리자만 가능하여 포기.
시도: PowerShell의 AppActivate(PID) + SendKeys로 SAP GUI 창에 키 입력.
문제:
AppActivate의 Foreground 전환이 불안정saplogon.exe가 여러 자식 창(로그인 선택기, Easy Access, 트랜잭션 세션)을 호스팅하여 PID만으로 타겟팅 모호해결: PowerShell 내 C# 인라인 코드로 Win32 API를 P/Invoke:
| 이슈 | 원인 | 해결 |
|---|---|---|
| PowerShell 한글 깨짐 | PS 5.1이 스크립트를 CP949로 읽음 (UTF-8이 아닌) | 키워드를 ASCII 전용으로 변경 |
C# out _ 구문 에러 | PS 5.1의 C# 컴파일러가 C# 7.0 미지원 | out uint tempPid로 명시적 선언 |
| MessageBox 안 보임 | windowsHide: true로 spawn + 관리자 권한 에디터 | windowsHide: false 변경 |
| 잘못된 창 선택 | 여러 SAP 시스템 연결 시 다른 시스템 창 선택 | ListBox UI 추가 + 세션 패턴 우선 정렬 |
| sapshcut 로그인 대화상자 오인식 | sapshcut가 미로그인 시 로그인 창을 띄움 | sapshcut 제거, 기존 세션에서 /nse38로 네비게이션 |
개발 과정에서 중요한 사실이 확인되었다:
이 차이는 ADT REST API의 엔드포인트별 동작 방식에 기인한다:
POST /sap/bc/adt/programs/includesPOST /sap/bc/adt/activationPOST /source/main?_action=LOCK → Handle 반환PUT /source/main?lockHandle=… → invalidPOST /source/main?_action=UNLOCKLock Handle을 필요로 하는 2-step 작업(Lock → Write)에서만 실패가 발생하며, 1-step 작업(Create, Activate)은 정상 동작한다. 이는 NW 7.40의 ADT REST 서버에서 stateful 세션 간 Lock Handle 검증 로직이 불완전하기 때문이다.
SAP GUI에서는 이 문제가 발생하지 않는다. SAP GUI는 ADT REST API가 아닌 DIAG 프로토콜 (SAP 전용 바이너리 프로토콜)을 사용하며, 자체적인 Lock 메커니즘(SM12 enqueue)을 직접 호출하기 때문이다.
| 구분 | Language Model Tool | MCP Tool |
|---|---|---|
| 통신 방식 | VS Code 내부 API | HTTP / stdio 외부 통신 |
| 사용 가능한 AI | GitHub Copilot (VS Code 내장) | Claude Code, Cursor 등 외부 도구 |
| 가상 파일시스템 쓰기 | 가능 (replace_string_in_file) | 불가능 |
| 정의 위치 | 확장의 package.json → languageModelTools | MCP 서버 구현체 |
abap-fs 확장은 Language Model Tool을 39개 이상 정의하여 Copilot에게 ABAP 편집 기능을 제공한다. 하지만 MCP를 통한 외부 AI 도구에는 읽기 전용 기능만 노출된다.
| NW 버전 | ADT REST 읽기 | ADT REST 쓰기 | 비고 |
|---|---|---|---|
| 7.40 | O | X | abapfs_extensions 설치 시 가능 |
| 7.50 | O | X | abapfs_extensions 설치 시 가능 |
| 7.51+ | O | O | 네이티브 지원 |
| S/4HANA | O | O | 완전 지원 |
GitHub: marcellourbani/abapfs_extensions
NW 7.40/7.50에서 누락된 ADT 쓰기 엔드포인트를 패치하는 ABAP 애드온. SAP 서버에 설치하면 abap-fs의 Ctrl+S 저장 및 ADT REST API를 통한 직접 쓰기가 가능해진다. BASIS 관리자 설치 필요.
| 항목 | SAP GUI Scripting | UI Automation (SendKeys) |
|---|---|---|
| 서버 설정 필요 | 예 (sapgui/user_scripting=TRUE) | 불필요 |
| 정밀도 | 높음 (오브젝트 모델 접근) | 중간 (키 시퀀스 의존) |
| 권한 필요 | S_SCR_CHT 등 | 없음 |
| 창 제어 | COM 인터페이스 | Win32 API (P/Invoke) |
| NW 버전 의존 | 없음 | 없음 |
| 안정성 | 높음 | 포커스 관리에 의존 |
| 기술 | 용도 |
|---|---|
| TypeScript | VS Code 확장 (MCP HTTP 서버, 버퍼 수정 로직) |
| PowerShell 5.1 | SAP GUI 자동화 스크립트 (Win32 API, SendKeys) |
| C# (인라인) | PowerShell 내 Win32 P/Invoke 정의 |
| abap-adt-api (npm) | SAP ADT REST API 클라이언트 (읽기 전용 활용) |
Node.js child_process | PowerShell 스크립트 실행 |
본 프로젝트(abap-writer)는 SAP NetWeaver 7.40 환경의 ADT REST API 쓰기 제한을 우회하기 위해 개발되었다.
그러나 다음과 같은 이유로 개발을 폐기하고 기록으로 남긴다:
ADT REST API의 Lock/Write 2-step 시퀀스 실패는 NW 7.40의 서버 측 버그이다. 클라이언트 측에서 아무리 정교하게 구현해도 서버가 Lock Handle을 거부하는 한 해결 불가.
조직의 PI(Process Innovation) 프로젝트에 따라 SAP 시스템이 상위 NW 버전(7.51+ 또는 S/4HANA)으로 업그레이드될 예정이다. 업그레이드 완료 후에는:
SAP GUI UI Automation(SendKeys)은 동작하지만 다음과 같은 한계가 있다:
NW 7.51+ 또는 S/4HANA 환경에서는 다음 2가지 접근이 모두 유효해진다:
abap-fs의 FileSystemProvider + Language Model Tool
Copilot이 직접 가상 파일시스템에 쓰기 가능
MCP 서버에서 abap-adt-api를 통한 직접 쓰기
Claude Code 등 외부 AI 도구에서 직접 Lock/Write 가능
본 프로젝트의 코드와 문서는 다음과 같은 참고 가치를 가진다:
본 문서는 개발 과정의 고찰을 기록한 것이며, 해당 확장의 소스 코드는 로컬 저장소에 보관된다.