Tax / Integration Platform
COMPAS 수임기업 관리 플랫폼
- Java 21
- Spring Boot 3.4
- Spring Security
- Spring Data JPA
- QueryDSL
- Redis
- PostgreSQL
- NHN Cloud
Overview
삼일회계법인과의 파트너십으로 세무·회계사무소 전용 수임기업 관리 플랫폼을 신규 구축했습니다. 수임기업 등록, 홈택스 수임동의 자동화, ERP 데이터 연동, 실시간 알림 기능을 제공하며, 설계 초기부터 스크래핑·수기·엑셀 3가지 연동 방식을 단일 인터페이스로 통합, COMPAS → Pharos ERP → 백오피스 3단계 원격 데이터 전파, 멀티 서버 환경에서의 비동기 작업 완료 실시간 알림이 핵심 과제였습니다.
Problem
- 스크래핑, 수기, 엑셀 3가지 연동 방식을 단일 흐름으로 통합해야 했습니다.
- COMPAS, Pharos ERP, 백오피스까지 이어지는 3단계 원격 데이터 전파는 단일 DB 트랜잭션으로 묶을 수 없었습니다.
- 스크래핑 완료 이벤트가 발생한 서버와 사용자가 SSE로 연결된 서버가 다를 수 있었습니다.
My Ownership
- 백엔드 개발 리드로 공통 인증, 수임기업 연동, 엑셀 업로드 공통 아키텍처, 실시간 알림을 담당했습니다.
- 사용자 JWT, 시스템 간 Authorization Key, E2E 암호화 로그인 필터를 독립적으로 구성했습니다.
- 보상 트랜잭션과 SSE + Redis Pub/Sub 기반 멀티 서버 알림 구조를 설계했습니다.
Key Decisions
JWT는 사용자 세션 기반이라 서버 간 콜백 호출에는 부적합해 API Key와 호출 주체별 허용 엔드포인트 매칭으로 분리했습니다.
원격 API 호출을 단일 트랜잭션으로 묶을 수 없어 단계별 성공건을 수집하고 실패 시 원격 취소 API로 보정했습니다.
HTTP 기반 자동 재연결 장점은 유지하면서, Redis Pub/Sub으로 서버 간 완료 이벤트 전달 문제를 해결했습니다.
엑셀 타입마다 검증·파싱 로직과 컬럼 구조가 달라 팩토리로 프로세서를 동적 선택하고, JSONB와 GIN 인덱스로 스키마 변경 없이 유연한 저장과 검색을 지원했습니다.
Implementation
인증 필터 체인
인증 예외 처리, 사용자 JWT 검증, 시스템 간 Key 인증, 요청 복호화, 응답 암호화를 독립 필터로 구성했습니다.
수임기업 연동 통합 모듈
스크래핑·수기·엑셀 연동을 단일 인터페이스로 통합하고, 원격 API 성공건만 단일 트랜잭션으로 일괄 저장했습니다.
멀티 서버 알림
완료 서버가 Redis로 이벤트를 publish하고 각 서버가 subscribe한 뒤 자신의 SSE 연결만 필터링해 사용자에게 전송했습니다.
Detailed Notes
인증 구조와 E2E 암호화
일반 사용자 JWT, 시스템 간 Authorization Key, E2E 암호화 로그인 3가지 인증 방식을 단일 Security 체인 내 독립 필터로 구성했습니다.
- SecurityException Filter에서 인증 예외를 일괄 처리했습니다.
- AuthorizationJWT Filter에서 사용자 JWT를 검증하고 Redis 토큰 관리로 로그아웃 즉시 무효화했습니다.
- AuthorizationKey Filter에서 Pharos ERP·백오피스 등 내부 시스템 호출을 인증하고 허용 엔드포인트 패턴으로 접근을 제어했습니다.
- PayloadDecryption Filter와 ResponseEncrypt Filter로 로그인 요청 페이로드 복호화와 AES 응답 암호화를 처리했습니다.
- PBKDF2 키를 Redis에서 조회해 암복호화를 수행했습니다.
수임기업 연동 통합 모듈과 보상 처리
- 스크래핑·수기·엑셀 3가지 연동 방식을 단일 인터페이스로 통합하고 신규/수정 분기를 하나의 흐름으로 설계했습니다.
- 등록·수정 원격 API 호출을 트랜잭션 밖으로 분리하고, 성공건만 수집해 단일 트랜잭션으로 일괄 저장했습니다.
- 원격 API 실패 또는 저장 실패 감지 시 성공건에 대해 원격 취소 API를 호출해 보상 처리했습니다.
- JPA JDBC 배치 처리에서 Persistable isNew()를 명시적으로 제어해 불필요한 SELECT를 방지하고, Hibernate 배치 설정으로 일괄 처리했습니다.
엑셀 업로드 공통 아키텍처
- Upload, Save, Download 작업 유형별 추상 클래스에 공통 흐름을 정의하고 타입별 검증·파싱은 구현체에서 처리했습니다.
- 문자열, 숫자, 날짜, enum, 이메일 타입별 셀 검증을 공통 컴포넌트로 분리해 구현체 간 중복을 줄였습니다.
- 행별 검증 후 JSONB에 저장하고, 사용자 확인 후 성공건 저장 또는 실패건 에러 엑셀 다운로드 흐름을 구성했습니다.
- 다건 엑셀 데이터를 단일 트랜잭션 1건 INSERT로 저장하고 GIN 인덱스로 검색 성능을 확보했습니다.
SSE + Redis Pub/Sub 알림
- 수임기업 스크래핑 연동은 최대 2분 소요되는 비동기 작업이라 실시간 완료 알림이 필요했습니다.
- 로드밸런서 환경에서 요청 서버와 완료 서버가 다를 수 있어 단순 SSE만으로는 해결되지 않았습니다.
- SSE는 HTTP 기반, 방화벽 친화적, 자동 재연결 장점을 활용하고 30초 heartbeat로 프록시 타임아웃을 방지했습니다.
- 완료 이벤트를 Redis Pub/Sub으로 브로드캐스팅하고 각 서버가 자신의 SSE 연결만 필터링해 사용자에게 전송했습니다.
Result / Impact
- 일반 사용자 JWT, 시스템 간 Authorization Key, E2E 암호화 로그인 3가지 인증 방식을 구현했습니다.
- 성공건만 수집해 단일 트랜잭션 일괄 저장하고, 실패 시 원격 취소 API 호출로 보상 처리했습니다.
- 스크래핑·수기·엑셀 3가지 수임기업 연동 방식을 단일 인터페이스로 통합했습니다.
- Upload·Save·Download 작업 유형별 전략 + 템플릿메서드 패턴을 적용해 타입별 확장 시 기존 코드 수정을 줄였습니다.
- SSE + Redis Pub/Sub으로 요청 서버와 완료 서버 불일치 문제를 해결했습니다.