Object-relational mapping의 약자로, 객체지향 프로그래밍 언어를 사용하여 호환되지 않는 타입 시스템 간에 데이터를 변환하는 프로그래밍 기법이다. 따라서 이러한 기법은 프로그래밍 언어로 다룰 수 있는 "가상 객체 데이터베이스(virtual object database)"를 만들어낸다.
쉽게 말해, ORM은 데이터베이스와 어플리케이션 사이에 있는 레이어라 볼 수 있다.
그리고 Active Record Pattern과 Data Mapper pattern은 ORM 아키텍쳐 패턴이다.
AR 패턴의 객체의 인터페이스는 CRUD 기능을 하는 메서드들과 데이터베이스 테이블에 있는 컬럼에 해당하는 프로퍼티를 가진다.
AR 패턴은 데이터베이스에 있는 데이터에 접근하는 방식이다. 데이터베이스 테이블은 클래스로 래핑된다. 따라서, 객체 인스턴스는 테이블의 열 하나에 해당하게 된다. 객체를 만들고 save하게 되면 테이블에 새로운 열이 추가된다. 마찬가지로 객체를 불러오면 그 객체는 데이터베이스의 정보를 그대로 가지고 있고, 객체를 업데이트하면 그 객체에 대응되는 열이 업데이트된다. 이 wrapper 클래스는 테이블이나 뷰의 각각의 컬럼에 대한 accessor 메서드(모델에서 데이터를 가져올때나 데이터를 업데이트 할 때 사용되는 메서드 )와 속성을 가지고 있다.
가령 parts
라는 테이블과 name
, price
라는 컬럼이 있다고 생각해보자. AR 패턴은 Part
클래스에서 이루어진다.
let part = new Part(); // Part 클래스로 새로운 parts 테이블에 들어갈 객체를 만든다
part.name = 'shirts'; // 새로운 객체에 값을 넣는다
part.price = 25900;
part.save(); // part 객체를 데이터베이스에 넣는다
위의 코드는 다음의 SQL 문과 완전히 같다.
INSERT INTO parts (name, price) VALUES ('shirts', 25900);
TypeORM에서는 Entity Manager가 클래스 역할을 수행한다.
이 패턴을 따르는 객체의 인터페이스는 데이터 저장소의 도메인 엔티티 타입을 나타내는 객체에 대한 CRUD 함수를 포함한다.
Data Mapper는 영구적인 데이터 저장소(예를 들어, 관계형 데이터베이스)와 인메모리 데이터 표현 (도메인 레이어) 간의 양방향 데이터 전송을 수행하는 데이터 엑세스 레이어이다. Data Mapper 패턴의 목표는 인메모리 표현과 영구적인 데이터 저장소를 서로 독립적으로 유지시키고 데이터 매퍼 역할을 수행하는 것이다. 이 데이터 엑세스 레이어는 하나 이상의 매퍼로 구성되며, 데이터 전송을 수행한다. 일반적인 매퍼(generic mappers)는 여러 도메인 엔티티 타입을 다루고, 전용 매퍼(dedicated mappers)는 하나 또는 몇개만 처리한다.
data mapper는 어플리케이션의 비즈니스 도메인과 데이터를 저장하는 데이터베이스 사이에 있는 레이어를 의미한다. AR 패턴은 도메인과 데이터베이스 간의 갭을 최대한 매끄럽게 메꾸려고 하는 반면, DM 패턴은 둘 사이를 더 독립적으로 두려고 하는 것이다.
테스트가능성(Testability)
AR 패턴을 사용하면 DB 액세스 로직과 어플리케이션 로직이 결합되기 때문에, 데이터베이스 없이 Active Record 객체를 가지고 유닛 테스트를 진행하는 것이 어렵다. 이러한 단점은 모킹(mocking)이나 의존성 주입(dependency injection) 프레임워크를 사용해 진짜 데이터를 가짜 데이터로 대신하여 해결할 수 있다.
단일 책임 원칙과 관심사 분리
Active Record 패턴에 대한 또 다른 비판은, DB 엑세스 로직과 어플리케이션 로직의 결합으로 인해 Active Record 객체가 일반적인 다층 구조와는 반대로, 단일 책임 원칙과 관심사 분리를 따르지 않는다는 점이다.
(다층 구조, SOLID 나중에 공부해보기)
분산 시스템
Record 기반 패턴은 동시성이 불가능한 분산 시스템에서 제대로 작동하지 않는다. 다시 말해, 두 업데이트 모두 올바른 필드에서 알맞게 진행되어도, 두 레코드 중 하나만 선택되어지는 것이다.
도메인과 데이터베이스 사이의 유연성
DM 패턴에서는 어플리케이션이 실제 데이터베이스 스킴에 대한 최종 결정 권한을 가지지 않는다. 가령 부적절한 데이터베이스에 대해, DM 패턴은 데이터 매핑 레이어 뒤에서 도메인에 관해 데이터베이스가 부적절한 방식으로 인지하지 못하도록 막는다.
더 좋은 성능을 낼 수 있다.
도메인 객체와 데이터베이스 사이에 추상화 및 간접화 계층이 있기 때문에 데이터 매퍼가 네이티브 액티브 레코드보다 더 효율적으로 사용할 수 있도록 한다.
Active record pattern - Wikipedia
ORM anti-patterns - Part 1: Active Record
Data mapper pattern - Wikipedia
ORM Patterns: The Trade-Offs of Active Record and Data Mappers for Object-Relational Mapping