JPA

[JPA 1] JPA란?

snowkit 2022. 2. 22. 14:50

JPA 설명

ORM(Object-Relational Mapping)

  • OOP(Object-Oriented Programming)의 객체와 RDB(Relational DataBase)의 데이터를 간의 데이터를 변환하는 기술

JPA(Java Persistence API)

  • Java의 ORM을 위한 표준 인터페이스
    • 코드를 변경하지 않고 JPA를 구현한 다양한 ORM 프레임워크 간 전환을 쉽게 할 수 있다
  • 인터페이스와 규약만 제공하며, 자체적으로 동작하지는 않는다
    • 구현체가 필요하다(Hibernate, EclipseLink, OpenJPA 등)

Hibernate

  • Java의 ORM 프레임워크 중 가장 많이 사용되는 프레임워크
  • JPA를 구현한다

Spring Data JPA

설명

  • Spring Data JPA는 ORM 프레임워크가 아니다
  • Hibernate같은 JPA 구현체 위에서 동작하며, JPA를 더 쉽게 사용할 수 있도록 추상화한 라이브러리

JPA, Hibernate와 차이점

  1. Entity 저장
    • JPA, Hibernate
      1. EntityManager나 Session 객체를 이용하여 저장
      2. Transaction 객체로 트랜잭션 관리
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        session.save(entity);
        tx.commit();
        session.close();
    • Spring Data JPA
      • save() 메소드로 동일한 작업 수행
        userRepository.save(entity);
  2. 쿼리
    • JPA, Hibernate
      • JPQL, HQL 등 쿼리를 명시적으로 작성해야 함
      • Spring Data JPA에 비해 더 많은 코드와 설정 필요
    • Spring Data JPA
        • 쿼리를 명시적으로 작성하지 않더라도 인터페이스만 정의하면 메소드 이름을 통해 SQL 자동 생성 가능
        • @Query로 JPQL 간편하게 사용 가능
      public interface UserRepository extends JpaRepository<User, Long>
          List<User> findByName(String name);
          
          Query("SELECT u FROM User u WHERE u.status = :status")
          List<User> findByStatus(@Param("status") String status);
      }

JPA를 사용하는 이유

기존 JDBC, MyBatis 방식의 단점

  • DB 테이블에 맞춰서 일일히 웹 애플리케이션에 SQL을 작성해야 함
  • DB에 컬럼이 추가되거나 삭제되면 모든 SQL을 찾아서 수정해야 함(실수 발생 가능)
  • DB에 따라서 SQL 문법이 조금씩 다르기 때문에 DB를 변경하는 경우 큰 마이그레이션 비용 발생

JPA의 장점

  • JPA는 SQL을 자동으로 생성해주기 때문에 기존 방식의 문제를 대부분 해결할 수 있음
  • 생산성 향상
  • 유지보수 용이
  • JPA가 생성하는 SQL은 DB(dialect)를 설정해주면 자동으로 바뀌기 때문에 마이그레이션 비용 감소
  • 성능 향상

성능 최적화

1차 캐시

  • 한 트랜잭션 내에서 DB 조회 시 1차 캐시에 저장
    • 동일한 ID를 조회하는 경우, DB와 통신하지 않고 1차 캐시에서 반환

쓰기 지연

  • 한 트랜잭션 내에서 UPDATE, DELETE 쿼리로 인한 로우 락 시간 최소화
    • JPA 커밋 직전까지 DB에 SQL을 보내지 않고 메모리에 모아놓다가 커밋하는 순간 DB에 보내서 실행

지연 로딩(Lazy)과 즉시 로딩(Eager)

  • 지연 로딩
    • 객체를 사용하는 시점에 DB에 SQL 보내서 조회
      • Ex. Entity의 ID를 제외한 필드를 getter 등으로 불러오는 시점
    • 실제로 사용하지 않을, 연관 테이블의 모든 데이터를 메모리에 들고 있지 않기 위함
  • 즉시 로딩
    • 객체를 사용하지 않더라도 항상 조회

'JPA' 카테고리의 다른 글

[JPA 6] 연관관계 - @ManyToOne  (0) 2022.03.10
[JPA 5] 영속성 컨텍스트  (0) 2022.02.22
[JPA 4] JPA 기본 사용법  (0) 2022.02.22
[JPA 3] JPA Entity  (0) 2022.02.22
[JPA 2] JPA 설정  (0) 2022.02.22