Spring/JPA

JPA - JPA(Java Persistence API)

jddng 2022. 3. 7. 11:54
728x90
반응형

 

 

 

 

 

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)
           - 객체가 실제 사용될 때 로딩

 

728x90
반응형