백엔드/JPA

[JPA] [1] JPA 소개 - JPA는 무엇인가?

RE-Heat 2023. 8. 3. 23:11

https://www.inflearn.com/course/ORM-JPA-Basic

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자

www.inflearn.com

인프런 김영한 님의 강의를 듣고 작성한 글입니다.

 

 

JPA?

    - Java Persistence API의 줄임말

    - 자바 진영의 ORM 기술 표준

 

ORM?

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

 

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

JPA는 JDBC 중간에서 동작하며 애플리케이션 코드를 바탕으로 JDBC 쿼리를 만들어 DB에 접근한다.

 

JPA 동작방식

저장

JPA가 Member객체를 받아서 알아서 분석 → INSERT SQL 생성 → JDBC API 사용

 

조회

회원 id 보냄 → 회원객체 분석 → SELECT SQL 생성 → JDBC API사용, ResultSet매핑, 패러다임 불일치 해결

 

JPA는 표준 명세

 

JPA는 실제 구현체가 아닌 인터페이스의 모음이다.

Hibernate, ElcipsseLink, DataNucleus와 같은 구현체들이 있지만, 우리는 Hibernate를 쓴다.

 

JPA를 왜 사용해야 하는가?

 

■ 생산성

JPA는 기본적인 CRUD 코드가 다 설정돼 있어 자바 컬렉션에서 코드를 사용하듯 사용할 수 있다.

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

 

■ 유지보수

과거엔 바꾸려면 왼쪽처럼 하나하나 일일이 바꿔줘야 했다. 하지만 JPA는 필드만 추가하면 알아서 처리해 준다.

 

■ 패러다임 불일치 해결

① JPA와 상속

저장

개발자가 할 일

- jpa.persiste(album)

 

JPA 처리하는 부분

- INSERT INTO ITEM ...
- INSERT INTO ALBUM ...

 

조회

개발자가 할 일

Album album = jpa.find(Album.class, albumId);

 

JPA가 처리하는 부분

SELECT I.*, A.* 
    FROM ITEM I
    JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID

=> JPA가 알아서 조인해서 처리해 준다.

 

② JPA와 연관관계, 객체 그래프 탐색

연관관계 저장도 객체 컬렉션 동작처럼 간단한 코드로 진행 가능

 

연관관계 저장

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

 

객체 그래프 탐색

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

 

③ 신뢰할 수 있는 엔티티, 계층

지연 로딩이라는 기술로 문제없이 값을 꺼낼 수 있다.

class MemberService {
    ...
public void process() {
        Member member = memberDAO.find(memberId); 
        member.getTeam(); //자유로운 객체 그래프 탐색 
        member.getOrder().getDelivery();
    } 
}

 

④ JPA와 비교하기

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

member1 == member2; //같다.

기존 SQL 주도 개발에서 객체는 new를 통한 객체 생성 때문에 다르다고 나온다. 반면 JPA는 동일한 트랜잭션에서 조회한 엔티티는 같다고 보장한다.

 

 

JPA의 성능 최적화 기능

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

같은 트랜잭션 안에선 같은 엔티티 반환 => 약간의 조회 성능 향상

캐시 : 이미 조회한 건 DB까지 가지 않고 중간에 있는 걸 반환해 줌 => 성능향상

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

SQL을 1번만 실행

 

② 트랜잭션을 지원하는 쓰기 지연(tansactional write-behind)

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

1. 트랜잭션을 커밋할 때까지 INSERT SQL을 모음 (배치 방식)

2. JDBC BATCH SQL 기능을 사용해 한번에 SPL 전송

 

트랜잭션을 커밋하기 전까지만 보내면 되므로 배치형식으로 모아서 보냄

 

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

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

=> 자세한 내역은 차후 강의에서

 

③ 지연로딩

지연 로딩 : 객체가 실제 사용될 때 로딩

즉시 로딩 : JOIN SQL로 한 번에 연관된 객체까지 미리 조회

지연로딩 : Member가 필요할 땐 Member만 조회. 이후 연관관계에 있는 Team이 실제로 사용되면 팀에서 데이터를 가져와서 값을 채워 줌.

즉시 로딩 : Member와 Team이 웬만하면 같이 조회될 땐 같이 조회해 달라고 세팅할 수 있음. 그러면 Member를 부르면 자동으로 Team까지 한 번에 조회해 줌.

 

SQL로 지연/즉시 정책을 바꾸려면 쿼리를 전부 바꿔줘야 하지만, JPA를 이용하면 세팅 한 번으로 정책을 변경할 수 있다.