개요
회사에서 DE 직무로 근무하며 현재는 Data Hub를 구축하는 업무를 진행하고 있다.
원천 시스템이 RDB (Oracle / MariaDB / Tibero / ...)가 아닌 SAP인 경우가 많이 존재했고, 이는 나에게 굉장한 혼란을 주었다.
그 이유는 ....
나는 SAP이 뭔지 몰랐다. (ASAP은 안다). SAP이라는 시스템이 뭔지 잘 모르는 상황에서, 데이터를 수집하여 Hub 구축을 진행해야 했다.
이 포스팅을 읽는 사람들 중, SAP을 개발하시는 분이라면 아래와 같이 생각할 수 있다.
SAP 솔루션 쓰면 모든게 해결되지 않나...???
회사에서 SAP 솔루션이나 SAP BW를 사용하면 데이터 추출 / 수정 등의 관리가 용이하지만, 현재 우리 회사는 안타깝게도 따로 어떠한 솔루션을 사용하고 있지 않다. 이에, PyRFC라는 라이브러리를 활용하여 SAP 내부의 Function Module을 호출하고, 이를 통해 SAP 시스템 내부의 테이블 / 컬럼 등의 정보를 추출하여 Hub 구축을 진행하고 있다.
이번 게시글에선 SAP을 처음 사용해보며 유용하다고 느낀 기능들을 정리해보고자 한다.
SAP GUI
처음 SAP GUI를 들어가면 굉장히 옛날 시스템적인?? 디자인이 나를 맞이해준다.
아무거나 클릭해보고 싶지만, 관리자가 아닌 권한을 발급받아 접근하는 개발자 입장에선 조심히 사용해야 할 필요가 있다.
현재 나는 MAC용을 사용하고 있고, 설치는 링크에서 진행할 수 있다.
Topbar를 유심히 보면, 좌측 상단에 트랜잭션 코드를 입력할 수 있는 검색창이 존재한다.
트랜잭션 코드는 일종의 "나 이거 하고싶은데 어디로 이동해야하지?"와 동일하다고 생각하면 좋다.
가장 실용적이면서 SAP 시스템을 사용할 때 필요한 트랜잭션 코드를 확인해보자
ABAP Dictionary
"SE11"을 검색하면, ABAP Dictionary가 나오게 된다. 해당 트랜잭션은 SAP에서 사용되는 데이터 구조 및 속성을 정리하여 관리할 수 있는 부분이다. 즉, 특정 테이블의 스키마를 세부적으로 분석하고 싶을 때 활용할 수 있는 부분이다.
SAP 시스템 내부에 존재하는 테이블 [ex) DD02L, DD03L, ...]을 검색하면 아래와 같은 정보를 얻을 수 있다.
- 테이블 이름 및 설명 (어떤 역할의 테이블인지 Description)
- 필드 이름 / 데이터 타입 / PK-FK 정보
- 어떤 데이터 요소 (Data Element)를 사용하는지
SAP 솔루션을 사용하면 테이블 스키마의 변경 사항을 자동으로 탐지하여 확인할 수 있지만, 그렇지 못한 경우에는 차선책이 필요하다. "SE11" 트랜잭션에서 Table 옵션 설정을 진행할 수 있는데, "Data Changes"를 클릭하게 되면 "CDPOS", "CDHDR"에 변경 사항에 대한 로그가 남는다고 한다. (해당 부분을 어떻게 분석하는 지는 추후에 공부해볼 예정이다.)
Object Navigator
"SE80"을 검색하면, 객체 탐색기라는 부분이 나오게 된다. 해당 트랜잭션은 패키지 / 프로그램 / 클래스 / 함수 모듈 등을 통합적으로 관리할 수 있는 부분이다. "SE37"을 검색하면 함수 모듈만 검색할 수 있는 부분이 나온다.
원하는 함수 모듈을 검색하고 나면, 우클릭 시 Display / Change / Create 등의 옵션을 선택할 수 있다.
Display 옵션을 클릭하는 경우, 해당 Function Module이 어떤 로직으로 구현되어 있는지 ABAP 언어로 확인할 수 있다. 실제 Change나 Create 작업을 진행하기 위해서는 CTS(Change and Transport System) 번호가 필요하며, Git 시스템에서 일종의 Commit 번호라고 생각하면 된다. 해당 번호가 있어야 내가 변경한 이력이 남게 되고, 그 부분을 배포 요청하여 내가 개발한 함수 모듈을 시스템에서 활용할 수 있게 된다.
함수 모듈 Interface는 아래와 같은 정보를 입력으로 받는다.
- Import: 함수에 입력할 값
- Export: 함수에서 반환할 값
- Changing: 함수 실행 중 변경 가능한 변수
- Tables: 테이블 데이터 처리 시 활용
- Exceptions: 특정 오류 발생 시 예외 처리 로직 정의
해당 트랜잭션 페이지에서는 내가 개발한 함수 모듈을 테스트 및 디버깅할 수 있다는 장점도 존재한다. 우선, 개발한 함수 모듈을 디버깅 하기 위해서는 Activate (활성화) 상태로 변경되어야 하고, 그 후에 Execute (실행)를 진행하여 함수 모듈이 의도대로 동작하는지 파악할 수 있다.
Function Module
Python에서 내장 라이브러리가 있듯이, SAP에서도 비슷하게 사용자가 원하는 의도대로 동작하는 함수를 개발할 수 있으며 이를 함수 모듈 (Function Module) 이라 부른다.
특정 테이블에서 상위 5개의 컬럼 정보만 가져오는 로직을 구현하고자 하는 상황이라고 가정해보자.
여러 가지 해결 방법이 있겠지만, 크게 두 가지로 비교를 해본다면 ...
- SAP -> Local 서버로 데이터를 다 가져온 다음, Python / PySpark / ... 등으로 처리하는 방법
- 데이터를 가져올 때부터 원하는 컬럼만 추출해서 가져오는 방법
실제 서비스를 운영할 때 가장 비용(Cost)이 많이 사용되는 부분은 "네트워크 간 데이터 이동"이다. 그렇기 때문에, Function Module을 개발해서 RFC로 호출하는게 Local에 다 가지고 와서 처리하는 부분보다 효율적이지 않을까 생각한다.
Function Module 배포
"SE09"를 검색하면, 특정 SAP 시스템에서 내가 개발한 Function Module / ... 의 이력을 확인할 수 있다. Function Module 배포는 Git에 Commit / Push / MR 날리는 부분과 굉장히 유사하다.
- Function Module 개발 및 테스트(CTS 번호 생성) -> Commit 번호
- Function Module Release (트럭 버튼) -> Git Push
- SAP 시스템 담당자에게 배포 요청 -> Merge Request
혹시라도 Function Module을 배포해야 할 일이 존재한다면, 해당 과정을 참조하면 수월하게 진행할 수 있을 것이라 생각한다.
SQL Editor
"DB02"를 검색하면 아래와 같이 SQL 쿼리를 날리고 결과를 확인할 수 있는 부분이 존재한다. Function Module을 호출하거나 SAP 솔루션을 통해 데이터를 확인하는 방법도 있지만, 누구에게는 이러한 방식이 굉장히 귀찮고 불필요한 과정이라고 생각이 들 수 있다. 이럴 때 굉장히 유용하게 사용할 수 있는 부분이다.
쿼리문을 작성할 때 중간에 수정하게 되면 한 칸씩 밀리게 되어 (word에서 insert 눌렀을 때 발생하는 현상) 불편함을 꽤 경험했던 기억이 난다. 혹시라고 해당 트랜잭션을 활용하시는 분은 중간 중간에 개행을 꼭 넣어줌으로써 쿼리 작성에 도움이 되었으면 좋겠다.
마무리하며
이번 게시글에서는 실제 회사에서 레거시 시스템의 원천인 SAP을 직접 다뤄보면서 초급자들에게 공유하면 좋을 이야기들을 위주로 정리하는 시간을 가져봤다. 다음 게시글은 PyRFC라는 라이브러리를 어떻게 적용하고 활용하고 있는지 기록해보고자 한다.
긴 글 읽어주셔서 감사합니다 :)