ORM
Object Relational Mapping의 줄임말로 객체 관계 매핑을 의미한다.
자바와 같은 객체지향 언어에서 의미하는 객체와 RDB(Relational Database)의 테이블을 자동으로 매핑하는 방법

장점
- ORM을 사용하면서 데이터베이스 쿼리를 객체지향적으로 조작할 수 있다.
- 쿼리문을 작성하는 양이 현저히 줄어 개발 비용이 줄어든다.
- 객체지향적으로 데이터베이스에 접근할 수 있어 코드의 가독성을 높인다.
- 재사용 및 유지보수가 편리하다.
- ORM을 통해 매핑된 객체는 모두 독립적으로 작성되어 있어 재사용이 용이하다.
- 객체들은 각 클래스로 나뉘어 있어 유지보수가 수월하다.
- 데이터베이스에 대한 종속성이 줄어든다.
- ORM을 통해 자동 생성된 SQL문은 객체를 기반으로 데이터 테이블을 관리하기 때문에 데이터베이스에 종속적이지 않다.
- 데이터베이스를 교체하는 상황에서도 비교적 적은 리스크를 부담한다.
단점
- ORM만으로 온전한 서비스를 구현하기에는 한계가 있다.
- 복잡한 서비스의 경우 직접 쿼리를 구현하지 않고 코드로 구현하기 어렵다.
- 복잡한 쿼리를 정확한 설계 없이 ORM만으로 구성하게 되면 속도 저하 등의 성능 문제가 발생한다.
- 애플리케이션의 객체 관점과 데이터베이스의 관계 관점의 불일치가 발생한다.
- 세분성(Granularity): ORM의 자동 설계 방법에 따라 데이터베이스에 있는 테이블의 수와 애플리케이션의 엔티티(Entity) 클래스의 수가 다른 경우가 생긴다.(클래스가 테이블의 수보다 많아질 수 있습니다.)
- 상속성(Inheritance): RDBMS에는 상속이라는 개념이 없습니다.
- 식별성(Identity): RDBMS는 기본키(primary key)로 동일성을 정의한다. 하지만 자바는 두 객체의 값이 같아도 다르다고 판단할 수 있습니다. 객체 식별(a==b)과 객체 동일성 (a.equlas(b))을 모두 정의합니다.
- 연관성(Associations): 객체지향 언어는 객체를 참조함으로써 연관성을 나타내지만 RDMS에서는 외래키(foreign key)를 삽입함으로써 연관성을 표현한다. 또한 객체지향 언어에서 객체를 참조할 때는 방향성이 존재하지만 RDBMS에서 외래키를 삽입하는 것은 양방향의 관계를 가지기 때문에 방향성이 없다.
- 탐색(Navigation): 자바와 RDBMS는 어떤 값(객체)에 접근하는 방식이 다르다. 자바에서는 특정 값에 접근하기 위해 객체 참조 같은 연결 수단을 활용한다. 이 방식은 객체를 연결하고 또 연결해서 접근하는 그래프 형태의 접근 방식이다.
JPA
JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음입니다.
객체관계 매핑을 구현한 API
ORM이 큰 개념이라면 JPA는 더 구체와된 스펙을 포함합니다.
JPA 특징
- 개발자가 직접 쿼리문을 작성하지 않아도 된다.
- 개발자 대신 적절한 SQL을 생성해서 객체를 자동으로 Mapping하여 DB에 전달한다.
- 패러다임 불일치 문제를 해결해 준다.
- 생산성인 높다.
JPA의 메커니즘을 보면 내부적으로 JDBC를 사용
JPA는 대표적으로 세 가지가 있다.
하이버네이트(Hibernate), 이클립스 링크(EclipseLink), 데이터 뉴클리어스(DataNucleus)이며 가장 많이 사용하는 구현체는 하이버네이트
하이버네이트

자바의 ORM 프레임워크로, JPA가 정의하는 인터페이스를 구현하고 있는 JPA 구현체 중 하나입니다.
하이버네이트의 기능을 더욱 편하게 사용하도록 모듈화한 Spring Data JPA를 활용하기 때문에 JPA 자체를 직접 사용할 일은 거의 없습니다.
CRUD 처리에 필요한 인터페이스를 제공, 하이버네이트의 엔티티 매니저를 직접 다루지 않고 리포지토리를 정의해 사용함으로써 스프링이 적합한 쿼리를 동적으로 생성하는 방식으로 데이터베이스를 조작한다.
장점
- 생산성
- 메서드 호출만으로 쿼리가 수행, 즉 반복 작업을 하지 않음으로 생산성을 높아진다.
- 유지보수
- 테이블 칼럼이 변경되었을 때, 테이블과 관련된 DAO의 파라미터, 결과, SQL 등을 대신 수행해준다. 이로 인해 유지보수 측면에서 높아진다.
- 특정 벤더에 종속적이지 않다.
- JPA는 추상화된 데이터 접근 계층을 제공하기 때문에 특정 벤더에 종속적이지 않다.
- 설정 파일에서 JPA에게 어떤 DB를 사용하고 있는지를 알려주기만 하면 얼마든지 DB를 바꿀 수 있다.
- 패러다임 불일치 해결
- 상속, 연관 관계, 객체 그래프 탐색, 비교 등 객체와 관계형 데이터베이스와의 패러다임 불일치를 해결할 수 있다.
단점
https://livenow14.tistory.com/70
https://velog.io/@luke9701/JPA-Hibernate%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80