풀스택 웹 개발 인턴

법인 관리 B2B SaaS

법인 관리 B2B SaaS ZUZU에서 신규 법인 등록 프로세스 자동화 및 데이터 수집 시스템 개발 등기·정관 입력 자동화로 업무 시간 90%(30분 → 3분) 단축, 동적 설문으로 고객 세그먼트 데이터 확보

배경

(주)코드박스는 주주명부 관리, 주총 및 이사회 업무 등 주주 관리 업무를 지원하는 B2B SaaS 솔루션 'ZUZU'를 운영하고 있습니다.

저는 소프트웨어 엔지니어 팀에 풀스택 개발 인턴으로 참여하여,
신규 법인 등록 과정에서 발생하던 반복적이고 오류가 잦은 입력 업무를 자동화하고,
고객 데이터를 구조적으로 수집할 수 있는 시스템을 구축했습니다.


1. 법인 정보 입력 프로세스 자동화

(30분 → 3분, 90% 단축)

문제

신규 법인 등록 시 등기부등본과 정관에서 정보를 사람이 직접 복사·입력해야 했고, 한 건당 약 30분이 소요되었습니다.

  • 등기부등본: XML 구조가 복잡하고 이력 데이터가 중첩됨
  • 정관: 스캔 PDF/이미지 형태 → 텍스트 추출 불가
  • 입력 과정에서 휴먼 에러 빈번

해결

1) 등기부등본 XML 파싱

  • XML 구조를 분석하여 XPath 기반 파싱 로직 구현
  • 임원/주소 등 이력 데이터

2) 정관 OCR + 비동기 처리

  • GCP Document AI로 OCR 처리
  • Celery 기반 비동기 작업 관리
  • 상태 기반(PENDING / PROCESSING / COMPLETED) 재시도 로직으로 처리 안정성 확보
@app.task(bind=True, max_retries=5)
def process_ocr(self, request_id):
    if request.status == 'PENDING':
        raise self.retry(countdown=10)

결과 및 팀 반응

  • 등기·정관 입력 자동화로 입력 시간 30분 → 3분
  • 배포 후 입력 담당자 및 운영팀으로부터 반복 업무가 크게 줄었다는 피드백을 받았고, 이후 자동 입력 항목 확장 논의로 이어졌습니다.

2. 고객 데이터 수집을 위한 동적 설문 시스템

문제

고객 유형(기업/VC), 직무, 관심사에 따라 다른 정보를 수집해야 했지만, 기존에는 이메일/전화에 의존해 데이터가 분산되어 있었습니다.

목표

  • 유저 유형 및 이전 답변에 따라 질문 흐름이 달라지는 설문 시스템
  • 이탈 후 재방문 시 진행 상태 유지
  • 수집된 데이터를 분석 가능한 형태로 저장

구현

프론트엔드 (React + TypeScript)

  • 신규/기존 유저 및 설문 이력(UserGuideState)에 따라 진입 조건 분기
  • 기업/VC 및 역할별로 질문 흐름이 달라지는 동적 설문 구조 설계
  • Zustand + persist로 설문 상태를 localStorage에 저장하여 재방문 시 이어서 진행 가능
  • 질문 변경 시 key를 활용해 폼을 강제 초기화하여 오답 방지
<QuestionForm key={formKey} />

백엔드 (Django)

  • 설문 응답을 JSON 구조로 저장하고, 분석/표시 목적에 맞게 파싱하는 유틸 로직 분리
  • 설문 진행 상태를 별도 모델로 관리
  • 결과 데이터를 BigQuery로 적재하여 분석 가능하도록 구성

운영 안정화

  • 전역 상태 변경으로 불필요한 리렌더가 발생해 페이지가 초기화되는 문제를 발견하고,
    상태 갱신 책임을 분리하여 사용자 경험 저하를 해결

결과

  • 고객 세그먼트 데이터 자동 수집 파이프라인 구축
  • 이후 맞춤형 서비스 및 분석 기능의 기반 데이터로 활용

3. 운영 자동화 및 서비스 안정화 기여

배치 업데이트 시스템

  • 엑셀 업로드 기반 유상증자/구주거래 배치 업데이트 기능 구현 (트랜잭션 처리)
  • 대량 데이터 입력 시 오류 행 하이라이트 UI 제공으로 휴먼 에러 감소

온보딩 메일 자동화

  • SendGrid + Celery Beat로 가입자 대상 자동 메일 발송 (D+1, D+3, D+7)

메일 첨부파일 한글 인코딩 이슈 해결

  • Outlook 환경에서 첨부파일명이 깨지는 문제 재현
  • RFC 2047 기반 UTF-8 인코딩 적용으로 해결
from email.header import Header
file_name = Header("가이드.pdf", "utf-8").encode()

회고

이 인턴십을 통해 단순 기능 구현을 넘어,
실제 서비스에서 반복되는 문제를 정의하고, 자동화와 구조 개선으로 해결하는 경험을 했습니다.
특히 비동기 처리, 데이터 구조화, 운영 환경 이슈를 직접 다뤄보며 서비스에 필요한 코드를 이해하게 되었습니다.