해당 시리즈는 김영한님의 JPA 로드맵을 따라 학습하면서 내용을 정리하는 글입니다
생산성 - JPA 와 CRUD
- 저장: jpa.persist(member)
- 조회: Member member = jpa.find(memberId)
- 수정: member.setName("변경할 이름")
- 삭제: jpa.remove(member)
유지보수
- 기존: 필드 변경 시 모든 SQL 수정해야 했음
- JPA: 필드만 추가하면 됨(JPA가 SQL문을 생성해주기 때문)
JPA와 패러다임과의 불일치 해결
-
JPA와 상속
- 상속관계일 경우(DB에서는 슈퍼타입 테이블과 서브타입 테이블 관계일 경우)
- 저장할 때, 관계 맺은 테이블들에 모두 INSERT 를 해줘야 하지만 JPA를 사용하면 jpa.persist(객체) 를 하면 나머지 SQL은 JPA가 알아서 해준다
- 조회할 때, 관계를 맺은 테이블들을 JOIN해서 SQL문을 작성해줘야 하지만, jpa.find(객체.class, id)를 하면 나머지 SQL을 JPA가 알아서 처리해준다
-
JPA와 연관관계
- 연관관계를 저장할 때, member.setTeam(team), jpa.persist(member) 와 같이 저장할 수 있다
-
JPA와 객체 그래프 탐색
- Member member = jpa.find(Member.class, memberId);
- Team team = member.getTeam(); 처럼 객체를 탐색할 수 있다
-
JPA와 비교하기
- 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장받는다
String memberId = "100"
Membmer member1 = jpa.find(Member.class, memberId);
Membmer member2 = jpa.find(Member.class, memberId);
member1 == member2
-
JPA의 성능 최적화 기능
- 1차 캐시와 동일성 보장
- 같은 트랜잭션 안에서는 같은 엔티티를 반환한다 - 약간의 조회 성능 향상(위 조회에서 SQL은 1번만 실행된다)
- DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
- 트랜잭션을 지원하는 쓰기 지연 - INSERT
- 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
- JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
transaction.begin();
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
transaction.commit();
- 지연 로딩과 즉시 로딩
- 지연 로딩: 객체가 실제 사용될 때 로딩
- 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회
