[JPA] JPA(Java Persistence API) 란?

yurinnn·2024년 4월 15일
0

Java/Spring

목록 보기
13/13

자바 진영의 ORM 기술 표준이다.

ORM(Object-Relational Mapping) 이란?

  • 객체와 관계형 데이터베이스의 매핑을 뜻한다.
  • 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한 후에 ORM 프레임워크가 중간에서 매핑을 해준다.
  • 패러다임의 불일치를 해결해준다.
  • JPA는 애플리케이션과 JDBC 사이에서 동작한다.

개발자가 JDBC API 를 직접 썼다면, JPA 가 이걸 대신 해준다.

JPA 의 동작

예를 들어, 멤버 객체를 저장한다고 가정해보자.

  1. 저장

    멤버 객체를 멤버 DAO 에 넘기고 멤버 DAO 가 JPA 에게 멤버 엔티티를 저장해달라고 넘기면 JPA 가 알아서 멤버 객체를 분석하고 insert SQL 을 만들어준다. 그리고 JDBC API 를 사용해서 DB 에 insert 쿼리까지 날려준다.
    마치 자바 컬렉션을 저장하듯이 한 줄의 코드만 작성하면 된다.
  1. 조회

    find(id) 처럼 멤버 아이디에 대한 정보를 찾아달라고 하면 JPA 가 멤버 객체를 분석해서 select 쿼리를 만들고, JDBC API 를 사용하고, ResultSet 까지 매핑하고 패러다임의 불일치까지 해결해준다. 그 다음 Entity object 를 만들어서 반환 해준다.

JPA 소개

EJB 엔티티 빈은 복잡하고 성능도 좋지 않아서 개발자들이 많이 사용하지 않았다.
그래서 Gavin King 과 많은 개발자들이 함께 만든 Hibernate 라는 오픈 소스가 생겼다.
Java 에서 표준 ORM 명세를 Hibernate 를 기반으로 만들게 되었고, 이것이 JPA 이다. 표준이라 함은 여러 사람의 의견을 모아서 만들기 때문에 용어가 더 명확하게 정제된다.
표준 명세는 인터페이스의 모음이다. 대표적인 구현체는 3가지 정도가 있는데, 거의 80% 이상은 구현체로 Hibernate 를 쓴다.
즉, 우리는 JPA 표준 인터페이스에 Hibernate 구현체를 쓴다.

JPA 버전

  • JPA 1.0 : 복합 키와 연관관계 기능이 부족함
  • JPA 2.0 : 대부분의 ORM 기능을 포함하고 JPA Criteria 추가됨
  • JPA 2.1 : 스토어드 프로시저 접근, 컨버터(Converter), 엔티티 그래프 기능이 추가됨

JPA 를 사용해야 하는 이유

  1. 데이터 접근 추상화와 벤더 독립성

  2. 기술 표준이다.

  3. SQL 중심적인 개발에서 객체 중심으로 개발할 수 있다. (우리는 마치 자바 컬렉션에 객체를 저장하듯이 하면 된다.)

  4. 생산성이 향상된다.

    // 저장
    jpa.persist(member)
    // 조회
    Member member = jpa.find(memberId)
    // 수정
    member.setName("변경할 이름")
    // 삭제
    jpa.remove(member)
  5. 유지보수가 향상된다.

    • 기존에는 필드 변경시 모든 SQL 문을 수정해야 했다.
    • JPA 는 필드만 추가하면 알아서 해결해준다.
  6. 패러다임의 불일치를 해결해준다.

    • 상속, 연관관계, 객체 그래프 탐색, 비교하기 문제를 해결해준다.
    • insert

    • selectalbum 타입을 주고 조회를 하면 알아서 JOIN 해서 꺼내온다.

    • 연관관계, 객체 그래프 탐색이렇게 하면 알아서 memberId 가 속한 팀을 가져올 수 있다.

    • 신뢰할 수 있는 엔티티, 계층JPA 가 관리하는 객체인 Member 엔티티에서 각 메서드로 데이터를 가져올 수 있다. (지연 로딩이라는 기술)

    • JPA와 비교하기 기존에는 같은 id 로 조회해도 다르다고 나왔지만, JPA 로 조회하면 같은 인스턴스라고 나온다. 단, 동일한 트랜잭션 안에서 엔티티를 조회해야 한다.

  7. 성능이 좋아진다.

    • 1차 캐시와 동일성(identity) 보장
      같은 데이터베이스 트랜잭션 안에서는 같은 엔티티를 반환한다. → 약간의 조회 성능 향상
      • m1 에서 SQL 쿼리로 조회한 데이터를 들고 있다가 m2 에서는 쿼리를 날리지 않고 들고 있는 데이터를 메모리 상에서 가져와서 반환한다. 그래서 비교하면 같다고 나오게 된다. 즉, 조회를 2번 하지만 SQL 쿼리는 1번만 실행한다.
    • 트랜잭션을 지원하는 쓰기 지연
      트랜잭션을 커밋할 때까지 insert SQL 을 모은다. JDBC 의 Batch SQL 기능을 사용해서 한 번에 SQL 을 네트워크로 보낸다. 네트워크 통신 비용이 줄어든다.
    • 지연 로딩과 즉시 로딩
      • 지연 로딩 : 객체가 실제 사용될 때 로딩

      • 즉시 로딩 : JOIN SQL 로 한 번에 연관된 객체까지 미리 조회

        예를 들어, member 를 조회할 때 team 을 거의 안쓴다면 member 만 조회하는 것이 성능상 낫다. 이 때 지연 로딩 전략이 동작한다.
        member 를 조회할 때 team을 무조건 같이 쓴다면 JPA 에 세팅해놓으면 즉시 로딩 전략이 동작한다.

이 글은 김영한 강사님의 '자바 ORM 표준 JPA 프로그래밍' 강의를 들으며 작성하였습니다.

profile
슬기로운 개발 생활

0개의 댓글