ORM 운영 점검

ORM 마이그레이션과 쿼리 위험

ORM을 쓰면 SQL을 덜 작성할 수 있지만 운영 위험이 사라지지는 않는다. Entity와 실제 schema의 차이, migration 적용 순서, transaction 경계, lazy relation의 N+1, index 누락을 함께 봐야 데이터 계층이 안정된다.

01

Entity 정의

컬럼 타입, nullable, relation, cascade가 실제 DB 제약과 같은지 확인한다.

TypeScript 타입과 DB 제약은 별도다
02

Migration 생성

entity 변경을 migration SQL로 만들고 destructive change와 lock 가능성을 검토한다.

자동 생성 SQL을 그대로 믿지 않는다
03

Transaction 경계

여러 repository 호출이 하나의 업무 변경이면 transaction으로 묶는다.

부분 성공이 데이터 불일치를 만든다
04

Query 성능 확인

relation loading, pagination, filtering이 실제 SQL과 index를 어떻게 쓰는지 본다.

N+1은 ORM에서 자주 숨는다
05

운영 복구

migration 실패, rollback, schema drift, seed 데이터 충돌을 실행 절차로 확인한다.

운영 DB는 코드처럼 쉽게 되돌릴 수 없다
Entity
코드 모델 컬럼과 관계를 코드로 표현하지만 실제 DB 제약과 동기화가 필요하다.
nullable mismatch를 조심한다
Migration
스키마 변경 이력 운영 DB가 지나갈 변경 단계를 파일로 남긴다.
drop과 rename은 별도 검토가 필요하다
Transaction
업무 단위 일관성 여러 쓰기가 모두 성공하거나 모두 실패해야 할 때 경계를 둔다.
외부 API와 함께 쓸 때 보상 처리를 본다
Query Plan
실제 실행 비용 ORM 호출이 만든 SQL의 join, sort, index 사용 여부를 확인한다.
repository 코드만으로 성능을 판단하지 않는다

DB 확인

생성 SQL migration 파일의 DDL과 데이터 보정 SQL을 리뷰한다.
실행 계획 주요 ORM query의 SQL과 EXPLAIN 결과를 확인한다.
실패 복구 migration 중간 실패와 revert 가능성을 스테이징에서 재현한다.