테이블/관계 설계
↓
Prisma Schema / Migration
↓
Index / 검색 성능
↓
Transaction / 동시성
↓
상태 이력 / Audit Log
↓
Pagination / 관리자 목록 최적화
↓
Soft Delete / 보존 정책
↓
Backup / Restore
↓
EXPLAIN / 느린 쿼리 개선
↓
DB 운영 체크리스트
단순히:
쿼리를 작성할 수 있다
실무적으로:
데이터 구조를 설계할 수 있다
운영 중 데이터 정합성을 지킬 수 있다
느린 쿼리를 분석할 수 있다
장애 시 복구 절차를 설명할 수 있다
개인정보와 이력을 안전하게 관리할 수 있다
핵심:
테이블은 책임이 명확해야 함
관계는 FK로 정합성 관리
상담/상품/관리자/유입 데이터를 연결
상담 당시 조건은 snapshot으로 보존
핵심:
schema.prisma는 DB 설계 문서에 가까움
migration은 운영 DB 변경 기록
운영에서 reset 금지
destructive migration은 단계적으로 처리
핵심:
인덱스는 조회 패턴 기준으로 추가
status + createdAt
productId + createdAt
source + createdAt
phoneNormalized
핵심:
상태 변경 + 이력 저장은 transaction
중복 신청은 DB constraint까지 필요
외부 API는 transaction 안에 넣지 않기
Job/Outbox 구조 고려
핵심:
현재 상태와 이력은 분리
누가/언제/무엇을 바꿨는지 기록
중요 변경은 Audit Log
개인정보는 로그에 무분별하게 저장 금지
핵심:
목록은 가볍게
상세는 별도 API
createdAt + id 정렬
limit 최대값 제한
엑셀은 ExportJob으로 분리
핵심:
운영 데이터 hard delete는 신중히
상품/관리자 계정은 soft delete 또는 비활성화
상담 데이터는 개인정보 보존/익명화 기준 필요
삭제/복구는 Audit Log 대상
핵심:
백업보다 복구 가능성이 중요
운영 DB에 바로 restore 금지
migration 전 snapshot 확인
부분 복구는 현재 운영 데이터와 비교
백업 파일은 개인정보 덩어리
핵심:
감으로 인덱스 추가 금지
실제 SQL과 EXPLAIN 확인
SELECT * 줄이기
include 최소화
성능 개선 전후 기록
상품 도메인:
products
product_options
banners
promotions
상담 도메인:
consults
consult_status_histories
consult_memos
운영 도메인:
admin_users
roles
permissions
audit_logs
유입 도메인:
visit_logs
lead_sources
utm_logs
작업 도메인:
export_jobs
notification_logs
job_logs
1. consults
고객 리드와 매출의 시작점
2. products / product_options
고객 화면, 상담 조건, 마케팅 자산의 기준
3. audit_logs / status_histories
운영 추적성과 관리자 신뢰도의 기준
운영 DB 작업 전:
SELECT로 대상 확인
count 확인
sample 확인
transaction 준비
backup/snapshot 여부 확인
상담 상태 변경:
status_history
상품 가격/지원금 변경:
audit_log
관리자 권한 변경:
audit_log
삭제/복구:
audit_log
상품:
isActive=false 또는 deletedAt
관리자:
isActive=false 또는 disabledAt
상담:
삭제보다 보존/익명화 정책
엑셀 파일:
만료 후 삭제
느린 API
↓
실제 SQL 확인
↓
EXPLAIN 확인
↓
병목 파악
↓
개선
↓
전후 비교
백업 있음:
안심 X
복구 테스트 완료:
안심 가능
data, info, etc, temp 같은 모호한 이름을 피했는가?NOT NULL 기준이 있는가?DEFAULT가 있는가?createdAt, updatedAt이 필요한가?deletedAt이 필요한 테이블인가?@default(now()), @updatedAt을 적절히 사용했는가?@@index, @@unique가 조회/정합성 기준과 맞는가?Json 타입을 남용하지 않는가?migrate reset을 절대 사용하지 않는가?1. nullable 컬럼 추가
2. 코드에서 새 컬럼 사용 시작
3. 기존 데이터 backfill
4. not null 또는 unique 제약 추가
5. 구 컬럼 사용 제거
6. 충분한 기간 후 구 컬럼 삭제
fromStatus와 toStatus를 모두 저장하는가?createdAt desc, id desc처럼 안정적 정렬인가?consults:
status + createdAt + id
productId + createdAt
source + createdAt
phoneNormalized
phoneLast4 + createdAt
products:
isActive + displayOrder
deletedAt
carrier + createdAt
audit_logs:
actorType + actorId + createdAt
targetType + targetId + createdAt
action + createdAt
requestId
status_histories:
consultId + createdAt
changedByAdminId + createdAt
deletedAt IS NULL 조건이 자주 쓰이는가?알림톡/SMS 실제 발송
S3 업로드
엑셀 파일 생성
외부 API 호출
긴 파일 처리
사용자 입력 대기
대량 데이터 처리
deletedAt 컬럼이 있는가?deletedByAdminId가 필요한가?deleteReason이 필요한가?deletedAt: null 조건이 빠지지 않는가?docs/
db/
README.md
erd.md
schema-design.md
prisma-migration-guide.md
indexes.md
status-codes.md
audit-log.md
soft-delete-retention.md
backup-restore.md
query-optimization.md
db-runbook.md
docs/db/README.mdDB 구조 개요
핵심 테이블 목록
운영 주의사항
관련 문서 링크
docs/db/status-codes.md상담 상태 코드
주문 상태 코드
상태 전이 규칙
상태 변경 사유 코드
최종 상태 정의
docs/db/indexes.md주요 인덱스 목록
인덱스 추가 이유
관련 API
EXPLAIN 개선 결과
주의사항
docs/db/backup-restore.md백업 방식
RDS snapshot 기준
pg_dump/pg_restore 명령어
전체 복구 Runbook
일부 복구 Runbook
복구 테스트 기록
consults 구조 점검
products/product_options 구조 점검
admin_users 구조 점검
상담 상태 enum 정리
상담 상태 이력 테이블 확인
완료 기준:
상담 신청이 상품과 정확히 연결됨
상태 변경 이력이 남음
관리자 작업자 추적 가능
상품 정보 변경 시 과거 상담 조건이 흔들리지 않음
page/limit 정리
sortBy 화이트리스트
createdAt + id 정렬
목록/상세 API 분리
select 최소화
기본 인덱스 점검
완료 기준:
상담 목록 조회가 안정적으로 동작
상태/날짜/전화번호 검색이 느리지 않음
엑셀 다운로드가 목록 API와 분리됨
CONSULT_STATUS_UPDATE
PRODUCT_UPDATE
PRODUCT_SOFT_DELETE
EXPORT_DOWNLOAD_REQUEST
ADMIN_PERMISSION_UPDATE
완료 기준:
누가 어떤 작업을 했는지 추적 가능
상품/지원금 변경 이력 확인 가능
삭제/복구 작업 기록 확인 가능
RDS 자동 백업 확인
migration 전 snapshot 기준
pg_dump/pg_restore 테스트
부분 복구 Runbook
복구 후 Smoke Test
완료 기준:
백업 위치와 복구 절차를 설명 가능
새 DB에 복구 테스트 가능
운영 실수 발생 시 대응 순서가 있음
Prisma query log 개발 환경 확인
EXPLAIN 분석 연습
느린 상담 목록 API 분석
인덱스 추가 전후 기록
성능 개선 문서화
완료 기준:
느린 쿼리를 감이 아니라 실행 계획으로 설명 가능
인덱스 추가 이유와 효과를 기록 가능
관리자 목록 성능 개선을 성과로 표현 가능
목표:
상담/상품/관리자 핵심 구조 안정화
작업:
- consults 테이블 구조 점검
- products/product_options 구조 점검
- 상담 상태 enum 정리
- status history 구조 확인
- snapshot 컬럼 필요 여부 정리
완료 기준:
핵심 테이블과 관계를 설명할 수 있음
상담 상태 변경 흐름이 문서화됨
과거 상담 조건 보존 기준이 있음
목표:
관리자 상담 목록 성능과 사용성 개선
작업:
- page/limit/sort DTO 정리
- sortBy 화이트리스트
- 목록/상세 API 분리
- select 최소화
- 전화번호 검색 정규화 확인
- 기본 인덱스 후보 정리
완료 기준:
상담 목록 API 응답 구조 통일
불필요한 include 제거
상태/날짜/전화번호 검색 기준 정리
목표:
운영 추적성과 삭제 복구 가능성 확보
작업:
- Audit Log action 목록 정리
- 상태 변경 audit log 연결
- 상품 soft delete 기준 정리
- 삭제/복구 API 기준 정리
- 개인정보 로그 마스킹 확인
완료 기준:
주요 관리자 작업 추적 가능
삭제/복구 작업 기록 가능
상품 삭제와 노출 중지 구분 가능
목표:
장애 대응과 성능 분석 기본 체계 확보
작업:
- RDS 백업 설정 확인
- pg_dump/pg_restore 테스트
- 복구 Runbook 작성
- 상담 목록 EXPLAIN 분석
- 인덱스 추가 전후 기록 템플릿 작성
완료 기준:
복구 절차를 문서로 설명 가능
느린 쿼리 분석 흐름을 수행 가능
DB 운영 개선을 성과 문장으로 정리 가능
DB 테이블 수정
인덱스 추가
Prisma migration 작성
상태 이력 추가
백업 문서 작성
상담 상태 변경 이력과 Audit Log 구조를 설계해 관리자 작업 추적성과 운영 데이터 정합성을 개선했습니다.
관리자 상담 목록의 검색/필터/정렬 기준을 정리하고 목록/상세 API를 분리해 대량 데이터 증가에 대비한 조회 구조를 개선했습니다.
상담 신청 중복 처리 기준과 transaction 범위를 정리해 중복 접수 및 상태 변경 누락 가능성을 줄였습니다.
상품 삭제와 노출 비활성화, Soft Delete, 복구 기준을 분리해 과거 상담 참조를 유지하면서 운영 실수 복구가 가능한 구조를 마련했습니다.
DB migration 전 백업 기준과 복구 Runbook을 정리해 운영 DB 변경 작업의 안정성을 높였습니다.
EXPLAIN 기반으로 관리자 목록 쿼리 병목을 분석하고 조회 패턴에 맞는 인덱스 후보를 정리해 성능 개선 근거를 마련했습니다.
운영 DB에서 감으로 update/delete
SELECT 확인 없이 대량 변경
Prisma migration 파일 확인 안 함
migrate reset을 운영에서 실행
상태 변경 이력 없이 status만 update
삭제를 hard delete로 처리
백업 확인 없이 migration
EXPLAIN 없이 인덱스 추가
SELECT *와 과한 include 방치
개인정보를 로그에 그대로 저장
운영 dump를 로컬에 오래 보관
운영 DB:
where 없는 UPDATE/DELETE
운영 migration:
reset 또는 데이터 삭제 migration
로그:
전화번호/토큰/Secret 출력
백업:
dump 파일을 Git 또는 AI에 업로드
migration 전 체크리스트 생성
schema diff 리뷰
Prisma migration 파일 위험도 분석
느린 쿼리 로그 요약
EXPLAIN 결과 요약
백업 테스트 기록 템플릿 생성
상담 상태 코드 문서 생성
Audit Log action 목록 문서화
운영 DB 자동 update
운영 DB 자동 delete
운영 migration 자동 승인
운영 restore 자동 실행
개인정보 포함 dump 자동 업로드
AI에게 원본 DB 제공
1. 운영 DB 접속 정보 제공 금지
2. 실제 개인정보 제공 금지
3. schema.prisma 변경 전 요구사항 명확히 전달
4. migration 파일을 반드시 사람이 확인
5. destructive change 여부를 AI에게 따로 점검 요청
6. seed/test data와 운영 data를 구분
7. transaction 범위와 rollback 기준 확인
8. 변경 후 EXPLAIN/QA 체크리스트 요청
schema.prisma에서 상담 상태 변경 이력 테이블을 추가하려고 해.
조건:
1. 기존 Consult 모델의 status는 유지
2. ConsultStatusHistory 모델을 추가
3. fromStatus, toStatus, changedByAdminId, reason, memo, createdAt 포함
4. AdminUser와 relation 연결
5. consultId + createdAt index 추가
6. changedByAdminId + createdAt index 추가
7. 기존 데이터 삭제나 reset은 절대 하지 않음
8. migration 생성 후 위험 요소를 설명
출력:
- 수정할 Prisma schema
- migration 시 주의사항
- transaction service 예시
- QA 체크리스트
기존 데이터 삭제가 없는가?
nullable/default가 안전한가?
인덱스가 과하지 않은가?
relation cascade가 위험하지 않은가?
개인정보가 로그에 남지 않는가?
운영 migration 순서가 안전한가?
0824 백엔드 아키텍처 고도화 (1/N): Domain Service, Use Case와 비즈니스 로직 분리
0824:
Domain Service, Use Case와 비즈니스 로직 분리
0825:
Repository Pattern과 Prisma 의존성 관리
0826:
Transaction Boundary와 상태 변경 Use Case 설계
0827:
Queue/Worker, ExportJob과 알림톡 발송 구조
0828:
Webhook, 외부 API 연동과 재시도 전략
0829:
Permission Policy, 관리자 권한과 접근 제어
0830:
Audit Log, Event Log와 운영 추적성
0831:
Error Handling, Exception Filter와 표준 응답 구조
0901:
테스트 가능한 백엔드 구조와 Mock 전략
0902:
백엔드 아키텍처 운영 체크리스트
NestJS + Prisma + PostgreSQL/RDS 기반 온라인 휴대폰 판매몰의 DB 운영 상태를 점검하고 싶어.
서비스 상황:
1. 고객 상담 신청, 상품/옵션, 관리자 계정, 상담 상태 이력, Audit Log, ExportJob, 알림 발송 로그가 있음
2. 상담 신청에는 이름, 전화번호, 상품, 유입 source, visitorId, IP가 포함될 수 있음
3. 관리자는 상담 목록에서 검색/필터/정렬/페이지네이션을 사용하고 상태를 변경함
4. 상품 정보가 바뀌어도 상담 당시 조건은 snapshot으로 보존하고 싶음
5. 상태 변경과 이력 저장은 transaction으로 묶어야 함
6. 상품/배너/관리자 계정은 soft delete 또는 비활성화가 필요함
7. RDS 백업, pg_dump/pg_restore, 일부 데이터 복구 Runbook이 필요함
8. 관리자 목록 조회 성능을 EXPLAIN 기반으로 개선하고 싶음
9. 개인정보와 Secret은 로그/백업/AI 도구에 노출되면 안 됨
요청:
- DB 설계 체크리스트
- Prisma schema/migration 체크리스트
- 상담/상품/상태 이력/Audit Log 점검 항목
- 관리자 목록 조회 성능 체크리스트
- 인덱스 후보와 주의사항
- Soft Delete/보존 정책 점검
- 백업/복구 Runbook 점검
- 느린 쿼리 분석 순서
- 운영 DB 작업 시 금지할 행동
- 4주 개선 로드맵
- 경력기술서에 쓸 수 있는 성과 표현
을 실무 기준으로 정리해줘.
상담 신청과 관리자 상태 변경을 핵심으로 보는가?
운영 DB reset/delete 위험을 강하게 경고하는가?
상태 변경 이력과 Audit Log를 구분하는가?
개인정보와 백업 파일 보안을 강조하는가?
EXPLAIN 기반 분석을 우선하는가?
인덱스를 무작정 많이 만들라고 하지 않는가?
Soft Delete와 Hard Delete 기준을 구분하는가?
복구 테스트와 Runbook을 강조하는가?
현재 규모에 비해 과한 구조를 강요하지 않는가?
consults, products/product_options, admin_users, consult_status_histories, audit_logs, export_jobs, notification_logs가 핵심 DB 도메인입니다.fromStatus, toStatus, changedByAdminId, reason, createdAt을 가진 이력 테이블과 transaction으로 묶어야 합니다.