1. 개요
Object–Relational Mapping의 약자.객체 지향 프로그래밍 언어에서 사용하는 객체(Object)와 관계형 데이터베이스의 테이블 간의 데이터를 자동으로 변환해 주는 기술 또는 그 기술을 구현한 라이브러리를 뜻한다. 줄여서 ORM이라고 부른다.
전통적으로 SQL 문을 직접 작성하여 DBMS와 통신하던 방식을 대신해, 개발자가 사용하는 프로그래밍 언어의 객체를 통해 데이터베이스를 조작할 수 있도록 도와준다.
2. 필요성
ORM이 등장한 이유는 객체 지향 언어와 관계형 데이터베이스 사이의 패러다임 불일치(impedance mismatch) 때문이다.- 객체 지향 언어는 클래스를 기반으로 데이터와 행위를 묶은 객체를 사용한다.
- 반면 관계형 DB는 정규화된 테이블과 관계를 기반으로 데이터를 저장한다.
이러한 차이로 인해, SQL을 직접 작성할 때는 다음과 같은 반복 작업이 필연적으로 발생한다.
- 객체를 테이블 스키마에 맞게 수동 변환 (Object ↔ Row)
- SQL 문자열을 직접 작성 및 유지보수
- DBMS 종속적 쿼리 처리
- 스키마 변경 시 모든 SQL 코드 수정
ORM은 이러한 변환 과정을 라이브러리가 자동으로 처리하여 개발 생산성을 높이고, 비즈니스 로직과 데이터 접근 로직을 분리할 수 있게 한다.
3. 기능
ORM 라이브러리들은 대체로 다음과 같은 기능을 제공한다.- 클래스와 테이블 간의 매핑 정의
- 예: `User` 클래스 ↔ `users` 테이블
- 객체를 통한 CRUD(Create, Read, Update, Delete) 작업
- 예: `db.user.findMany()` → `SELECT * FROM users`
- 트랜잭션 지원
- 관계(1:N, N:M 등) 매핑 및 자동 조인 처리
- 스키마 마이그레이션 및 동기화 도구 제공
- DB 추상화 계층을 통해 여러 종류의 DBMS를 지원
특히 Prisma와 같은 최신 ORM은 타입 안전성(Type Safety) 과 자동 완성 기능을 제공하여 IDE에서 개발 편의성을 극대화하고 있다.
4. ORM 구현체들
각 언어별 ORM 들을 소개한다.- Active Record: Ruby on Rails 프레임워크에 내장된 ORM. 엑티브레코드 패턴의 구현체이다.
- Doctrine(독트린): PHP 에서 사용하는 데이터맵퍼 패턴의 ORM. 하이버네이트 설계에 영향 받았다.
- Entity Framework: 마이크로소프트의 .NET 진영 ORM.
- Eloquent: PHP 에서 사용하는 엑티브레코드 패턴의 ORM 주로 라라벨 프레임워크에서 사용한다.
- Hibernate / JPA: Java 진영의 대표적인 ORM. 엔터프라이즈 환경에서 가장 많이 쓰이며, Spring 프레임워크와 결합되어 사용된다.
- Prisma: JavaScript / TypeScript 진영에서 각광받는 차세대 ORM. 선언적 스키마 파일을 기반으로 타입 안전한 클라이언트를 자동 생성한다.
- Sequelize: 오래전부터 JS 진영에서 널리 사용된 ORM. 다양한 DBMS를 지원한다.
- SQLAlchemy: 파이썬 진영에서 가장 널리 쓰이는 ORM. 유연한 쿼리 빌더 기능으로 유명하다.
- TypeORM: TypeScript 지원에 초점을 맞춘 ORM. 데코레이터 기반으로 엔티티와 관계를 정의한다.
5. 장점
- SQL을 직접 작성하지 않아도 되기 때문에 개발 속도가 빨라진다.
- 코드의 가독성과 유지보수성이 향상된다.
- 여러 DBMS를 동일한 코드로 지원할 수 있다.
- 객체 지향적인 코드 구조를 유지할 수 있다.
- 테스트 코드 작성이 용이해진다. (mocking / in-memory DB 등과 조합)
6. 단점
ORM이 만능은 아니다. 복잡한 쿼리를 ORM으로만 처리하려다 보면 성능 저하나 예측 불가능한 SQL이 생성될 수 있다.- 복잡한 집계, 다중 조인 등은 결국 SQL로 작성하는 것이 더 효율적인 경우가 많다.
- 자동 생성되는 쿼리를 이해하지 못하면 디버깅이 어려워진다.
- DB 고유의 기능(Stored Procedure, Window Functions 등)을 100% 활용하기 어렵다.
- 잘못된 설정으로 N+1 쿼리 문제가 발생할 수 있다.
- 런타임 성능 오버헤드가 존재한다.
대규모 트래픽이나 고성능이 필요한 시스템에서는 ORM + Native SQL 병행 전략을 채택하는 경우가 많다.
7. ORM과 마이그레이션
현대의 ORM들은 단순히 객체-테이블 매핑에 그치지 않고, DB 스키마 버전 관리 및 마이그레이션 도구를 포함하는 경우가 많다.예를 들어 Prisma의 경우 다음과 같은 방식으로 스키마와 DB를 동기화한다.
bash
# 스키마 변경
prisma migrate dev
# 실제 DB에 반영
prisma migrate deploy
이를 통해 팀 단위 개발에서 스키마 변경 이력을 안전하게 공유할 수 있으며, CI/CD 파이프라인에도 통합할 수 있다.
8. 관리 도구
대부분의 ORM은 자체 CLI나 GUI를 제공하거나, 기존 DB 관리 도구와 함께 사용한다.Prisma Studio: Prisma에서 제공하는 웹 기반 GUI.
Doctrine Migrations: PHP 진영 ORM의 스키마 관리 도구.
Alembic: SQLAlchemy의 마이그레이션 관리 도구.
Sequelize CLI
ORM은 DBMS의 관리 도구와 병행해서 쓰는 경우가 많다. 예를 들어 Prisma를 쓰더라도 DBeaver나 DataGrip으로 DB 구조를 직접 조회·수정하는 식이다.
9. 한계
ORM은 DBMS를 대체하는 것이 아니다. 내부적으로는 결국 SQL을 생성해서 DBMS에 전달할 뿐이며, DB의 성능, 무결성 제약, 트랜잭션 처리 등은 여전히 DBMS의 영역이다.또한 실시간 데이터 처리나 초대용량 분석 쿼리 등에서는 ORM이 적합하지 않다. 이러한 경우 NoSQL, 데이터 웨어하우스 혹은 ETL 파이프라인과 병행해서 사용한다.
10. 같이 보기
DBMSSQL
NoSQL
Prisma