[JPA] 왜 JPA 사용하는지에 대한 정리 2
JPA 소개
- Java Persistence API
- 자바 진영의 ORM 기술 표준
- JDBC와 애플리케이션 사이에서 동작한다.
ORM
- Object-relational mapping (객체 관계 매핑)
- 객체는 객체대로 설계하고 관계형 데이터베이스는 관계형 데이터베이스대로 설계를 한다.
- ORM 프레임워크가 중간에서 매핑을 해준다.
- 대중적인 언어에는 대부분 ORM 기술이 존재한다.
왜 사용하는가?
- SQL 중심적인 개발에서 객체중심으로의 개발
- 생산성과 유지보수
- 패러다임의 불일치 해결
- 성능
- 데이터 접근 추상화와 벤더 독립성
- 표준
생산성
저장 : jpa.persist(member); 조회 : Member member = jpa.find(memberId); 수정 : member.setName(“변경할 이름”); 삭제 : jpa.remove(member)
- jpa를 쓴다는건 자바 컬렉션에 데이터를 삽입하고 추출하는것과 같다는 개념
유지보수
- 기존의 필드 변경시 모든 SQL을 수정해야한다. (SI에서 일할때만 해도 MyBatis 사용시 그래왔다.)
- JPA를 사용하면 객체의 필드만 추가해주면 된다.
JPA와 상속 - 조회
//개발자가 할일
Album album = jpa.find(Album.class, albumId);
//나머지 JPA가 처리해줌
SQL
select I.* , A.*
from ITEM I
JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID
JPA와 연관관계, 객체 그래프 탐색
> 연간관계 저장
member.setTeam(team);
jpa.persist(member);
> 객체 그래프 탐색
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
- JPA는 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
JPA의 성능 최적화 기능
- 1차 캐시와 동일성(identity) 보장
- 같은 트랜잭션안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
- DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
- 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
- 트랜잭션을 커밋할 때까지 Insert SQL을 모은다.
- JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
- 메모리에 쌓았다가 한번에 네트워크를 통해 jdbc batch sql을 사용해서 커밋하는것
- 지연로딩 (Lazy Loading)
- 지연 로딩 : 객체가 실제 사용될 때 로딩
- 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
😄 참고 : 인프런 김영한님의 JPA 기본 강의 및 교재
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
개인메모