JPA (Java Persistence API) 란?

문지원(JiwonMoon)·2022년 8월 7일
0
post-thumbnail

ORM(Object-relational mapping)

ORM에 관해 간단히 설명하고 가자면,
ORM은 Object Relational Mapping(객체-관계-매핑)의 약자로 객체와 DB의 관계를 매핑해주는 도구이다.
즉, 프로그래밍 언어의 객체와 RDB의 데이터를 자동으로 매핑해주는 도구이다.
또한 디자인패턴 중 MVC 패턴의 Model을 기술하는 도구이다.

사용하는 이유는 DB의 접근을 프로그래밍 언어의 관점에서 맞출 수 있다
이 말은 즉슨 DB의 SQL문을 직접 작성하지 않고 엔티티를 객체로 표현할 수 있다.

JPA (Java Persistence API) 란?

현재 자바 진영의 ORM 기술 표준으로, 인터페이스들의 모음이다.
(특정 기능을 하는 라이브러리가 아니다.)
또한 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
인터페이스이기 때문에 Hibernate, OpenJPA emddl JPA를 구현한다.

특징을 살펴보면,

  1. 자바 ORM의 기술표준
  2. 대표적인 오픈소스로 Hibernate
  3. CRUD 메소드 기본제공
  4. 쿼리문 작성하지 않아도 된다

즉, 이와 같은 특성 덕분에 객체 중심으로 개발이 가능하나 복잡한 쿼리에 대한 대응은 어렵다.

JPA의 사용 목적

"SQL이 아닌 객체 중심으로 개발할 수 있다"

JPA는 반복적인 CRUD SQL을 처리해준다 또한 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL의 실행될지만 생각하면 된다.
그리고 관계매핑이 어렵거나 성능 이슈가 우려될 경우 SQL을 직접 작성하여 사용할 수 있는 장점이 있다.

처음 언급했듯이 객체 중심 개발을 하게되면 생산성 향상과 유지보수가 쉽다.

Hibernate 란?

Hibernate 란 JPA의 구현체 중 하나로, SQL을 사용하지 않고 직관적인 코드(메소드)를 사용해 데이터를 조작할 수 있다.
Hibernate는 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는 것은 아니며, Hibernate 가 지원하는 메소드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 작성하지 않을 뿐이다.

JPA와 Hibernate는 마치 자바의 인터페이스와 해당 인터페이스를 구현한 클래스와 같은 관계다.

위 사진은 JPA와 Hibernate의 상속 및 구현 관계를 나타낸 것이다.
JPA의 핵심인 EntityManagerFactory, EntityManager, EntityTransaction 을 Hibernate에서는 각각 SessionFactory, Session, Transaction 으로 상속받고 각각 impl로 구현하고 있음을 확인할 수 있다.

Hibernate의 장단점

장점

  • 생산성
    • Hibernate 는 SQL을 직접 사용하지 않고, 메소드 호출만으로 쿼리가 수행된다.
    • 즉, 반복적인 SQL 작업과 CRUD 작업을 직접하지 않으므로 생선성이 높아진다.
  • 유지보수
    • 테이블 컬럼이 변경되었을 경우,
      MyBatis에서는 관련 DAO의 파라미터, 결과, SQL 등을 모두 확인하여 수정해야 하지만 JPA에서는 이런일들을 대신 해주기 때문에 유지보수 측면에서 좋다.
  • 객체지향적 개발
    • 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중할 수 있다.
    • 로직을 쿼리에 집중하기 보다 객체 자체에 집중할 수 있다.

단점

  • 어렵다.
    • 많은 내용이 감싸져 있기 때문에 JPA를 잘 사용하기 위해서는 숙지해야할 사항이 많다.
    • 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다.
  • 성능
    • 메소드 호출로 쿼리를 실행하는 것은 내부적으로 많은 동작이 있다는 것을 의미하므로, 직접 SQL을 호출하는 것 보다 성능이 떨어질 수 있다.
    • 실제로 초기의 ORM은 쿼리가 제대로 수행되지 않았고, 성능도 좋지 못했다고 한다 하지만 현재는 수 없이 발전하고, 좋은 성능을 보여주고 있다.
  • 세밀함이 떨어진다.
    • 메소드 호출로 SQL을 실행하기 때문에 세밀함이 떨어진다. 또한 객체간의 매핑 (Entity Mapping)이 잘못되거나 JPA를 잘못 사용하여 의도하지 않은 동작을 할 수도 있다.
    • 복잡한 통계 분석 쿼리를 메소드 호출로 처리하는 것은 힘들다.
      이것을 보완하기 위해 JPA에서는 SQL과 유사한 기술인 JPQL을 지원한다.
      SQL 자체 쿼리를 작성할 수 있도록 지원도 하고 있다.

Spring Data JPA

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 (참고 자료)

0개의 댓글