레거시 현대화

본사·유럽법인 Oligo 주문등록 구조 개선 및 동시성 위험 제거

Spring Singleton Service에 요청별 주문·배송·메일 데이터를 멤버변수로 보관하던 구조를 지역변수 중심으로 바꾸고, 5개 주문 유형의 공통 계약과 시스템별 업무 규칙의 경계를 재설계했습니다.

기간
2024.10 — 2025.04
상태
본사 운영 반영
역량
동시성 안전성 · 레거시 분석
5개Oligo 주문 유형
11개핵심 회귀 시나리오
2단계3자·사용자 테스트
확인한 위험
Singleton Service의 공유 가변 상태가 동시 요청 사이에 주문 데이터를 섞을 가능성
설계 기준
요청 상태는 지역변수로 격리하고 공통 동작만 인터페이스 계약으로 분리
보존한 차이
본사 CES·배송·할인 규칙과 유럽 고객·견적·메일·아웃소싱 분기

배경과 문제

Oligo 주문등록 Service는 주문번호·고객 국가·저장 목록·메일 데이터를 멤버변수에 두고 메서드 시작 시 다시 초기화했습니다. 단일 요청에서는 정상처럼 보이지만 Singleton Bean을 여러 요청이 공유하므로 처리 중 다른 요청의 값으로 바뀔 수 있었습니다.

실제 데이터 혼입 장애가 발생한 뒤 수습한 사례가 아니라, 동시 요청에서 잘못된 데이터가 저장될 수 있는 구조적 위험을 소스 분석으로 찾아 운영 장애 전에 제거한 개선입니다.

역할과 책임 범위

  • 본사·유럽법인 주문등록 Service의 상태 보관 방식과 호출 흐름 분석
  • 요청 상태 지역변수화와 5개 주문 유형의 공통 인터페이스 설계·구현
  • 각 시스템의 상이한 업무 규칙 보존과 회귀 시나리오 검증

확인한 증거와 원인 분석

  • 요청마다 바뀌는 주문·배송·메일용 값이 Singleton Service 멤버변수에 선언된 구조 확인
  • Custom·Duplex·Plate·Premade·RAPD 분기에서 변환·집계·저장 로직이 반복되는 구간 확인
  • 본사와 유럽법인이 같은 개선 방향을 필요로 하지만 CES 연계·견적·메일 등 업무 분기가 다른 점 대조

검토한 대안과 선택 기준

  • 멤버변수에 synchronized를 적용하거나 Prototype Scope로 바꾸지 않고 Service를 무상태 구조로 전환
  • 주문 유형별 차이를 한 메서드에 합치지 않고 공통 동작만 일반화한 인터페이스 계약으로 정의
  • 한쪽 법인의 코드를 복사하지 않고 공통 원칙과 시스템별 업무 규칙을 분리해 각각 반영

설계 및 구현

  • 요청별 주문·배송·메일 데이터와 집계값을 메서드 파라미터·지역변수로 이동
  • 5개 주문 모델이 공통 주문 정보 변환 계약을 구현하도록 인터페이스 구성
  • 시퀀스 정규화·주문 속성·단가와 Invoice 책임을 별도 유틸리티·서비스 경계로 분리
  • 본사 CES 합성 Primer·배송·할인 규칙과 유럽 견적·메일·아웃소싱 분기를 각각 보존

테스트와 검증

  • 5개 주문 유형의 신규 등록과 유형별 저장 데이터 확인
  • Custom·Duplex·Plate 등록 후 주문접수 화면 수정과 Premade·RAPD 재고성 주문 검증
  • 본사 동일 11개 시나리오를 외부 검증과 사용자 검증 두 단계에서 반복해 운영 반영 기준 확인

운영 반영 결과

  • Singleton Service의 공유 가변 상태를 제거해 동시 요청 간 데이터 혼입 가능성 차단
  • 5개 주문 유형의 반복 로직을 공통 계약으로 정리하면서 유형별 차이 유지
  • 유럽법인은 소스 개선 범위를 확인하고, 본사는 2025.04.01 운영 반영과 최종 완료 확인

사용 기술

Java 8Spring FrameworkeGovFrameMyBatisOracleJSPJava GenericsStream API