Pain001

재무 담당자, 지급 운영, 엔지니어, 감사인을 위한 명쾌한 답변입니다. 질문은 실무자들이 실제로 묻는 방식 그대로 표현했습니다. 더 자세한 기술 내용은 기술 레퍼런스를 참고하세요.


재무 및 금융 책임자를 위해#

pain.001을 한 문단으로 설명하면 무엇인가요?

pain.001은 고객이 자금이체를 개시하기 위해 거래 은행에 보내는 ISO 20022 메시지로, SWIFT MT101이나 국내 고정 폭 파일 같은 형식을 대체하는 XML 후속 규격입니다. 은행은 이를 수용하기 전에 스키마와 스킴 룰북에 대해 검증합니다. 소프트웨어인 Pain001은 이미 보유한 데이터로 이러한 파일을 만들고, 제출 전에 유효함을 증명합니다.

pain.001과 pain.008의 차이는 무엇인가요?

자금이 움직이는 방향이 다릅니다. pain.001은 자금이체를 개시합니다. 즉 돈을 내보냅니다. pain.008은 자동이체 출금을 개시합니다. 즉 위임(만데이트)에 따라 받을 돈을 회수합니다. Pain001은 두 가지를 모두 생성합니다. pain.001의 10개 버전(.001.03부터 .001.12까지)과 pain.008.001.02입니다.

아직 MT101 파일을 보내고 있습니다. 전환이 얼마나 시급한가요?

시급합니다. SWIFT는 2025년 11월에 국경 간 은행 간 지급 지시용 MT 카테고리 1, 2, 9 메시지를 폐지했습니다. 아직 MT를 받아 주는 기업 채널은 각 은행의 재량에 따라 한시적으로만 운영됩니다. MT101 로더는 기존 MT101 흐름을 다시 입력할 필요 없이 검증된 pain.001로 변환합니다.

2026년 11월 구조화 주소 마감은 우리에게 어떤 의미인가요?

2026년 11월 말부터 CBPR+ 국경 간 지급에서는 완전히 비구조화된 우편 주소가 더 이상 허용되지 않습니다. 주소는 구조화 또는 하이브리드 형식이어야 하며, 자유 텍스트 줄 대신 도시()와 국가() 같은 개별 요소를 사용해야 합니다. 마스터 데이터에 주소가 통째로 저장되어 있다면 해야 할 일은 은행 연결이 아니라 데이터 쪽에 있습니다. 거기서부터 시작하세요. 2026년 브리핑에서 일정을 자세히 다룹니다.

Pain001의 비용은 얼마인가요?

무료입니다. 코어는 Apache-2.0 / MIT 이중 라이선스이며, 동반 패키지는 Apache-2.0입니다. 상업적 이용, 수정, 재배포가 모두 허용됩니다. 비교 기준으로, SWIFT의 변환 SDK만 해도 연간 €10,000–30,000에 판매됩니다.


지급 운영 담당자를 위해#

은행은 왜 지급 파일을 거절하나요?

반복되는 원인은 네 가지입니다. 스키마 위반(잘못된 요소, 잘못된 버전, 잘못된 네임스페이스), 잘못된 식별자(IBAN 체크섬 실패, 형식이 어긋난 BIC), 어긋난 통제 합계(NbOfTxs / CtrlSum이 거래와 불일치), 그리고 ISO 20022 라틴 문자 집합을 벗어난 문자입니다. Pain001은 파일이 만들어지기 전에 네 가지를 모두 점검합니다. 레코드별 JSON Schema 검증, mod-97 IBAN 및 ISO 9362 BIC 검사, 통제 합계 재계산, 문자 집합 음역, 그리고 렌더링된 XML의 최종 XSD 검증입니다.

아무것도 생성하지 않고 파일을 검증할 수 있나요?

가능합니다. pain001 --dry-run(또는 validate 하위 명령이나 POST /api/v1/validate)을 사용하세요. 종료 코드 0은 유효함을, 1은 필드 단위 오류와 함께 검증에 실패했음을 뜻합니다. CI나 제출 전 점검 목록에 연결해 두세요.

어떤 SEPA 룰북을 지원하나요?

다섯 개의 스킴 룰북이 기본 제공됩니다. SEPA Credit Transfer(sepa-sct), SEPA Instant(sepa-inst), SEPA Direct Debit Core(sepa-sdd), SEPA B2B(sepa-b2b), 국경 간 자금이체(xborder-ct)입니다. 통과하거나 실패한 모든 규칙을 보려면 --scheme --explain을 사용하세요.

