스펙트럼의 양 끝
한쪽 끝, raw SQL: 최대 제어, 최대 verbosity, 모든 쿼리 수작업. 다른 쪽, 풀 ORM (Django ORM, ActiveRecord, Hibernate): 행을 객체에 매핑, 메서드 호출에서 SQL 생성, DB 추상. 대부분 건강한 프로젝트가 둘 다 사용 — hot/복잡 path 엔 raw SQL, 지루한 CRUD 엔 ORM 또는 query builder.
ORM 이 잘 하는 거
- 지루한 CRUD — 단일 행 INSERT/UPDATE/DELETE.
- 스키마 마이그레이션 — 모델 변경에서 DDL 생성.
- 정적 타입 언어의 타입 안전.
- 어느 DB 쓰는지 추상 (실제로 거의 안 쓸모).
ORM 이 못 하는 거
- 복잡한 join, window function, CTE — ORM 과 싸우는 게 그냥 SQL 쓰는 것보다 느림.
- N+1 쿼리 문제 — Operations 트랙 참조.
- Bulk 연산 — 모든 ORM 이 COPY 숨김.
- Postgres 특화 기능 — JSONB 연산자, FTS, pgvector 다 raw SQL 또는 드라이버 레벨 지원 필요.
실용적 답
ORM 은 잘 하는 거에; 다른 모든 거엔 raw SQL (같은 드라이버/connection 통해) 로 내려와. 한 프로젝트에 둘 다 공존 가능 — 거의 항상 그래야.