이 글에서 얻어갈 것과 체크리스트
ABAP 개발자에게 Git은 오랫동안 낯선 도구였습니다. SE80/ADT의 트랜스포트 요청(TR)이 사실상의 버전 관리 역할을 해왔기 때문입니다. 하지만 클라우드 전환과 오픈소스 생태계가 확산되면서, ABAP 코드도 GitHub/GitLab에 저장하고 브랜치로 협업하는 것이 사실상의 표준이 되어가고 있습니다. abapGit은 이 간극을 메우는 오픈소스 프로젝트로, on-premise ABAP 시스템의 리포지터리 오브젝트를 Git 저장소와 동기화합니다.
이 글을 끝까지 따라오면 다음을 할 수 있습니다.
- abapGit 클라이언트를 ABAP 시스템에 설치하고 SSL 신뢰 저장소를 준비한다
- ZCL_로 시작하는 로컬 패키지를 GitHub 원격 저장소와 연결(Online Repo)한다
- 변경한 클래스/프로그램을 Stage → Commit → Push 흐름으로 GitHub에 반영한다
- 다른 개발자가 Push한 변경을 Pull 받아 로컬 시스템에 적용한다
- DEVC(패키지), 트랜스포트, 사용자 매핑 관련 오류를 스스로 진단한다
미리 알아두면 좋은 배경
ABAP Workbench(SE80) 또는 ADT(Eclipse for ABAP)의 기본 사용법, 패키지(DEVC)와 트랜스포트 요청 개념, 그리고 Git의 add/commit/push/pull 흐름을 대략이라도 알고 있으면 이 글의 실습을 매끄럽게 진행할 수 있습니다. GitHub 계정과 Personal Access Token(PAT) 발급 방법도 미리 익혀두는 것을 권장합니다.
환경 준비와 지원 릴리스
abapGit은 커뮤니티가 관리하는 오픈소스이므로 라이선스는 MIT이며, SAP의 공식 제품은 아닙니다. 다만 SAP 내부/외부에서 널리 사용되고 있으며 실무 도입 사례가 많습니다.
- 지원 릴리스: SAP_BASIS 7.02 이상. 실무에서는 NetWeaver 7.4 SP08 이상, S/4HANA 1909 이상에서 안정적으로 동작한다고 알려져 있습니다.
- SAP BTP ABAP Environment / Steampunk: abapGit의 developer edition은 지원되지 않고, SAP가 제공하는 gCTS 및 ADT의 abapGit Repositories 뷰를 사용해야 합니다.
- 클라이언트 형태: SAP GUI 기반 standalone 리포트(ZABAPGIT)와 ADT용 플러그인 두 가지가 있습니다. 이 글은 standalone 방식을 기준으로 합니다.
- 사전 조치: STRUST에 GitHub 인증서 등록, SICF 서비스 활성화(필요 시), 개발자 사용자에게 S_DEVELOP, S_TRANSPORT 권한 부여.
- 네트워크: ABAP 시스템에서
github.com(443)으로의 아웃바운드 HTTPS 통신 허용.
abapGit이 하는 일과 동작 원리
일반적인 Git은 파일 시스템의 텍스트 파일을 SHA-1 해시로 스냅샷 삼아 관리합니다. 그런데 ABAP 오브젝트는 파일이 아니라 데이터베이스 테이블(TADIR, REPOSRC, DD02L 등)에 저장됩니다. 즉 Git과 ABAP 저장소 사이에는 "번역기"가 필요합니다. abapGit이 바로 그 번역기 역할을 합니다.
비유하자면 abapGit은 "ABAP 세상의 언어(TADIR)"와 "Git 세상의 언어(blob/tree)" 사이의 통역사입니다. Push할 때는 클래스/프로그램을 XML+ABAP 소스로 직렬화(serialize)해 파일로 만들고, Pull할 때는 다시 역직렬화(deserialize)해 SAP 시스템의 DDIC로 되돌립니다.
핵심 개념을 정리하면 다음과 같습니다.
- Serializer: 오브젝트 타입(CLAS, PROG, DTEL, DOMA, TABL 등)별로 하나씩 존재합니다. 예를 들어 CLAS는
ZCL_ORDER_MANAGER.clas.abap과.clas.xml두 파일로 나뉘어 저장됩니다. - Package = Repository: abapGit은 SAP 패키지(DEVC) 하나를 Git 저장소 하나에 매핑합니다. 하위 패키지는 서브폴더로 표현됩니다.
- Stage 화면: 로컬 SAP의 오브젝트 상태와 Git의 상태를 비교해, 어떤 오브젝트를 add/rm/ignore할지 선택하는 화면입니다. Git의 스테이징 영역과 개념이 같습니다.
- Online vs Offline Repo: Online은 HTTPS로 GitHub와 직접 연결, Offline은 ZIP 파일로 주고받는 방식입니다. 방화벽이 막힌 폐쇄망에서는 Offline을 씁니다.
- dot-abapgit.xml: 저장소 루트의 설정 파일로, master language, starting folder, ignore 패턴 등을 정의합니다.
ABAP 개발자 관점에서 특히 중요한 점은, abapGit은 트랜스포트를 대체하지 않는다는 것입니다. 코드 이력은 Git에서, 시스템 간 배포는 여전히 TR(또는 gCTS/CTS+)에서 관리하는 것이 일반적입니다.
실전 3단계
1단계 — abapGit 설치와 첫 리포지터리 연결
abapGit standalone은 단 하나의 리포트 프로그램입니다. GitHub의 abapGit/abapGit 저장소에서 zabapgit_standalone.prog.abap 원본을 내려받아 SE38에 붙여 넣기만 하면 됩니다.
*&---------------------------------------------------------------------*
*& Report ZABAPGIT_STANDALONE
*&---------------------------------------------------------------------*
REPORT zabapgit_standalone LINE-SIZE 100.
* 여기에 GitHub에서 복사한 abapGit 소스 전체를 붙여넣습니다.
* 파일 크기는 수 MB 수준이므로, SE38이 아닌 GUI 스크립트나
* ADT의 대용량 편집을 사용하는 것이 편합니다.
저장 후 SE38에서 ZABAPGIT_STANDALONE을 실행하면 SAP GUI 창에 abapGit 메인 화면이 뜹니다. 처음 실행하면 "no repositories" 상태입니다. 상단의 New Online 버튼으로 다음과 같이 첫 저장소를 연결합니다.
Git repository URL: https://github.com/my-team/zorder-mgmt.git
Package: $ZORDER_MGMT # 로컬 패키지($ 접두)로 먼저 실험
Branch: refs/heads/main
Folder logic: PREFIX
Ignore subpackages: unchecked
이때 처음 접속하면 SSL 인증서 오류가 날 수 있습니다. STRUST에서 SSL client SSL Client (Anonymous) 노드에 GitHub 루트 인증서를 등록해야 합니다.
2단계 — 실무 시나리오: 클래스 변경을 GitHub에 Push
주문 관리 도메인의 유틸리티 클래스 ZCL_ORDER_PRICE_CALC를 예로 들겠습니다. 실무에서는 에러 처리와 로깅이 함께 들어가야 합니다.
CLASS zcl_order_price_calc DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_order_line,
material_id TYPE matnr,
quantity TYPE i,
unit_price TYPE p LENGTH 15 DECIMALS 2,
END OF ty_order_line,
tt_order_line TYPE STANDARD TABLE OF ty_order_line WITH EMPTY KEY.
CLASS-METHODS calculate_total
IMPORTING it_lines TYPE tt_order_line
RETURNING VALUE(rv_total) TYPE p
RAISING cx_sy_arithmetic_overflow.
PRIVATE SECTION.
CLASS-METHODS log_error
IMPORTING iv_message TYPE string.
ENDCLASS.
CLASS zcl_order_price_calc IMPLEMENTATION.
METHOD calculate_total.
TRY.
LOOP AT it_lines ASSIGNING FIELD-SYMBOL(<ls>).
rv_total = rv_total + ( <ls>-quantity * <ls>-unit_price ).
ENDLOOP.
CATCH cx_sy_arithmetic_overflow INTO DATA(lx_overflow).
log_error( |Overflow at total calc: { lx_overflow->get_text( ) }| ).
RAISE EXCEPTION lx_overflow.
ENDTRY.
ENDMETHOD.
METHOD log_error.
MESSAGE iv_message TYPE 'E' DISPLAY LIKE 'I'.
ENDMETHOD.
ENDCLASS.
클래스를 활성화한 뒤 abapGit 메인 → 해당 리포지터리 더블클릭 → Stage 버튼을 누르면 변경된 파일 목록이 뜹니다. zcl_order_price_calc.clas.abap 옆의 add를 눌러 스테이징한 뒤 Commit을 누르고 다음 정보를 입력합니다.
Committer name: Jin Ju Sim
Committer email: jinju@example.com
Comment: feat(order): add total price calculator with overflow guard
Body: - handles CX_SY_ARITHMETIC_OVERFLOW
- logs message before rethrow
Branch: refs/heads/feature/order-calc
커밋 시 GitHub의 사용자명과 Personal Access Token을 요구합니다. 비밀번호 필드에 PAT를 넣으면 됩니다. 정상적으로 Push되면 GitHub 웹 UI에서 src/zcl_order_price_calc.clas.abap 파일을 확인할 수 있습니다.
3단계 — 프로덕션: 브랜치 전략, CI, 보안
단순히 개인 개발용으로 abapGit을 쓸 때와, 팀·프로덕션 환경에서 쓸 때는 요구 수준이 다릅니다. 프로덕션 도입 시 권장 설정을 정리합니다.
{
"master_language": "E",
"starting_folder": "/src/",
"folder_logic": "PREFIX",
"ignore": [
"/.gitignore",
"/LICENSE",
"/README.md",
"/package.devc.xml"
],
"requirements": [
{ "component": "SAP_BASIS", "min_release": "754", "min_patch": "0" }
]
}
위 .abapgit.xml은 저장소 루트에 두는 abapGit 설정 파일입니다. 최소 SAP_BASIS 릴리스를 명시해두면, 낮은 시스템에서 실수로 Pull하는 사고를 예방할 수 있습니다.
그리고 abapGit이 Push한 코드에 대해 abaplint 기반 lint를 CI에서 돌리는 것을 권장합니다. GitHub Actions 예시입니다.
name: abaplint
on:
push:
branches: [ main, "feature/**" ]
pull_request:
branches: [ main ]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "20"
- run: npm i -g @abaplint/cli
- run: abaplint
보안 측면에서는 다음을 반드시 지켜야 합니다.
- GitHub 인증에 비밀번호 대신 PAT/OAuth를 사용하고, PAT는 최소 권한(repo scope)으로 제한합니다.
- 고객 데이터, 하드코딩된 비밀번호, 내부 URL 등이 소스에 남지 않도록 pre-commit review를 수행합니다.
- 운영 시스템(PRD)에서는 Pull만 허용하고 Push는 차단하는 것이 일반적입니다. abapGit은 사용자 exit(
ZCL_ABAPGIT_USER_EXIT)로 이런 정책을 코드로 강제할 수 있습니다.
자주 마주치는 오류와 FAQ
Q1. STRUST에서 인증서를 등록했는데도 SSL handshake 오류가 납니다.
가장 흔한 원인은 PSE 노드를 잘못 골랐다는 것입니다. abapGit은 ICM 기반 HTTPS 클라이언트를 사용하므로 SSL client SSL Client (Standard)에 GitHub 체인 3장(Root, Intermediate, Leaf)을 모두 넣어야 합니다. 등록 후 ICM 재시작(SMICM)도 잊지 마세요.
Q2. Push는 성공했는데 GitHub에 파일이 안 보입니다.
Branch 이름을 확인하세요. abapGit 기본값이 refs/heads/master인데, GitHub 신규 저장소 기본 브랜치는 main입니다. abapGit의 Advanced → Change branch에서 refs/heads/main으로 바꾼 뒤 다시 Push해야 합니다.
Q3. Pull할 때 "Object type CLAS not supported" 같은 오류가 납니다.
현재 abapGit 버전이 오래되어 해당 오브젝트의 시리얼라이저가 없는 경우입니다. abapGit 자체를 최신 zabapgit_standalone으로 업데이트하거나, 온라인 화면 상단의 Update 버튼을 쓰세요. 참고로 매우 특수한 오브젝트 타입(BSP, SICF 일부)은 릴리스에 따라 지원 여부가 다릅니다.
기타 주의사항
- 로컬 패키지($ 접두)는 트랜스포트가 불필요하지만, 정식 패키지(Z*)로 Pull하면 Transport Request 선택창이 뜹니다. TR 없이 진행하면 rollback이 강제됩니다.
- Include, function group, 다국어 텍스트 요소는 개별 파일이 아니라 상위 오브젝트 폴더에 함께 저장됩니다. 이를 모르고 파일을 개별 삭제하면 정합성이 깨집니다.
- 같은 오브젝트를 두 명이 동시에 수정하면 Pull 시 conflict가 발생합니다. abapGit은 3-way merge를 하지 않으므로, 먼저 Pull → 로컬 수정 재적용 → Push 순서를 팀 규칙으로 정해야 합니다.
abapGit 이후 확장 주제
abapGit이 손에 익었다면 다음 주제로 확장해 보세요. gCTS(Git-enabled CTS)는 SAP가 제공하는 유사 기능으로, 시스템 간 전송까지 Git 기반으로 관리합니다. abapGit이 개발자 중심 도구라면, gCTS는 Basis/운영 관점의 도구입니다. 또한 abaplint로 코드 품질을 자동 검사하고, ABAP unit test를 GitHub Actions에서 원격 호출(RFC/OData)로 돌리는 파이프라인도 도전해볼 만합니다. 마지막으로 SAP BTP ABAP Environment에서는 ADT의 abapGit Repositories 뷰가 별도로 제공되므로, on-prem과 클라우드의 차이를 정리해두면 도움이 됩니다.
댓글 0
아직 댓글이 없습니다.