공식 문서를 참고해서 내용을 정리해보자.
Django,Sequelize 모두 orm에 대한 설명은Object–relational mapping Wikipedia로 대체 되어있다.
Hibernate 만 자체적인 Hibernate - What is Object/Relational Mapping?이라는 문서가 있어, 이 문서를 기반으로 내용을 정리해보자.
영속성 - Persistence
하이버네이트 ORM은 애플리케이션이 영속성을 달성하는 데 도움을 줍니다.
그렇다면 영속성이란 무엇일까요?
영속성은 간단히 말해서 애플리케이션의 데이터가 애플리케이션 프로세스의 수명보다 오래 지속되길 원하는 것을 의미합니다.
Java 용어로는 객체의 상태가 JVM의 수명이 다 되어도 동일한 상태가 나중에도 사용 가능하도록 하고 싶은 것입니다.
관계형 데이터베이스 - Relational Databases
구체적으로 하이버네이트 ORM은 관계형 데이터베이스(RDBMS)에 적용되는 데이터 영속성에 관심이 있습니다.
객체 지향 애플리케이션의 세계에서는 종종 객체 데이터베이스(ODBMS) 대신 RDBMS를 사용하는 것에 대한 논의가 있지만,
RDBMS는 여전히 매우 인기 있는 영속성 메커니즘이며 앞으로도 그럴 것입니다.
객체-관계 불일치 - The Object-Relational Impedance Mismatch
'객체-관계 불일치'(때로는 '패러다임 불일치'라고도 함)는 객체 모델과 관계 모델이 서로 잘 작동하지 않는다는 것을 표현한 것입니다.
RDBMS는 데이터를 표 형식으로 나타내며(스프레드시트는 RDBMS에 익숙하지 않은 사람을 위한 좋은 시각화 도구입니다),
Java와 같은 객체 지향 언어는 객체의 상호 연결된 그래프로 나타냅니다.
객체 그래프를 테이블 형태의 관계형 데이터베이스를 사용하여 로드하고 저장하면 5가지 불일치 문제가 발생합니다.
일반성
때로는 객체 모델이 데이터베이스의 해당 테이블 수보다 클래스 수가 많은 경우가 있습니다(객체 모델이 관계 모델보다 더 세분화되었다고 말합니다).
하위 유형(상속)
상속은 객체 지향 프로그래밍 언어에서 자연스러운 패러다임입니다.
그러나 RDBMS는 전반적으로 유사한 것을 정의하지 않습니다(예, 일부 데이터베이스는 하위 유형 지원을 하지만 완전히 표준화되지 않음).
정체성
RDBMS는 '동일성'의 개념을 정확히 하나 정의합니다: 기본 키(primary key).
그러나 Java는 객체 동일성 a==b와 객체 동등성 a.equals(b)을 모두 정의합니다.
연관
연관은 객체 지향 언어에서는 단방향 참조로 나타내지만 RDBMS는 외래 키의 개념을 사용합니다.
Java에서 양방향 관계가 필요한 경우 관계를 두 번 정의해야 합니다.
또한 객체 도메인 모델을 보고 관계의 다중성을 결정할 수 없습니다.
데이터 탐색
Java에서 데이터에 접근하는 방식은 관계형 데이터베이스에서 하는 방식과 근본적으로 다릅니다.
Java에서는 객체 네트워크를 거쳐 한 연관에서 다른 연관으로 이동합니다.
이는 관계형 데이터베이스에서 데이터를 검색하는 효율적인 방법이 아닙니다.
일반적으로 SQL 쿼리의 수를 최소화하고 JOIN을 통해 여러 개체를 로드한 다음 객체 네트워크를 탐색하기 전에 대상 개체를 선택하는 것이 좋습니다.
객체/관계 매핑
하이버네이트 ORM은 개발자가 수명을 초과하는 데이터(영속성 데이터)를 다루는 애플리케이션을 보다 쉽게 작성할 수 있게 해줍니다.
객체/관계 매핑(ORM) 프레임워크로서 Hibernate는 관계형 데이터베이스(데이터베이스 연결을 통한 JDBC를 통한)에 적용되는 데이터 영속성과 관련이 있습니다.
JPA 공급자
하이버네이트는 자체 "네이티브" API 외에도 Java Persistence API (JPA) 명세의 구현입니다.
이에 따라 Java SE 애플리케이션, Java EE 애플리케이션 서버, Enterprise OSGi 컨테이너 등 JPA를 지원하는 환경에서 쉽게 사용할 수 있습니다.
관용적인 영속성 - Idiomatic persistence
Hibernate는 상속, 다형성, 연관, 구성 및 Java 컬렉션 프레임워크와 같은 자연스러운 객체 지향 관용구를 따르는 영속 클래스를 개발할 수 있게 해줍니다.
Hibernate는 영속 클래스에 대해 인터페이스나 기본 클래스를 요구하지 않으며 모든 클래스나 데이터 구조를 영속적으로 만들 수 있습니다.
높은 성능
Hibernate는 지연 초기화, 다양한 데이터 가져오기 전략, 자동 버전 관리 및 타임 스탬프를 지원하는 낙관적 락킹(optimistic locking)을 지원합니다.
Hibernate는 특별한 데이터베이스 테이블이나 필드를 필요로하지 않으며 SQL의 많은 부분을 런타임이 아닌 시스템 초기화 시간에 생성합니다.
하이버네이트는 개발자 생산성과 런타임 성능 측면에서 직접 JDBC 코드보다 우수한 성능을 제공합니다.
확장성
하이버네이트는 애플리케이션 서버 클러스터에서 작동하도록 설계되었으며 높은 확장성을 제공하는 아키텍처를 제공합니다.
하이버네이트는 어떤 환경에서도 잘 확장됩니다.
수백 명의 사용자를 대상으로 하는 내부 인트라넷을 구동하거나 수십만 명의 사용자를 대상으로 하는 중요한 애플리케이션에 사용할 수 있습니다.
신뢰성
하이버네이트는 훌륭한 안정성과 품질로 잘 알려져 있으며, 수만 명의 Java 개발자에 의한 수용과 사용을 통해 입증되었습니다.