계층형 아키텍처로 구현된 서비스에서,
외부 서비스 교체와 DB를 MongoDB에서 MySQL로 마이그레이션할 때,
어떤 방식으로 접근하는 것이 좋은가?
---
답변 요약
계층형 아키텍처에서는 각 계층의 책임이 명확하므로, 교체와 마이그레이션은 다음 접근 순서와 원칙으로 진행하는 것이 바람직합니다.
---
1️⃣ 외부 서비스 교체 접근법
외부 API, SDK 등을 교체할 때는 인터페이스와 어댑터 패턴을 활용하세요.
절차:
1. Service Layer (도메인 계층) 에서 외부 의존성을 인터페이스로 추상화.
2. 기존 구현체 (Mongo / 기존 외부 서비스) 와 신규 구현체 (MySQL / 신규 외부 서비스)를 병렬 운영할 수 있도록 분리.
3. 새 외부 서비스에 맞게 구현체 교체 및 테스트.
4. 기능 플래그 (Feature Toggle) 또는 환경 변수로 런타임 스위칭 가능하도록 준비.
---
2️⃣ MongoDB → MySQL 마이그레이션 접근법
DB 변경은 점진적이고 안전하게.
절차:
1. Repository Layer 분리:
Repository 인터페이스 → Mongo, MySQL 구현체로 분리.
2. 마이그레이션 전략 선택:
Double Write (이중 쓰기):
Mongo / MySQL 둘 다 쓰고, 읽기는 기존 유지 → 검증 완료 후 전환.
Shadow Read:
MySQL에도 데이터를 넣어두고 비공식적으로 읽어서 비교 검증.
3. 데이터 이관:
ETL 도구 (e.g., Apache NiFi, custom script)로 Mongo 데이터를 MySQL로 옮김.
4. 점진적 전환:
Feature Toggle로 일부 트래픽부터 MySQL로 전환 → 전체 전환.
---
3️⃣ 공통 원칙
✅ Interface 우선, Implementation 후행
✅ 테스트 코드 확보 (단위 / 통합 / 회귀)
✅ 데이터 일관성 검증 (Diff 툴, 로그 분석)
✅ 롤백 플랜 명확히 준비
---
예시 아키텍처 그림 (추상화)
Controller
↓
Service (Interface: ExternalServiceClient)
├─ OldExternalServiceAdapter
└─ NewExternalServiceAdapter
↓
Repository (Interface: UserRepository)
├─ MongoUserRepository
└─ MySQLUserRepository
---
필요하다면, 구체적인 마이그레이션 절차나 코드 예시도 추가 설명 가능해. 요청해줘.
'Spring & Backend' 카테고리의 다른 글
| never와 unknown 타입에 대해서 설명해주세요 (2) | 2025.07.23 |
|---|---|
| 낙관적 락과 비관적 락에 대해 설명해 주세요. (2) | 2025.07.23 |
| css 속성 dvh, svh, lvh 란 무엇인가요? (2) | 2025.07.22 |
| 자바 프로그램이 실행되는 흐름을 설명해 주세요 (6) | 2025.07.22 |
| 가상화 (0) | 2025.07.21 |
