ORM이란?
ORM(Object Relational Mapping):
객체 관계 매핑. 자바와 같은 객체지향 언어에서 의미하는 객체와 RDB(Relational Database)의 테이블을 자동으로 매핑하는 방법이다.
클래스는 데이터베이스의 테이블과 매핑하기 위해 만들어진 것이 아니기에 RDB 테이블과 어쩔 수 없는 불일치가 존재한다. ORM은 둘의 불일치와 제약사항을 해결한다. 그림으로 소개하자면 다음과 같다.

ORM을 이용하면 쿼리문 작성이 아닌 코드(메서드)로 데이터를 조작할 수 있다.
ORM의 장점
- ORM을 사용하면서 데이터베이스 쿼리를 객체지향적으로 조작할 수 있다.
- 쿼리문을 작성하는 양이 현저히 줄어 개발 비용이 줄어듬
- 객체지향적으로 데이터베이스에 접근할 수 있어 코드의 가독성 ⬆️
- 재사용 및 유지보수가 편리하다.
- ORM을 통해 매핑된 객체들은 모두 독립적으로 작성되어 있어 재사용이 용이함
- 객체들은 각 클래스로 나뉘어 있어 유지보수가 편리함
- 데이터베이스에 대한 종속성이 줄어든다.
- ORM을 통해 자동 생성된 SQL문은 객체를 기반으로 테이블을 관리하기에 데이터베이스에 종속적이지 않음
- 데이터베이스를 교체하는 상황에서도 비교적 적은 리스크를 부담함
ORM의 단점
- ORM만으로 온전한 서비스를 구현하기에는 한계가 있다.
- 복잡한 서비스의 경우 직접 쿼리를 구현하지 않고 코드로 구현하기 어려움
- 복잡한 쿼리를 정확한 설계 없이 ORM만으로 구성하게 되면 성능 문제가 발생함
- 애플리케이션의 객체 관점과 데이터베이스의 관계 관점의 불일치가 발생한다.
- 세분성(Granularity): ORM의 자동 설계 방법에 따라 데이터베이스에 있는 테이블 수와 애플리케이션의 엔티티(Entity) 클래스 수가 다른 경우가 생김
- 상속성(Inheritance): RDBMS에는 상속이라는 개념이 없음
- 식별성(Identity): RDBMS는 기본키(PK)로 동일성을 정의하지만 자바는 두 객체의 값이 같아도 다르다고 판단할 수 있음
- 연관성(Associations):
- Java: 객체를 참조함으로써 연관성을 나타냄. 방향성⭕
- RDBMS: 외래키(FK)를 삽임함으로 연관성을 표현함. 방향성❌ (양방향)
- 탐색(Navigation):
- Java: 특정 값에 접근하기 위해 객체 참조를 사용 (객체를 연결하고 또 연결)
ex) member.getOrganization().getAddress()
- RDBMS: 쿼리를 최소화하고 JOIN을 통해 여러 테이블을 로드하고 값을 추출함
JPA란?
JPA(Java Persistence API):
자바 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음이다. ORM이 큰 개념이라면 JPA는 더 구체화된 스펙을 포함한다. 즉, JPA는 어떻게 동작해야 하는지 매커니즘을 정리한 표준 명세라고 생각하면 된다. 그림에서 JPA 역할 = ORM이라고 보면 된다.

JPA의 매커지늠을 보면 내부적으로 *JDBC를 사용한다. 개발자 대신 적절한 SQL을 생성하고 데이터베이스를 조작해서 객체를 자동 매핑하는 역할을 수행한다.
JDBC(Java Database Connectivity): 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API, JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.
JPA 기반의 구현체는 대표적으로 세 가지가 있다.

하이버네이트(Hibernate), 이클립스 링크(EclipseLink), 데이터 뉴클리어스(DataNucleus)
이 중 가장 많이 사용되는 것은 하이버네이트이다.
하이버네이트란?
하이버네이트(Hibernate):
자바의 ORM 프레임워크로, JPA가 정의하는 인터페이스를 구현하고 있는 JPA 구현체 중 하나이다. 그러나 보통은 하이터네이트의 기능을 더욱 편하게 사용하도록 모듈화된 Spring Data JPA를 활용하기 때문에 JPA 자체를 지겁 사용할 일은 거의 없다.
Spring Data JPA
- JPA를 편리하게 사용할 수 있도록 지원하는 스프링 하위 프로젝트 중 하나이다. CRUD 처리에 필요한 인터페이스를 제공한다.
- 하이버네이트의 엔티티 매니저(EntityManager)를 직접 다루지 않고 Repository를 정의해 사용함으로써 스프링이 적합한 쿼리를 능동적으로 생성하는 방식으로 데이터베이스를 제공한다.
Spring Data JPA는 하이버네이트에서 자주 사용되는 기능을 더 쉽게 사용할 수 있게 구현한 라이브러리라고 볼 수 있다.
