개발자 팁개발 워크플로우 › 로컬 개발 DB를 운영과 얼마나 같게 맞출 것인가

로컬 개발 DB를 운영과 얼마나 같게 맞출 것인가

한 줄 요약

운영과 다른 로컬 환경에서 놓치는 문제들. 무엇을 맞추고 무엇을 달라도 되는지.

맞춰야 하는 것

로컬과 운영의 차이 때문에 생기는 문제는 대개 예측 가능한 지점에서 나온다.

1. DB 엔진과 메이저 버전

가장 중요하다. 엔진이 다르면 SQL 방언, 타입 처리, 함수가 다르다.

```sql

-- SQLite에서는 통과, PostgreSQL에서는 실패하는 예

SELECT * FROM t WHERE created_at > '2026-08-01' -- 타입 처리 차이

```

컨테이너로 운영과 같은 이미지를 쓰는 것이 가장 확실하다.

2. 문자셋과 정렬 규칙(collation)

정렬 순서와 대소문자 구분이 달라진다. 한글·이모지 처리에서 차이가 드러난다.

3. 타임존 설정

로컬이 KST, 운영이 UTC면 날짜 경계 계산이 달라진다. 이런 버그는 특정 시간대에만 재현되어 찾기 어렵다.

달라도 되는 것

이런 것까지 맞추려면 비용이 크고, 대부분의 개발 작업에서는 필요 없다.

시드 데이터

시드가 '정상 케이스만'이면 문제가 늦게 발견된다. 포함해야 할 것:

| 유형 | 예 |

|---|---|

| 빈 상태 | 관계 데이터가 0건인 사용자 |

| 대량 | 목록이 1000건 넘는 계정 |

| 특수문자 | 이름에 따옴표·이모지·긴 문자열 |

| 경계 날짜 | 월말, 연말, 윤년 |

| NULL | nullable 컬럼이 실제 NULL인 행 |

| 상태 조합 | 각 상태 코드마다 최소 1건 |

이런 데이터가 있으면 UI 깨짐이나 쿼리 오류가 개발 중에 드러난다.

운영 데이터 복사

가장 현실적인 시드는 운영 데이터지만, 그대로 가져오면 안 된다.

마스킹 스크립트를 만들어두고 정기적으로 갱신하는 방식이 흔하다. 다만 마스킹이 불완전할 위험이 항상 있으므로, 조직 정책을 먼저 확인해야 한다.

합성 데이터로 대체하는 방법도 있다. 초기 구축 비용은 크지만 유출 위험이 없고, 위의 경계 케이스를 의도적으로 넣을 수 있다.

초기화 절차

새로 합류한 사람이 몇 분 안에 실행 가능해야 한다.

```bash

docker compose up -d db # 운영과 같은 엔진·버전

npm run db:migrate # 스키마 적용

npm run db:seed # 시드 투입

```

이 세 줄이 문서에 있고 실제로 동작하면 온보딩 비용이 크게 준다. 자주 깨지는 지점이므로 신규 입사 때마다 확인하는 것이 좋다.

리셋 가능성

로컬 DB는 언제든 버리고 다시 만들 수 있어야 한다.

```bash

npm run db:reset # drop → migrate → seed

```

이 명령이 있으면 이상한 상태에 빠졌을 때 디버깅 대신 초기화로 넘어갈 수 있다. 반대로 로컬 DB에 수작업으로 만든 소중한 데이터가 쌓여 있으면, 그 자체가 재현 불가능한 환경이 된다.

최종 수정 2026-08-28

자주 묻는 질문

로컬에서 SQLite를 쓰고 운영은 PostgreSQL이면 문제가 되나요?

SQL 방언과 타입 처리가 달라 로컬에서 통과한 쿼리가 운영에서 실패할 수 있습니다.

운영 데이터를 로컬로 복사해도 되나요?

개인정보가 포함되면 안 됩니다. 마스킹하거나 합성 데이터를 쓰는 편이 안전합니다.

시드 데이터는 얼마나 필요한가요?

정상 케이스뿐 아니라 경계 상황(빈 값, 대량, 특수문자)이 포함돼야 합니다.

DB Linker로 지금 시작하기

AI 채팅으로 데이터베이스를 조회·관리하는 로컬 전용 개발자 도구. 자체 서버 없이 이용자의 기기에서만 동작합니다.

App Store에서 받기 →

안내

이 글은 일반적인 데이터베이스 관리 원칙과 개발 관행을 다루는 콘텐츠이며, 특정 프로젝트·프로덕션 환경에 대한 전문적 조언을 대체하지 않습니다. 구체적 버전·수치가 언급되더라도 실제 사용 중인 도구·버전에서 반드시 재확인하시기 바랍니다.

글 중 일부는 AI 도구의 도움을 받아 초안을 작성한 뒤 발행됩니다. 내용 중 사실과 다르거나 수정이 필요한 부분을 발견하시면 GitHub Issues로 알려주세요.