피드로 돌아가기
How I built a Norwegian VAT filing library in Java (and what nearly broke me)
Dev.toDev.to
Backend

복잡한 노르웨이 VAT 신고 자동화, Java 라이브러리 구현 기록

How I built a Norwegian VAT filing library in Java (and what nearly broke me)

Guang Hu2026년 4월 6일3intermediate

Context

노르웨이 정부 API 문서와 실제 프로덕션 환경 간의 큰 간극 존재. 3개 시스템과 15단계 프로세스가 얽힌 복잡한 인증 및 제출 체계. 상태 기반 워크플로우 엔진인 Altinn 3의 엄격한 순서 제약으로 인한 409 에러 빈번 발생.

Technical Solution

  • ID-porten 인증을 위해 PKCE 및 private_key_jwt 방식 도입 및 Redis 기반 서버 사이드 세션 저장소 설계
  • Altinn 3의 상태 기반 워크플로우를 처리하기 위해 인스턴스 생성부터 피드백 폴링까지의 상태 유지 메커니즘 구현
  • MVA-koder(1-91)와 Skatteetaten XML 규격 간의 불일치를 해결하는 부호 변환 로직 및 리버스 차지(Reverse-charge) 전용 이중 라인 생성 전략 적용
  • 외부 원장 시스템과의 유연한 연결을 위해 Ports-and-adapters 아키텍처 기반 인터페이스 설계
  • 비동기 처리되는 Altinn 3 피드백 엔드포인트 대응을 위해 5분 주기 스케줄러 기반 폴링 루프 구축
  • Guice와 Spring 간의 격리 문제를 해결하여 oxalis-ng를 Spring Boot에서 사용 가능하게 하는 전용 Starter 라이브러리 개발

Key Takeaway

외부 정부 API 연동 시 문서에 명시되지 않은 상태 전이 규칙과 도메인 특화 비즈니스 로직의 변환 계층을 분리하는 설계가 필수적임.


상태 기반 외부 API 연동 시 요청 스레드 블로킹을 피하고 스케줄러 기반의 비동기 폴링 구조를 채택할 것

원문 읽기