본문 바로가기

Spring Data

JPA 소개 #1

JPA?

Java Persistence API

자바 진영의 ORM 기술 표준

ORM ?

Object - Relational - Mapping(객체 관계 매핑)

객체는 객체대로 설계

관계형 데이터베이스는 관계형 데이터베이스대로 설계

ORM 프레임워크가 중간에서 매핑

대중적인 언어에는 대부분 ORM 기술이 존재

JPA는 애플리케이션과 JDBC사이에서 동작

JPA 저장, 조회

JPA를 왜 사용하는가?

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성
  • 유지보수
  • 패러다임의 불일치 해결
  • 성능
  • 데이터 접근 추상화와 베더 독립성
  • 표준

생산성 - JPA와 CRUD

저장 : jpa.persist(member);

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

수정 : member.setName("변경할 이름");

삭제 : jpa.remove(member);

 

JPA 에서 기존적인 CRUD 기능을 자동 생성해준다. 

유지보수 - 기존 필드 변경시 모든 SQL 수정

JPA의 경우 Member 클래스에 필드를 추가함으로 CRUD 쿼리 수정이 한번에 가능해짐.

JPA와 패더다임의 불일치 해결

  1. JPA와 상속
  2. JPA와 연관관계
  3. JPA와 객체 그래프 탐색
  4. JPA와 비교하기

JPA의 성능 최적화 기능

  1. 1차 캐시와 동일성 보장
  2. 트랜잭션을 지원하는 쓰기 ㅈ연
  3. 지연 로딩

 

1차 캐시와 동일성 보장

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

2. DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장

 

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

 

SQL 1번만 실행..

 

트랜잭션을 지원하는 쓰기 지연 - INSERT

1. 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
2. JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송

 

transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.

//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // [트랜잭션] 커밋

 

트랜잭션을 지원하는 쓰기 지연 - UPDATE

1. UPDATE, DELETE로 인한 로우(ROW)락 시간 최소화
2. 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋

 

transaction.begin(); // [트랜잭션] 시작
changeMember(memberA);
deleteMember(memberB);
비즈니스_로직_수행(); //비즈니스 로직 수행 동안 DB 로우 락이 걸리지 않는다.

//커밋하는 순간 데이터베이스에 UPDATE, DELETE SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋

 

지연 로딩과 즉시 로딩

• 지연 로딩: 객체가 실제 사용될 때 로딩
• 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회

 

 

'Spring Data' 카테고리의 다른 글

다양한 연관관계 매핑 #6  (0) 2021.07.19
연관관계 매핑 기초 #5  (0) 2021.07.18
엔티티 매핑 #4  (0) 2021.07.18
영속성 관리 - 내부 동작 방식 #3  (0) 2021.07.17
JPA 시작하기 #2  (0) 2021.07.17