
10년 된 레거시 시스템을 멈추지 않고 오픈소스로 옮기는 기술적 도전과 이중 쓰기 전략의 모든 것
성장하는 서비스의 발목을 잡던 Oracle DBMS의 비용과 성능 문제를 해결하기 위해 MySQL로 이전한 실제 사례입니다. 무중단 배포와 롤백 가용성을 동시에 확보하기 위해 이중 쓰기(Dual Write) 구조를 설계하고, JPA와 MyBatis 각각의 레이어에서 기술적으로 구현해낸 과정을 심도 있게 다룹니다.
DBMS 마이그레이션을 고민 중인 백엔드 개발자나 대규모 레거시 시스템의 현대화를 담당하는 엔지니어에게 추천합니다. 특히 비즈니스 로직 수정을 최소화하면서도 정합성을 보장해야 하는 기술적 요구사항이 있을 때 훌륭한 레퍼런스가 될 것입니다.
네이버 스마트스토어의 비즈니스 성장에 따라 공용 Oracle DBMS의 리소스 경합 및 성능 불안정이 심화되었고, 확장에 따른 막대한 라이선스 비용 부담이 발생했습니다.
무중단 전환을 위해 '이중 쓰기(Dual Write)' 전략을 채택하였으며, JPA의 DataSource Proxy와 MyBatis의 Custom SqlSessionFactory를 구현하여 애플리케이션 코드 수정을 최소화하면서 두 DB에 데이터를 동기화했습니다.
6개월간의 정합성 검증과 3개월간의 QA를 통해 데이터 불일치를 해결하고 성능을 최적화했으며, 결과적으로 서비스 중단 없이 모든 트래픽을 MySQL로 성공적으로 전환했습니다.
Trade-off
이중 쓰기 과정에서 MySQL 쿼리 실패를 트랜잭션 롤백에 포함하지 않는 정책을 취했기 때문에, 지속적인 데이터 마이그레이션과 Airflow를 활용한 사후 정합성 검증 및 수정 작업이 필수적으로 수반되었습니다.
데이터베이스 전환 기간 동안 데이터 손실 없이 구버전과 신버전 DB를 동기화하기 위해 양쪽 DB에 동시에 쓰기 트랜잭션을 수행하는 기법입니다.
실제 DataSource를 대리(Proxy)하여 쿼리 실행 전후에 추가적인 로직을 삽입할 수 있게 해주는 패턴입니다.
MyBatis에서 하나 이상의 SqlSession을 관리하여 멀티 DB에 대해 쿼리를 실행하도록 커스텀하게 구현된 Factory 클래스입니다.









