ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA - JPA(Java Persistence API)
    Spring/JPA 2022. 3. 7. 11:54
    반응형

     

     

     

     

     

    JPA(Java Persistence API)

    • 자바 진영의 ORM 기술 표준
    • 애플리케이션과 JDBC 사이에서 동작한다.

     

     

     

     

    ORM(Object-Relational Mapping

     

    • 객체 관계 매핑
    • 객체는 객체지향 관점으로 설계, RDB는 RDB관점으로 설계
    • ORM 프레임워크가 중간에서 매핑

     

     


     

    JPA 동작

     

     

    저장

     

    1. 저장할 Entity 객체를 JPA에 전달
    2. JPA는 Entity를 분석하여 INSERT SQL 생성
    3. JDBC API을 사용하여 쿼리 전달


     

    조회

     

    1. 조회할 테이블의 PK인 id를 JPA에 전달
    2. SELECT SQL 생성
    3. JDBC API 사용하여 해당 쿼리 전달
    4. 결과 값 Entity에 매핑하여 전달


     

     

    JPA의 장점

     

    생산성

     

    • 저장 : jpa.persist(member)
    • 조회 : jpa.find(memberId)
    • 수정 : member.setName("변경할 이름")
    • 삭제 : jpa.remove(member)
    • 위 메서드를 이용해 간단한 CRUD를 할 수 있다.

     

    유지보수

     

    • JPA를 이용하면 필드만 추가하면 된다. 즉, SQL은 신경 안 써도 된다.

     


     

    패러다임 불일치 해결

     

    • JPA와 상속 : 상속관계를 JPA가 처리해준다.

     

    • JPA와 연관관계, 객체 그래프 탐색
             - 연관관계 : member와 연관 관계있는 team
             - 객체 그래프 탐색 : member를 통해 team에 접근, 즉 참조 가능

     

    • 신뢰할 수 있는 엔티티, 계층
             - 지연 로딩을 통해 자유롭게 객체 그래프 탐색이 가능
    class MemberService {
        ...
        public void process() {
            Member member = memberDAO.find(memberId);
            member.getTeam(); //자유로운 객체 그래프 탐색
            member.getOrder().getDelivery();
        }
    }

     

    • 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장

     

    성능 최적화 기능

     

    • 1차 캐시와 동일성(identity) 보장
             - 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
    String memberId = "100";
    
    Member m1 = jpa.find(Member.class, memberId); //SQL
    Member m2 = jpa.find(Member.class, memberId); //캐시
    
    println(m1 == m2) //true

     

    • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
              - 트랜잭션을 커밋할 때까지 INSERT SQL을 모아서 한 번에 전송
    transaction.begin(); // [트랜잭션] 시작
    em.persist(memberA);
    em.persist(memberB);
    em.persist(memberC);
    
    //여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
    //커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
    transaction.commit(); // [트랜잭션] 커밋

     

    • 지연 로딩(Lazy Loading)
             - 객체가 실제 사용될 때 로딩

     

    반응형

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

    JPA - 연관관계 매핑  (0) 2022.03.08
    JPA - 엔티티 매핑  (0) 2022.03.08
    JPA - 영속성 컨텍스트  (0) 2022.03.07
    JPA - JPA의 내부 동작과 Entity의 생명주기  (0) 2022.03.07
    JPA - JPA의 등장  (0) 2022.03.07

    댓글

Designed by Tistory.