피드로 돌아가기
올리브영 테크블로그Backend
원문 읽기
10년 된 레거시를 현대화하다 - Part.2: 매장 도메인의 구현 여정
올리브영이 10년 된 레거시 매장 도메인을 DDD 기반 멀티모듈 아키텍처와 CQRS 패턴으로 현대화하며 테이블 통합과 도메인 모델 구축
AI 요약
Context
올리브영의 오프라인 팀은 10년간 유지되어온 레거시 시스템에서 매장 관련 도메인을 추출해야 했습니다. 매장 테이블이 매장부가정보, 부가상세정보, 상세정보 등 6개 이상의 테이블로 분산되어 있었고, 현재 사용하지 않는 컬럼과 직접 관련 없는 컬럼이 대량 포함되어 있었습니다. 팀에 코틀린 경험자가 없는 상태였기 때문에 자바+스프링부트 기반의 새로운 스켈레톤 프로젝트 구축이 필요했습니다.
Technical Solution
- 멀티모듈 아키텍처 도입: store-core(공통), store-domain(엔티티/VO), store-service(비즈니스 로직), store-api/store-consumer(프레젠테이션)로 분리하여 향후 external/internal 환경 분리 시 필요한 모듈만 조합 배포 가능하도록 구성
- CQRS 패턴 적용: Command 영역에서는 JPA 기반 도메인 엔티티로 CREATE/UPDATE/DELETE 처리, Query 영역에서는 Querydsl과 MyBatis를 병행하여 기존 복잡한 조회 쿼리(수십~수백 줄)를 점진적으로 이관
- 테이블 경량화·통합: 도메인 전문가와 함께 필요 컬럼 식별(null 데이터 현황 및 백오피스 사용처 검증), 레거시 테이블의 필요 컬럼을 주 테이블로 이관(ALTER → 데이터 동기화 배포 → UPDATE → 향후 DROP)
- DomainEntity/ValueObject 추상클래스 구현: Entity는 제네릭 식별자로 equals()/hashCode() 자동 재정의, VO는 Reflection API를 통해 모든 필드값 비교로 동등성 판단
- Read Replica DB 구조 활용: Master DB와 별개의 Read Replica DB를 Query 영역에서 활용하여 조회 성능 최적화 가능하도록 설계
Key Takeaway
레거시 도메인 추출 시 기술 스택 선택(코틀린 미도입)과 아키텍처 설계(멀티모듈+CQRS)는 팀의 역량과 요구사항 구체화 정도를 함께 고려해야 하며, 테이블 통합 작업처럼 사전에 데이터 정리를 수행하면 도메인 모델 구현 난이도를 크게 낮출 수 있습니다.
실천 포인트
기존 레거시 시스템에서 특정 도메인을 추출하는 엔지니어링 팀에서 CQRS 패턴과 멀티모듈 아키텍처를 함께 도입하면, 복잡한 기존 조회 쿼리를 Querydsl/MyBatis로 점진적으로 이관하면서 동시에 새로운 기능을 JPA 기반으로 개발할 수 있어 마이그레이션 기간을 단축할 수 있습니다. 또한 테이블 통합 전에 도메인 전문가와 함께 필요 컬럼/테이블을 명확히 식별하면 불필요한 레거시 데이터를 제거하고 도메인 모델의 응집도를 높일 수 있습니다.