Spring

JPA가 뭘까?

토니짱 2022. 9. 29. 13:02

JPA란?

JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다.

즉, 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크다.

대표적으로 Hibernate가 있다.

 

ORM이 뭔데?

  • Object-relational mapping(객체 관계 매핑)
  • 객체는 객체대로 설계 , RDB(Relational DataBase, 관계형 데이터베이스)는 RDB대로 설계
  • ORM 프레임워크가 중간에서 매핑

 

ORM을 왜 사용할까?

SQL문이 아닌 Method를 통해 DB를 조작하여 개발자는 객체 모델을 이용하여 비즈니스 로직에만 집중할 수 있다.

객체를 이용하여 개발하기 때문에 객체 지향적 코드 작성이 가능하고 생산성이 증가한다.

데이터베이스가 교체되어도 쿼리를 수정할 필요가 없다.

 

그러나 프로젝트의 규모가 크고 복잡해서 설계가 잘못된다면, 속도 저하 및 일관성이 무너진다.

 

JPA(Java Persistence API)

  • Java진영에서 ORM 기술 표준으로 사용하는 인터페이스 모음
  • 자바 진영의 ORM 기술 표준
  • 인터페이스이기 때문에 구현체 존재(Hibernate, OpenJPA 등)

 

JPA와 CRUD

저장 : jpa.persist(member)

조회 : Member member = jpa.find(memberId)

수정 : member.setName("토니")

삭제 : jpa.remove(member)

 

JPA의 성능 최적화 기능

1. 1차 캐시와 동일성(identity) 보장

같은 트랜잭션 안에서는 같은 엔티티를 반환 -> 약간의 조회 성능 향상

String memberID = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL에서 조회
Member m2 = jpa.find(Member.class, memberId); //캐시에서 조회
println(m1 == m2) //true

위의 예시처럼 SQL 조회가 한번만 이뤄진다. 같은 트랜잭션 안에서의 동일한 요청은 캐시를 사용하기 때문에 성능이 향상된다.

 

2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behine)

INSERT

트랜잭션을 커밋할 때까지 INSERT SQL을 모은다.

JDBC BATCH SQL 기능을 사용하여 한번에 SQL을 전송한다.

transaction.begin(); //트랜잭션 시작!

em.persist(memberA);
em.persist(memberB);
em.persist(memberC); //여기까지 INSERT SQL을 DB에 보내지 않는다.

transaction.commit(); //트랜잭션 커밋! -> 이때 DB에 모아놨던 SQL 보낸다.

UPDATE

UPDATE, DELETE로 인한 로우(ROW) 락 시간 최소화

트랜잭션 커밋 시 UPDATE, DELETE SQL실행하고, 바로 커밋

transaction.begin(); //트랜잭션 시작~!

changeMember(memberA);
deleteMember(memberB);
비즈니스_로직_수행(); //비즈니스 로직 수행 동안 DB로우 락익 걸리지 않는다.

transaction.commit(); //트랜잭션 커밋 -> DB에 SQL 보낸다.

 

3. 지연 로딩(Lazy Loading)

지연 로딩 : 객체가 실제 사용될 때 로딩

즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회

 

반응형