백엔드/Spring

[Spring] JPA 개요

kwang2134 2024. 9. 7. 19:07
728x90
반응형
728x90

JPA (Java Persistence API)

  • Java 애플리케이션에서 객체-관계 매핑(ORM) 기술을 사용하여 데이터베이스와 상호 작용하는 표준 API
  • Java EE (Enterprise Edition) 스펙의 일부로, 객체지향 프로그래밍과 관계형 데이터베이스 사이의 간극을 줄여줌
  • JPA는 인터페이스의 모음이며, 실제 구현은 여러 ORM 프레임워크에서 제공
  • 주요 구현체
    • Hibernate: 가장 널리 사용되는 JPA 구현체로, 풍부한 기능과 높은 성능을 제공
    • EclipseLink: Eclipse Foundation에서 제공하는 구현체로, Java EE의 참조 구현
    • OpenJPA: Apache Software Foundation에서 제공하는 오픈 소스 구현체

SQL 중심 개발의 문제점

  • 상속 표현의 차이
    • 객체: 인터페이스 상속을 통해 사용
    • SQL: 외래키를 사용한 슈퍼타입-서브관계 표현
    • 상속이 표현된 객체 DB에 저장 시 객체를 분해하여 각자 insert 쿼리 필요
    • 상속이 표현된 객체 조회 시 각각 테이블에 대한 조인과 각각 객체를 생성하는 등 복잡한 과정 필요
  • 연관 관계 표현의 차이
    • 객체: 참조를 통한 연관 관계 표현
    • SQL: 외래키를 통한 연관 관계 표현
    • 객체는 참조를 통해 객체 그래프를 표현하여 객체 참조 그래프를 자유롭게 탐색하기 위해선 조회 시 연관된 모든 참조 객체를 같이 조회해야 함
  • 엔티티 신뢰 문제
    • 자유로운 탐색을 위해선 모든 연관된 객체를 미리 로딩해야 하나 성능상 불가능함
    • 상황에 따라 동일한 조회를 여러 번 생성할 가능성이 있고 재조회로 생성된 인스턴스는 다른 인스턴스이기 때문에 데이터의 신뢰성이 떨어짐

ORM(Object-relational mapping)

  • 객체는 객체의 형태로 설계
  • 관계형 데이터베이스는 관계형 데이터베이스 형태로 설계
  • ORM 프레임워크가 중간에서 매핑 작업을 실행

사용 목적

  • 객체 중심적 개발 가능
  • 생산성 향상 및 유지보수 편리
    • 개발자는 SQL 쿼리를 직접 구현할 필요 없음
    • 변경된 필드를 감지해 JPA가 직접 처리
  • 패러다임 불일치 해결
    • 상속관계, 연관 관계 문제를 JPA가 직접 처리
    • 동일한 트랜잭션 내에 조회한 엔티티는 같음을 보장
  • 성능 최적화
    • 1차 캐시와 동일성 보장:
      • 격리 수준이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
    • 트랜잭션을 지원하는 쓰기 지원:
      • 트랜잭션을 커밋할 때까지 INSERT SQL을 모아 JDBC BATCH SQL 기능을 사용해서 한 번에 전송
      • 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋
    • 지연 로딩과 즉시 로딩
      • 지연 로딩: 객체가 실제 사용될 때 로딩
      • 즉시 로딩: JOIN SQL로 한 번에 연관된 객체까지 미리 조회

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 | 김영한 - 인프런 (inflearn.com) 강의 내용 참고

 

 

728x90