JPA Introduction

jyKim·2023년 3월 6일
0

JPA

목록 보기
2/7
post-thumbnail

JPA

  • Java Persistence API
  • JPA는 표준 명세이다 -> JPA는 인터페이스의 모음
  • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
  • 자바 ORM 기술 표준
  • 대표적인 JPA 구현체 -> Hibernate

    ORM?

    Object-relational mapping(객체 관계 매핑)
    객체와 RDB 사이를 매핑해 주는 것
    객체는 객체대로, RDB는 RDB대로 설계 -> ORM 프레임워크가 중간에서 매핑

JPA 동작

  • 애플리케이션과 JDBC 사이에서 동작
    JPA-ARCH
  • INSERT(저장)
  • SELECT(조회)

Why JPA?

  • SQL 중심적 개발 -> 객체 중심적 개발 이동
  • 생선성
    • JPA CRUD 구현체를 통해 간단하게 처리 가능
    • persist(저장), find(조회), set(수정), remove(삭제)
  • 유지보수
    • 기존에는 필드 변경시 모든 SQL을 수정해야함 -> JPA는 필드만 추가함으로서 해결됨
  • 패러다임 불일치 해결
    • 상속
        jpa.persist(album); // 한줄로 처리 가능
        // SQL은 JPA가 처리
        // INSERT INTO ITEM ...
        // INSERT INTO ALBUM ...  
    • 연관관계
        // 연관관계 설정된 객체 조회
        Album album = jpa.find(Album.class, albumId);
        // 연관관계 저장
        member.setTeam(team);
        jpa.persist(member);
        // SELECT, JOIN은 JPA가 처리
    • 객체 그래프 탐색
        // 자유로운 객체 그래프 탐색 가능
        Member member = jpa.find(Member.class, memberId);
        Team team = member.getTeam();
        Order order = member.getOrder();
    • 비교하기
        // 해당 조회는 1번의 SQL만 실행됨
       String memberId = "100";
        Member member1 = jpa.find(Member.class, memberId);
        Member member2 = jpa.find(Member.class, memberId);
        // 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장
        member1 == member2; // true
    • 이러한 특징을 통해 엔티티 계층 신뢰성을 보장
  • 성능
    • 1차 캐시와 동일성(identity) 보장
      • 같은 트랜잭션 안에서는 같은 엔티티를 반환
      • 첫 조회라면 SQL을 날려 메모리에 저장 -> 이후 동일 객체 조회 시 SQL을 날리지 않고 메모리에 저장된 객체를 반환(캐싱 기능)
      • DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
    • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
      • 트랜잭션을 커밋할 때까지 INSERT SQL을 모음

      • JDBC BATCH SQL 기능을 사용하여 한번에 INSERT SQL 전송

        transaction.begin();
        
        em.persist(memberA);
        em.persist(memberB);
        em.persist(memberC);
        
        transaction.commit();
    • 지연 로딩(lazy loading) & 즉시 로딩(eager loading)
      • 엔티티가 실제 사용될때 SQL을 날려서 로딩하는 방식
      • 즉시로딩 : join sql로 한번에 연관된 객체까지 미리 조회하는 방식
profile
백엔드애옹

0개의 댓글