자바 ORM 표준
JPA 는 자바에서 제공하는 API 로 자바 ORM 기술에 대한 표준 명세이다.
JPA 는 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다. JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus 같은 ORM 프레임워크를 사용해야 한다.
자바 진영에서 힘을 모아서 만든 ORM 기술 표준이며, 스프링 진영에서도 스프링 프레임워크 자체는 물론이고, 스프링 데이터 JPA 라는 기술로 적극 지원하고 있다.
구글 트렌드 검색결과 (최근5년)
Hibernate
, JPA
, mybatis
, SPRING DATA JPA
순
ORM vs Sql Mapper
- ORM은 데이터베이스 객체를 자바 객체로 매핑하여 객체 간의 관계를 바탕으로 SQL을 자동으로 생성해 주지만 SQL Mapper는 SQL을 명시해줘야 한다.
- ORM은 관계형 데이터베이스의 ‘관계’를 Object에 반영하자는 것이 목적이라면, SQL Mapper는 단순히 필드를 매핑시키는 것이 목적이라는 점에서 지향점의 차이가 있다.
- SQL Mapper 가 반복적인 DB Connection, SQL 의 재사용성을 많이 해소 했으나 미비했다. 또한 xml 로 관리되는 탓에 유지보수 문제도 있었다.
SQL Mapper
SQL
←mapping→ Object 필드- SQL 문으로 직접 디비를 조작한다.
- Mybatis, jdbcTemplate
ORM(Object-Relation Mapping/객체-관계 매핑)
DB 데이터
←mapping→ Object 필드- 객체를 통해 간접적으로 디비 데이터를 다룬다.
- 객체와 디비의 데이터를 자동으로 매핑해준다.
- SQL 쿼리가 아니라 메서드로 데이터를 조작할 수 있다.
- 객체간 관계를 바탕으로 sql을 자동으로 생성한다
- Persistant API라고 할 수 있다.
- JPA, Hibernate
(개발자는 매퍼가 아니다.)
ORM 장점
- 특정 DBMS에 종속되지 않는다.
- SQL문이 코드에 들어가지 않아 깔끔한 코드를 유지할 수 있다.
- ORM이 nesting데이터를 바인딩해준다.
ORM 단점
- RAW query에 비해 performance가 느리다.(이부분은 케바케)
- Query tuning이 힘들다.
- 서비스가 복잡해 질수록 ORM으로 할 수 있는 작업의 범위에 한계가 있다
Hibernate
위 사진은 JPA와 Hibernate의 상속 및 구현 관계를 나타낸 것이다.
JPA의 핵심인 EntityManagerFactory
, EntityManager
, EntityTransaction
인터페이스를 Hibernate에서는 각각 SessionFactory
, Session
, Transaction
으로 상속받고 구현하고 있다.
“Hibernate는 JPA의 구현체이므로 JPA 를 위해 꼭 사용해야 하는것은 아니다. 위에서 언급한 다른 JPA 구현체를 사용해도 무방하지만 Hibernate 만큼 성숙한 라이브러리를 찾기 어렵다.
Hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는다는 것은 아니며, Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있다.
Spring Data JPA
Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로, 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다
Spring Data JPA 를 사용하여 개발하면 EntityManager 를 직접 다뤄서 개발하지 않는다. 이는 Spring Data JPA 에서 JPA를 추상화시킨 Repository
인터페이스를 제공하여 가능하다.
사용자가 Repository
인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.