시스템 간 연동 (EAI) · SAP·레거시 연동 패턴 · 실습
IDoc 플랫 파일 파싱과 검증
목표
SAP IDoc 플랫 파일을 제어/데이터 레코드로 분해하고, 세그먼트 레이아웃대로 SDATA 를
파싱해 검증하고, 내부 표준 JSON 으로 변환할 수 있게 됩니다.
왜 중요한가
국내 대기업 프로젝트에서 ERP 연동은 거의 항상 만납니다. 그리고 회의에서
"IDoc 으로 받으시면 됩니다"라는 말이 나오는 순간, 구조를 모르면 아무것도
결정할 수 없습니다. 실제로 IDoc 파싱은 **세그먼트 이름으로 레이아웃을 찾아
1000자짜리 SDATA 를 위치로 자르는 일**이고, 앞 모듈의 고정길이 파싱과 같은 작업입니다.
그리고 운영에서 가장 자주 보게 될 상태 코드 51 이 '전송 실패'가 아니라
'SAP 안에서 업무 처리 실패'라는 것을 아는 것만으로도, 연동 담당자 간 평행선을
한 번 끊을 수 있습니다.
단계
0. 원본: /opt/lab/fixtures/eai/idoc/ORDERS05.txt,
레이아웃: /opt/lab/fixtures/eai/idoc/segments.md
1. /root/idoc 을 만들고 제어 레코드만 /root/idoc/control.txt,
데이터 레코드만 /root/idoc/data.txt 로 분리합니다.
두 파일의 줄 수 합이 원본 줄 수와 같아야 합니다.
2. /root/idoc/ctrl.csv 를 만듭니다. 첫 줄은docnum,idoctyp,mestyp,sndprn,rcvprn,credat.
제어 레코드 한 건당 한 행이고 docnum 오름차순입니다.
3. /root/idoc/segstat.csv 를 만듭니다. 첫 줄은 segnam,count.
세그먼트 이름별 건수를 건수 내림차순, 동수면 이름 오름차순으로 적습니다.
4. E1EDK01 세그먼트를 파싱해 /root/idoc/header.csv 를 만듭니다.
첫 줄은 docnum,belnr,curcy,netwr. netwr 은 헤더 총액입니다.
5. E1EDP01 세그먼트를 파싱해 /root/idoc/items.csv 를 만듭니다.
첫 줄은 docnum,posex,matnr,menge,netpr,amount.amount 는 menge × netpr 입니다.
6. /root/idoc/validate.sh 를 만듭니다. 인자 없이 실행하며,
헤더의 netwr 과 품목 amount 합계가
다른 IDoc 의 docnum 을 한 줄에 하나씩 출력하고,
하나라도 있으면 0 이 아닌 종료코드로 끝냅니다.
실행 결과를 /root/idoc/mismatch.txt 에 저장하세요. (1건이 있습니다.)
7. /root/idoc/status.csv 를 만듭니다. 첫 줄은 code,meaning,action.03, 12, 51, 53, 64, 68 여섯 코드를 모두 넣고,action 은 정상, 대기, 조사, 재전송 중 하나입니다.
8. /root/idoc/orders.json 을 만듭니다. 최상위는 배열이고,
각 원소는 아래 구조입니다. docnum 오름차순입니다.
{ "docnum": "...", "belnr": "...", "currency": "...", "netAmount": <숫자>, "items": [ { "posex": "...", "matnr": "...", "qty": <숫자>, "price": <숫자> }, ... ] }참고
- 고정길이 자르기는 파이썬 슬라이싱이 편합니다:
line[10:30] - jq 로 구조 확인:
jq '.[0].items | length' orders.json - 흔한 실수 1: 정의서의 1-based 위치를 0-based 인덱스에 그대로 쓰는 것.
- 흔한 실수 2: 수량·금액 필드의 앞자리 0 과 소수점 처리를 정하지 않는 것.
- 흔한 실수 3: 상태 코드 51 을 '전송 실패'로 해석하는 것.
(정의서의 위치는 1부터이므로 인덱스는 -1 해야 합니다)
데이터는 도착했고 SAP 안에서 업무 처리가 실패한 상태입니다.
단계 8개
- 제어·데이터 레코드 분리
- 제어 레코드 파싱
- 세그먼트 통계
- 헤더 세그먼트 파싱
- 품목 세그먼트 파싱
- 헤더-품목 금액 검증
- 상태 코드 매핑표
- 내부 표준 JSON 변환