JPA가 뭘까?
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로 한번에 연관된 객체까지 미리 조회