본문 바로가기
Spring/JPA

JPA(Java Persistence API)란

by o3oppp 2023. 8. 17.

JPA

  • JAVA 진영의 ORM 기술 표준으로 사용되는 인터페이스 모음으로 구현된 클래스와의 매핑을 위해 사용되는 프레임워크
  • ORM(Object Relational Mapping)
    • 객체와 데이터베이스를 매핑해 주는 기술
    • 객체는 객체대로, 관계형 DB는 관계형 DB대로 설계
    • ORM 프레임워크가 중간에서 매핑 역할

 

Hibernate

  • 대표적인 JPA를 구현한 구현체
  • EntityManagerFactory, EntityManager, EntityTransaction 등을 상속받아 구현

 

JPA 사용 이유

  1. SQL 중심적인 개발에서 객체 중심적인 개발이 가능. 즉, 반복적인 CRUD 작업이 필요가 없음
  2. 생산성
em.persist(member) // 저장
Member member = em.find(memberId) // 조회
member.setId(변경할 ID) // 수정
em.remove(member) // 삭제
  1. 유지보수
    • 기존 SQL 중심적인 개발에서는 컬럼 추가 시 INSERT 쿼리 또한 컬럼 추가 필요
    • 그러나 JPA를 사용함으로써 class에 필드만 추가하면 나머지는 JPA가 처리
  2. 객체와 DB 패러다임 불일치 해결
    • 패러다임 불일치란 간단히 말해 객체지향에서는 추상화, 상속, 다형성 등의 개념이 존재하지만 데이터베이스에서는 이와 같은 개념이 존재하지 않아 발생하는 여러 문제를 뜻함
    • 객체는 상속이 존재하지만 테이블은 상속 기능이 미존재
    • 상속을 위해 객체를 저장, 부모/자식 테이블에 INSERT는 JPA가 처리
      em.persist(member)
    • 조회를 위해 find()를 사용, 테이블간의 JOIN은 JAP가 처리
      Member member = em.find(Member.class, 100L);
    • 연관관계 설정
      member.setTeam(team); // 회원과 팀 관계 설정
      em.persist(member); // 회원과 연관관계 저장
    • 객체 그래프 탐색
      Member member = new Member(Member.class, 100L); 
      Team team = member.getTeam(); // 자유로운 객체 그래프 탐색 가능
    • 동등성 비교 (같은 트랙잭션 안에서는 같은 객체가 조회되는 것을 보장)
      Member m1 = em.find(Member.class, memberId);
      Member m2 = em.find(Member.class, memberId);
      m1 == m2 // true
  3. 성능 최적화
  • 1차 캐시와의 동일성 보장
    • 같은 트랙잭션 안에서는 같은 엔티티를 반환 (약간의 조회 성능 향상)
Member m1 = em.find(Member.class, memberId);
Member m2 = em.find(Member.class, memberId);

m1 == m2 // true
  • 트랜잭션을 지원하는 쓰기 지연
    • 트랜잭션을 커밋할 때까지 SQL을 모음
    • JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
    • 네트워크 통신 비용 절약
transaction.begin(); // 트랜잭션 시작

em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// 여기까지 INSERT SQL을 데이터베이스에 보내지 않음

transaction.commit(); // 커밋하는 순간 SQL을 모아서 보냄
  • 지연 로딩과 즉시 로딩
    • 지연 로딩 : 객체가 실제 사용될 때 로딩
    • 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회

 

동작 방식

  1. Persistence 생성
  2. EntityManagerFactory 생성 (1개만 생성하여 애플리케이션 전체에서 공유)
  3. EntityManager 사용 (트랜잭션 1개당 1개, 스레드간 공유 불가, 사용 후 재사용 불가)
  4. EntityTransaction 시작
  5. try catch 내 코드 입력
  6. EntityTransaction 종료
  7. EntityManager 종료
  8. EntityManagerFactory 반환
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); 
EntityManager em = emf.createEntityManager(); 
EntityTransaction tx = em.getTransaction();

tx.begin();
try{
    Member member = new Member();
    member.setId(2L);
    member.setName("HelloB");
    ...
    em.persist(member); 
    ...
    tx.commit();
}catch(Exception e){
    tx.rollback();
}finally{
    em.close();
}
emf.close();

'Spring > JPA' 카테고리의 다른 글

MappedSuperclass  (0) 2023.12.20
상속관계 매핑  (0) 2023.12.20
연관관계 매핑  (1) 2023.12.19
엔티티 매핑  (0) 2023.08.25
영속성 관리  (0) 2023.08.22