데이터가 Excel에 있습니다. 무엇을 주의해야 하나요?

Excel은 IBAN처럼 보이는 문자열을 아무 경고 없이 숫자로 바꿔 버립니다. Excel 로더.xlsx/.xlsm을 직접 읽고 IBAN 열에 숫자 셀이 있으면 즉시 중단합니다. 손상은 은행이 아니라 적재 단계에서 잡힙니다.

50만 행 배치는 어떻게 처리하나요?

--streaming은 입력을 메모리 제한 청크(기본 1,000건의 거래)로 처리하며, 각 청크는 정확하게 재계산된 통제 합계를 담은 별도의 XML 파일로 출력됩니다. 같은 이유로 REST API는 작업 상태 조회가 가능한 POST /api/v1/generate/async를 제공합니다.


엔지니어와 아키텍트를 위해#

라이브러리, CLI, API 중 무엇으로 연동해야 하나요?

세 가지 모두 동등한 일급 인터페이스로 제공됩니다. 타입이 지정된 Python API, CI 친화적 종료 코드를 갖춘 CLI, 그리고 동기·비동기 작업·상태 확인·Prometheus 지표 엔드포인트를 갖춘 FastAPI 마이크로서비스(pain001 serve)입니다. 아래에서는 동일한 검증 파이프라인이 동작하므로 인터페이스마다 결과가 달라지지 않습니다.

XML 생성이 부동소수점 반올림으로부터 정말 안전한가요?

금액은 생성과 스킴 검증 전 구간에서 decimal.Decimal로 다룹니다. 정확한 십진수로 구문 분석하고, 정확한 십진수로 합산하며, 부동소수점 표현 없이 렌더링합니다. 통제 합계는 입력값을 신뢰하지 않고 검증된 레코드에서 다시 계산합니다.

보안 태세는 어떤가요?

모든 XML 구문 분석은 defusedxml을 거치며, XXE와 엔티티 확장 공격을 차단합니다. 의존성 트리에 lxml은 없습니다. 입력은 경로 탐색 검증기를 통과합니다. Docker 이미지는 비루트 사용자로 실행됩니다. 코어 릴리스마다 CycloneDX SBOM이 생성되며, 서드파티 플러그인 탐지는 PAIN001_DISABLE_PLUGINS=1로 완전히 비활성화할 수 있습니다.

품질은 어떻게 보장하나요?

코어에는 100% 라인 및 분기 커버리지가 강제 CI 게이트로 적용됩니다(검증 가능한 수치로 3,828 라인, 926 분기가 100%). 여기에 엄격한 mypy, 100% 독스트링 커버리지, Bandit 및 pip-audit 보안 린팅, CodeQL 스캐닝이 더해집니다. 동반 패키지도 동일한 100% 커버리지 원칙을 따릅니다.

사내 전용 형식을 위해 확장할 수 있나요?

가능합니다. 네 개의 플러그인 엔트리 포인트 그룹(pain001.loaders, pain001.validators, pain001.schemes, pain001.writers)이 있습니다. Excel 로더 자체가 공개 프로토콜을 사용하는 플러그인이므로 참조 구현 역할도 합니다.


감사인과 컴플라이언스를 위해#

지난 분기에 생성한 파일을 재현할 수 있나요?

가능합니다. 패키지 버전을 고정하고 동일한 입력을 다시 실행하면 출력은 결정적입니다. 툴체인이 오픈 소스이므로 감사 추적은 공급업체의 확인서에 그치지 않고 코드 경로 자체까지 이어집니다.

지급 데이터가 우리 환경을 벗어나나요?

아닙니다. CLI, 라이브러리, REST API, MCP 서버, LSP 등 모든 구성 요소가 로컬에서 실행됩니다. 텔레메트리도, SaaS 콜백도, 외부 검증 서비스도 없습니다. MCP 서버는 stdio로만 통신하며, 17개 도구 모두 읽기 전용이자 멱등으로 표시되어 있습니다.

Pain001은 누가 유지 관리하나요?

런던에 기반을 둔 핀테크 엔지니어링 리더 Sebastien Rousseau가 커뮤니티 기여자들과 함께 유지 관리합니다. 개발은 GitHub에서 공개적으로 진행되고, 릴리스는 PyPI에 배포되며, 변경 이력은 릴리스마다 버전으로 관리됩니다.