
ORM은 Object-Relational Mapping (객체-관계 매핑) 의 줄임말입니다. 이름에서 알 수 있듯이, 객체 지향 프로그래밍(OOP) 언어의 "객체"와 관계형 데이터베이스의 "테이블" 간의 불일치를 해결하고, 이 둘을 자동으로 매핑해주는 기술 또는 프레임워크를 의미합니다.
왜 ORM이 필요할까? (패러다임 불일치)
객체 지향 프로그래밍과 관계형 데이터베이스는 데이터를 다루는 방식에 근본적인 차이가 있습니다.
객체 지향 프로그래밍: 데이터를 객체(Object) 형태로 다룹니다. 객체는 속성(데이터)과 행위(메소드)를 함께 가지며, 상속, 다형성 등의 개념을 통해 복잡한 관계를 표현합니다. 데이터를 계층적이거나 그래프 형태로 탐색합니다.
관계형 데이터베이스: 데이터를 테이블(Table) 형태로 다룹니다. 테이블은 행(Row)과 열(Column)로 구성되며, 관계는 외래 키(Foreign Key)를 통해 설정됩니다. 데이터를 평면적인 형태로 저장하고 관리합니다.
이러한 패러다임 불일치(Paradigm Mismatch) 때문에 개발자는 객체 지향 언어로 애플리케이션을 개발하면서도 데이터를 저장하거나 조회하기 위해 SQL(Structured Query Language)을 직접 작성해야 하는 번거로움이 있었습니다.
ORM은 이러한 패러다임 불일치를 해결해주는 중간 계층 역할을 합니다.
객체와 테이블 매핑: 애플리케이션의 객체(예: User 클래스)를 데이터베이스의 테이블(예: users 테이블)과 자동으로 연결(매핑)합니다.
SQL 자동 생성: 개발자가 객체 지향 언어의 메소드를 사용하여 데이터를 조작하면, ORM이 내부적으로 해당 작업을 수행하는 SQL 쿼리를 자동으로 생성하여 데이터베이스에 전달합니다. (예: user.save() -> INSERT INTO users (...) VALUES (...))
결과 매핑: 데이터베이스에서 조회된 결과를 다시 객체 형태로 변환하여 개발자가 객체 지향 방식으로 데이터를 다룰 수 있게 해줍니다.
생산성 향상:
개발자가 SQL을 직접 작성할 필요 없이 객체 지향 코드에만 집중할 수 있어 개발 속도가 빨라집니다.
복잡한 SQL 쿼리 작성 시간을 줄여줍니다.
객체 지향적인 코드:
데이터베이스와의 상호작용이 객체 지향적으로 이루어져 코드의 가독성이 높아지고, 더 직관적으로 데이터를 다룰 수 있습니다.
객체의 상속, 다형성 등을 활용하여 더 유연한 설계를 할 수 있습니다.
재사용성 및 유지보수 용이성:
매핑된 객체는 독립적으로 재사용될 수 있으며, 데이터베이스 스키마 변경 시에도 코드 수정이 최소화됩니다.
매핑 정보가 명확하여 ERD(개체 관계도)에 대한 의존도를 낮출 수 있습니다.
DBMS 종속성 감소:
대부분의 ORM 프레임워크는 특정 데이터베이스에 종속되지 않습니다. 따라서 데이터베이스를 변경하더라도 코드의 많은 부분을 수정할 필요가 없어 마이그레이션이 용이합니다.
테스트 용이성:
데이터베이스에 직접 접근하지 않고도 객체를 통해 테스트를 수행할 수 있어 테스트 작성이 쉬워집니다.
기존 ORM의 장점을 계승하면서 개발자 경험(DX)을 극대화한 ORM의 한 종류입니다.
뛰어난 개발자 경험 (DX) : 타입 안전성, 자동 완성, 직관적인 스키마 언어 덕분에 개발 생산성이 압도적으로 높습니다.
강력한 타입 안전성 : TypeScript와 완벽하게 통합되어 컴파일 시점에 오류를 발견하니 런타임 오류 걱정을 덜 수 있습니다.
깔끔하고 직관적인 API : 데이터베이스 조작을 위한 API가 매우 간결하고 이해하기 쉽습니다. 따라서 처음 DB를 배우는 사람이 접근하기 더 편리합니다.
자동화된 마이그레이션 : 스키마 변경에 따른 마이그레이션을 자동으로 처리해 개발자의 부담을 덜어줍니다.
다양한 DB 지원 : PostgreSQL, MySQL, SQLite, SQL Server 등 여러 관계형 DB와 MongoDB를 지원하여 유연성이 높습니다.
1. Prisma Schema: DB의 설계도
Prisma는 Prisma Schema Language (PSL)라는 전용 언어를 사용해 데이터베이스 스키마를 정의합니다. 여기에 데이터 모델과 관계를 명시하죠.
이 스키마 파일은 데이터베이스와 애플리케이션 모델 간의 단일 진실 공급원(Single Source of Truth) 역할을 합니다.
2. Prisma Client: 타입 안전성의 마법
Prisma Schema를 바탕으로 Prisma Client라는 타입-안전한 쿼리 빌더가 자동으로 생성됩니다.
TypeScript 환경에서는 놀라운 타입 안전성과 풍부한 자동 완성 기능을 제공합니다. 쿼리 관련 오류를 컴파일 시점에 잡아내 런타임 오류를 줄여주고 개발 생산성을 엄청나게 높여줍니다.
예를 들어, await prisma.user.findMany({ include: { posts: true } }) 처럼 직관적으로 데이터를 조회할 수 있습니다.
3. Prisma Migrate: 쉬운 DB 스키마 관리