JPA 장점

Gyeongjae Ham·2023년 5월 18일
0

JPA

목록 보기
1/12
post-thumbnail

해당 시리즈는 김영한님의 JPA 로드맵을 따라 학습하면서 내용을 정리하는 글입니다

생산성 - JPA 와 CRUD

  • 저장: jpa.persist(member)
  • 조회: Member member = jpa.find(memberId)
  • 수정: member.setName("변경할 이름")
  • 삭제: jpa.remove(member)

유지보수

  • 기존: 필드 변경 시 모든 SQL 수정해야 했음
  • JPA: 필드만 추가하면 됨(JPA가 SQL문을 생성해주기 때문)

JPA와 패러다임과의 불일치 해결

  1. JPA와 상속

    • 상속관계일 경우(DB에서는 슈퍼타입 테이블과 서브타입 테이블 관계일 경우)
      • 저장할 때, 관계 맺은 테이블들에 모두 INSERT 를 해줘야 하지만 JPA를 사용하면 jpa.persist(객체) 를 하면 나머지 SQL은 JPA가 알아서 해준다
      • 조회할 때, 관계를 맺은 테이블들을 JOIN해서 SQL문을 작성해줘야 하지만, jpa.find(객체.class, id)를 하면 나머지 SQL을 JPA가 알아서 처리해준다
  2. JPA와 연관관계

    • 연관관계를 저장할 때, member.setTeam(team), jpa.persist(member) 와 같이 저장할 수 있다
  3. JPA와 객체 그래프 탐색

    • Member member = jpa.find(Member.class, memberId);
    • Team team = member.getTeam(); 처럼 객체를 탐색할 수 있다
  4. JPA와 비교하기

    • 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장받는다
    String memberId = "100"
    Membmer member1 = jpa.find(Member.class, memberId);
    Membmer member2 = jpa.find(Member.class, memberId);
    
    member1 == member2 // 같다
  5. JPA의 성능 최적화 기능

    1. 1차 캐시와 동일성 보장
      • 같은 트랜잭션 안에서는 같은 엔티티를 반환한다 - 약간의 조회 성능 향상(위 조회에서 SQL은 1번만 실행된다)
      • DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
    2. 트랜잭션을 지원하는 쓰기 지연 - INSERT
      • 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
      • JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
    transaction.begin(); // [트랜잭션] 시작
    
    em.persist(memberA);
    em.persist(memberB);
    em.persist(memberC);
    // 여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
    
    // 커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 한번에 보낸다.
    transaction.commit(); // [트랜잭션] 커밋
    1. 지연 로딩과 즉시 로딩
      - 지연 로딩: 객체가 실제 사용될 때 로딩
      - 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회
profile
Always be happy 😀

0개의 댓글

관련 채용 정보