DevLog

엔지니어링 블로그를 한 곳에서 탐색하고, 최근 발행 흐름을 빠르게 파악할 수 있는 서비스 입니다.

Quick Links

  • Latest Feed
  • Engineering Directory

Support

  • 소개
  • 개인정보처리방침

Contribute

  • 원하는 블로그 추가 (준비 중)
  • Feedback

© 2026 DevLog Inc. All rights reserved.

본 사이트는 공개 RSS 피드를 통해 콘텐츠를 수집하며, 모든 콘텐츠의 저작권은 원저작자에게 있습니다.

Back to Feed
Read Original

Contents

Continue Reading

  • More from NAVER D2
  • Related reads#MySQL
#Backend

스마트스토어센터 Oracle에서 MySQL로의 무중단 전환기

스마트스토어센터 Oracle에서 MySQL로의 무중단 전환기
01

Summary

Oracle 탈출 성공기: 스마트스토어는 어떻게 무중단으로 MySQL 전환을 마쳤나

10년 된 레거시 시스템을 멈추지 않고 오픈소스로 옮기는 기술적 도전과 이중 쓰기 전략의 모든 것

성장하는 서비스의 발목을 잡던 Oracle DBMS의 비용과 성능 문제를 해결하기 위해 MySQL로 이전한 실제 사례입니다. 무중단 배포와 롤백 가용성을 동시에 확보하기 위해 이중 쓰기(Dual Write) 구조를 설계하고, JPA와 MyBatis 각각의 레이어에서 기술적으로 구현해낸 과정을 심도 있게 다룹니다.

  • 01서비스 중단 없는 마이그레이션을 위한 3단계 이중 쓰기(Dual Write) 전략 수립
  • 02DataSource Proxy를 활용한 JPA 쿼리 복제 및 트랜잭션 동기화 처리
  • 03CombinedSqlSessionFactory를 통한 MyBatis 비즈니스 로직 수정 없는 쿼리 이중화
  • 04Kafka와 Reflection API를 활용하여 실제 운영 트래픽 기반의 Read 성능 검증
  • 05Airflow 및 Hive를 이용한 대규모 데이터셋 간 100% 정합성 검증 자동화

+RECOMMENDATION

DBMS 마이그레이션을 고민 중인 백엔드 개발자나 대규모 레거시 시스템의 현대화를 담당하는 엔지니어에게 추천합니다. 특히 비즈니스 로직 수정을 최소화하면서도 정합성을 보장해야 하는 기술적 요구사항이 있을 때 훌륭한 레퍼런스가 될 것입니다.

The Problem

네이버 스마트스토어의 비즈니스 성장에 따라 공용 Oracle DBMS의 리소스 경합 및 성능 불안정이 심화되었고, 확장에 따른 막대한 라이선스 비용 부담이 발생했습니다.

The Solution

무중단 전환을 위해 '이중 쓰기(Dual Write)' 전략을 채택하였으며, JPA의 DataSource Proxy와 MyBatis의 Custom SqlSessionFactory를 구현하여 애플리케이션 코드 수정을 최소화하면서 두 DB에 데이터를 동기화했습니다.

The Result

6개월간의 정합성 검증과 3개월간의 QA를 통해 데이터 불일치를 해결하고 성능을 최적화했으며, 결과적으로 서비스 중단 없이 모든 트래픽을 MySQL로 성공적으로 전환했습니다.

Trade-off

이중 쓰기 과정에서 MySQL 쿼리 실패를 트랜잭션 롤백에 포함하지 않는 정책을 취했기 때문에, 지속적인 데이터 마이그레이션과 Airflow를 활용한 사후 정합성 검증 및 수정 작업이 필수적으로 수반되었습니다.

03

Key Concepts

Concept · 01

이중 쓰기 (Dual Write)

데이터베이스 전환 기간 동안 데이터 손실 없이 구버전과 신버전 DB를 동기화하기 위해 양쪽 DB에 동시에 쓰기 트랜잭션을 수행하는 기법입니다.

  • Oracle과 MySQL 간 데이터 정합성을 실시간으로 유지하는 안전장치로 활용
  • 전환 후 이슈 발생 시 즉시 이전 DB로 복귀할 수 있는 롤백 가용성 보장
Concept · 02

Proxy DataSource

실제 DataSource를 대리(Proxy)하여 쿼리 실행 전후에 추가적인 로직을 삽입할 수 있게 해주는 패턴입니다.

  • JPA 환경에서 Oracle로 향하는 쿼리를 가로채 MySQL로 동일하게 전달하는 역할 수행
  • TransactionSynchronizationManager를 연동해 메인 트랜잭션 커밋 후 이중 쓰기 수행
Concept · 03

CombinedSqlSessionFactory

MyBatis에서 하나 이상의 SqlSession을 관리하여 멀티 DB에 대해 쿼리를 실행하도록 커스텀하게 구현된 Factory 클래스입니다.

  • 기존 MyBatis 인터페이스 호출 구조를 그대로 유지하면서 내부적으로 두 DB 세션을 모두 호출
  • InvocationHandler를 통해 CUD 작업은 양쪽에, Read 작업은 주 DB에서만 처리하도록 제어
Continue reading · same source

NAVER D2More from NAVER D2

View all posts from NAVER D2
  • [AI 해커톤 후기] AI 시대의 해커톤과 인간의 역할: AI의 계획과 사람의 전략

    LLMFastAPIOCR
    19시간 전
  • FE News 26년 7월 소식을 전해드립니다.

    TypeScriptReactAIAgents
    5일 전
  • FE News 26년 7월 소식을 전해드립니다.

    TypeScriptReactAI Agent
    5일 전
  • [AI 해커톤 후기] 코드와 문서만 읽은 LLM은 어떻게 사람과 같은 팀을 1위로 골랐을까

    LLM as a JudgeCodexAutomated Grading
    1주 전
  • AI 에이전트 회사 차리기: 설립부터 어디서든 동기화까지

    AI AgentOrchestrationSynchronization
    1주 전

Related reads#MySQL

Explore #MySQL
무신사·Java Flight Recorder

의심했던 범인은 알리바이가 있었다.

#MySQL4일 전
여기어때·Aurora MySQL

Aurora MySQL의 숨겨진 idle close 동작 — HikariCP "Failed to validate connection" 추적기

#MySQL1개월 전
아임웹·SRE

전사 장애를 데이터로 잠재운 인프라팀의 8개월

#MySQL1개월 전
아임웹

MySQL Online DDL의 메타데이터 잠금: pt-osc와 무엇이 다른가

#MySQL2개월 전
라인

슬로우 쿼리 해결기: 함수형 인덱스로 비트 연산 쿼리 최적화하기

#MySQL5개월 전

Source

NAVER D2
NAVER D2
Engineering Blog

Published · January 21, 2026

Topics

MySQLOracleDual WriteZero-DowntimeData Integrity