티스토리 뷰

Backend/JPA

[JPA] 01. JPA 란?

This2sho 2022. 1. 17. 18:38

해당 글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의를 수강하고 정리한 게시글입니다.

JPA란?

  • Java Persistence API
  • 자바 진영의 ORM 기술 표준

[ORM]이란?
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재

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

JPA 동작

[저장]

[조회]

 

JPA 사용목적

관계형 데이터베이스에서 무한 반복, 지루한 코드(SQL에 의존적인 개발을 피하기 어려움), 객체와 관계형 데이터베이스의 차이를 극복하고자 나온 기술로 JPA를 사용하면 다음과 같은 이점을 갖는다.

- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성 및 유지보수성
- 패러다임의 불일치 해결
- 성능의 이점
- 데이터 접근 추상화와 벤더 독립성
- 자바에서 제공하는 자바 ORM 기술에 대한 표준 API

JPA - 생산성(CRUD)

• 저장: jpa.persist(member)
• 조회: Member member = jpa.find(memberId) 
• 수정: member.setName(“변경할 이름”)
• 삭제: jpa.remove(member)

JPA - 유지보수

  • [기존(필드 변경시 모든 SQL 수정]

  • [JPA(필드만 추가하면됨, SQL은 JPA가 처리]

JPA - 패러다임의 불일치 해결 (객체와 RDB 차이 극복)

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

1. JPA - 상속

2. JPA - 연관관계

연관관계 저장

member.setTeam(team);
jpa.persist(member);

3. JPA - 객체 그래프 탐색

  Member member = jpa.find(Member.class, memberId);
  Team team = member.getTeam();

4. JPA - 비교

  String memberId = "100";
  Member member1 = jpa.find(Member.class, memberId);
  Member member2 = jpa.find(Member.class, memberId);

  member1 == member2; // 같다.
**동일한 트랜잭션에서 조회한 엔티티는 같음을 보장**

JPA의 성능 최적화 기능

  1. 1차 캐시와 동일성(identity) 보장
  2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
  3. 지연 로딩(Lazy Loading)

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

  1. 같은 트랜잭션 안에서는 같은 엔티티를 반환 (약간의 조회 성능 향상)
  2. DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장SQL 1번만 실행
  3. String memberId = "100"; Member member1 = jpa.find(Member.class, memberId); // SQL Member member2 = jpa.find(Member.class, memberId); // 캐시 print(member1 == member2); // true

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

[INSERT]

  1. 트랜잭션을 커밋할 때 까지 INSERT SQL을 모음
  2. JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
    transaction.begin(); // [트랜잭션] 시작

    em.persist(memberA);
    em.persist(memberB);
    em.persist(memberC);
    // 여기까지 INSERT SQL을 데이터베이스에 보내지 않음.

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

[UPDATE]

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

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

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

3. 지연 로딩(Lazy Loading)

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

'Backend > JPA' 카테고리의 다른 글

[JPA] 06. 고급 매핑 (상속관계 매핑)  (0) 2022.01.22
[JPA] 05. 다양한 연관관계 매핑  (0) 2022.01.21
[JPA] 04. 엔티티 매핑  (0) 2022.01.20
[JPA] 03. 영속성 관리  (0) 2022.01.19
[JPA] 02. 설정 및 구동 방식  (0) 2022.01.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함