[Spring] JPA란 - ORM, JPA, Hibernate

희원·2022년 2월 17일
0

JPA란

  • ORM
  • JPA
  • Hibernate

ORM (Object-relational mapping, 객체 관계 매핑)

데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법.

객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용하기 때문에 ORM 기법을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 객체 모델과 관계형 모델 간의 불일치를 해결한다.

ORM의 장점

  • 객체 지향적인 코드로 인해 더 직관적이고 비즈니스 로직에 더 집중할 수 있게 도와준다.
  • 재사용 및 유지보수의 편리성이 증가한다.
  • DBMS에 대한 종속성이 줄어든다.

ORM의 단점

  • 완벽한 ORM 으로만 서비스를 구현하기가 어렵다.

  • 프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵다.

  • 객체-관계 간의 불일치

    다음과 같은 특성에서 객체-관계 간의 불일치가 생긴다.

    • 세분성(Granularity)

      경우에 따라서 데이터베이스에 있는 테이블 수보다 더 많은 클래스를 가진 모델이 생길 수 있다.

    • 상속성(Inheritance)

      RDBMS는 객체지향 프로그래밍 언어의 특징인 상속 개념이 없다.

    • 일치(Identity)

      RDBMS는 기본키(primary key)를 이용하여 동일성을 정의한다. 그러나 자바는 객체 식별(a==b)과 객체 동일성(a.equals(b))을 모두 정의한다.

    • 연관성(Associations)

      객체지향 언어는 방향성이 있는 객체의 참조(reference)를 사용하여 연관성을 나타내지만 RDBMS는 방향성이 없는 외래키(foreign key)를 이용해서 나타낸다.

    • 탐색(Navigation)

      자바와 RDBMS에서 객체를 접근하는 방법이 근본적으로 다르다. 자바는 그래프형태로 하나의 연결에서 다른 연결로 이동하며 탐색한다. 그러나 RDBMS에서는 일반적으로 SQL문을 최소화하고 JOIN을 통해 여러 엔티티를 로드하고 원하는 대상 엔티티를 선택하는 방식으로 탐색한다.


JPA (Java Persistence API)

자바 ORM 기술에 대한 명세(자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식)를 정의한 인터페이스.

  • 데이터를 객체지향적으로 관리할 수 있기 때문에 개발자는 비즈니스 로직에 집중할 수 있고 객체 지향적인 개발이 가능하다.
  • 자바 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL을 생성한다.
  • 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원한다.
  • JPA는 성능 향상을 위해 지연 로딩이나 즉시 로딩과 같은 몇가지 기법을 제공하는데 이것을 잘 활용하면 SQL을 직접 사용하는 것과 유사한 성능을 얻을 수 있다.

JPA 동작 과정

JPA는 애플리케이션과 JDBC 사이에서 동작한다.
개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다.

  • insert

  • 개발자는 JPA에 Member 객체를 넘긴다.

  • JPA는

  1. Member 엔티티를 분석한다.
  2. INSERT SQL을 생성한다.
  3. JDBC API를 이용해 SQL을 DB에 전달한다.
  • find

  • 개발자는 JPA에 member의 pk 값을 넘긴다.

  • JPA는

  1. 엔티티의 매핑 정보를 바탕으로 적절한 SELECT SQL을 생성한다.
  2. JDBC API를 사용하여 SQL을 DB에 날린다.
  3. DB로부터 결과를 받아온다.
  4. 결과(ResultSet)를 객체에 모두 매핑한다.
  5. 쿼리를 JPA가 만들어 주기 때문에 Object와 RDB 간의 패러다임 불일치를 해결할 수 있다.

Hibernate (하이버네이트)

자바 언어를 위한 ORM 프레임워크로, JPA 인터페이스를 구현한 구현체의 한 종류.

  • 내부적으로 JDBC API를 사용한다. (Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 직접 작성하지 않을 뿐이다.)
  • HQL(Hibernate Query Language)이라 불리는 매우 강력한 쿼리 언어를 포함하고 있다.
  • Hibernate 외에도 ORM 프레임워크로는 EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있다.

참고

profile
모든 시작은 사소함으로부터

0개의 댓글