JPA란?

코딩을 합시다·2023년 4월 19일
0
post-thumbnail

ORM(Object-relational mapping)이란?

  • object-relational mapping (객체 관계 매핑)
    • 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터 베이스대로 설계
    • 이를 ORM 프레임워크가 중간에서 매핑해주는 것을 뜻함
  • 대중적인 언어에는 대부분 ORM 기술이 존재함
  • ORM은 객체와 RDB 두 기둥 위에 있는 기술임

JPA(Java Persistence API)란?

  • EJB

    • 과거의 자바 표준(Entity Bean)

    • 과거의 ORM

    • 문제점

      • 코드가 매우 지저분함
      • API 복잡성이 높음(interface를 많이 구현해야함)
      • 속도가 느림
  • Hibernate
    - ORM 프레임워크, Open Source SW

  • JPA(Java Persistence API)
    - 현재 자바 진영의 ORM 기술 표준, 인터페이스의 모음이다.
    - 즉 실제로 동작 X
    - JPA 인터페이스를 구현한 대표적인 오픈소스가 Hibernate라고 할 수 있음

    • JPA 표준 명세를 구현한 3가지 구현체: Hibernate, EclipseLink, DataNucleus
    • 위에 설명한 3가지의 구현체 중 하나를 사용해서 개발을 진행하면 된다.
    • 만약 3가지의 구현체가 모두 마음에 들지 않는다면 개발자가 직접 JPA 구현체를 만들어 사용할 수도 있다.

JPA의 동작 과정

  • JPA는 애플리케이션과 JDBC 사이에서 동작한다.

    • 개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하고 DB와 통신을 한다
    • 즉, 개발자가 직접 JDBC API를 쓰는 것이 아니다.

저장 과정

  • Ex) MemberDAO에서 객체를 저장하고 싶을 때
    - 개발자는 JPA에 Member 객체를 넘긴다
    • JPA는

        1. Member 엔티티를 분석한다.
        1. INSERT SQL을 생성한다.
        1. JDBC API를 사용하여 SQL을 DB에 날린다.

조회 과정

  • Ex) Member 객체를 조회하고 싶을 떄
    - 개발자는 member의 pk 값을 JPA에 넘긴다
    • JPA는

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

JPA를 사용하는 이유

  • SQL 중심적인 개발에서 객체 중심적인 개발이 가능하다.
  • 생산성이 증가한다
    • DDL문 자동 생성
    • 간단한 메서드로 CRUD가 가능해진다
    • SQL을 작성하고 JDBC API를 사용하는 반복적인 일을 대신 처리해준다.
  • 유지보수가 쉽다.
    • 기존 : 필드 변경시 모든 SQL 수정
    • JPA : 필드만 추가하면 된다. SQL은 JPA가 처리한다
  • Object와 RDB간의 패러다임 불일치 해결
    • 상속 / 연관관계 / 객체 그래프 탐색 / 비교하기 같은 패러다임 불일치를 해결한다
    • JAVA에 존재하는 상속관계를 객체간의 상속관계를 지원하지 않는 데이터베이스에서 JPA는 아래와 같은 방식으로 해결하였다.

JPA의 장/단점

장점

  • SQL문이 아닌 메서드를 통해서 DB 조작이 가능하므로 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중이 가능함
  • Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높임
  • 객체지향적인 코드 작성이 가능해짐
  • 유지보수 및 리팩토링에 유리하다.
  • 예를들어 기존 방식에서 MySQL 데이터베이스를 사용하다가 PostgreSQL로 변환한다고 가정해보면, 새로 쿼리를 짜야하는 경우가 생김. 이런 경우에 ORM을 사용한다면 쿼리를 수정할 필요가 없음

단점

  • 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우에는 속도 저하 및 일관성을 무너뜨리는 문제점이 발생할 수도 있다(개발자가 의도하지 않은 자동으로 생성된 Query로 인해 성능이 저하되기도 함)
  • 복잡하고 무거운 Query문은 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 쓰는게 나은 상황이 발생할 수도 있다.
  • 학습비용이 비싸고 시간이 오래걸림

추가 내용

스프링에서 흔히 사용하는 JPA는 JPA를 이용하는 Spring-data-jpa 프레임워크이다.


참고

0개의 댓글