ORM에 관해 간단히 설명하고 가자면,
ORM은 Object Relational Mapping(객체-관계-매핑)의 약자로 객체와 DB의 관계를 매핑해주는 도구이다.
즉, 프로그래밍 언어의 객체와 RDB의 데이터를 자동으로 매핑해주는 도구이다.
또한 디자인패턴 중 MVC 패턴의 Model을 기술하는 도구이다.
사용하는 이유는 DB의 접근을 프로그래밍 언어의 관점에서 맞출 수 있다
이 말은 즉슨 DB의 SQL문을 직접 작성하지 않고 엔티티를 객체로 표현할 수 있다.
현재 자바 진영의 ORM 기술 표준으로, 인터페이스들의 모음이다.
(특정 기능을 하는 라이브러리가 아니다.)
또한 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
인터페이스이기 때문에 Hibernate, OpenJPA emddl JPA를 구현한다.
특징을 살펴보면,
즉, 이와 같은 특성 덕분에 객체 중심으로 개발이 가능하나 복잡한 쿼리에 대한 대응은 어렵다.
"SQL이 아닌 객체 중심으로 개발할 수 있다"
JPA는 반복적인 CRUD SQL을 처리해준다 또한 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL의 실행될지만 생각하면 된다.
그리고 관계매핑이 어렵거나 성능 이슈가 우려될 경우 SQL을 직접 작성하여 사용할 수 있는 장점이 있다.
처음 언급했듯이 객체 중심 개발을 하게되면 생산성 향상과 유지보수가 쉽다.
Hibernate 란 JPA의 구현체 중 하나로, SQL을 사용하지 않고 직관적인 코드(메소드)를 사용해 데이터를 조작할 수 있다.
Hibernate는 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는 것은 아니며, Hibernate 가 지원하는 메소드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 작성하지 않을 뿐이다.
JPA와 Hibernate는 마치 자바의 인터페이스와 해당 인터페이스를 구현한 클래스와 같은 관계다.
위 사진은 JPA와 Hibernate의 상속 및 구현 관계를 나타낸 것이다.
JPA의 핵심인 EntityManagerFactory, EntityManager, EntityTransaction 을 Hibernate에서는 각각 SessionFactory, Session, Transaction 으로 상속받고 각각 impl로 구현하고 있음을 확인할 수 있다.
Spring Data JPA 란 Spring 에서 제공하는 모듈 중 하나로 JPA를 쉽고 편하게 사용할 수 있도록 도와준다.
기존에 JPA를 사용하려면 EntityManager를 주입받아 사용해야 하지만, Spring Data JPA가 JPA를 한단계 더 추상화 시킨 Repository 인터페이스를 제공한다.
Spring Data JPA가 JPA를 추상화 했다는 말은, Spring Data JPA의 Repository의 구현에서 JPA를 사용하고 있다는 것
즉, 사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면,
Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.
References (참고 자료)