[JPA/김영한] JPA를 쓰는 이유와 JPA 소개

수영·2021년 9월 15일
4

JPA 공부!

목록 보기
1/9

이 글은 김영한님의 JPA 강의 중 1,2장을 듣고 정리한 내용입니다 :)
강의 : 자바 ORM 표준 JPA 프로그래밍 - 기본편
교재 : 자바 ORM 표준 JPA 프로그래밍🤷‍♀️

💡SQL의 문제점?

  1. 같은 코드의 무한 반복 → sql 코드, 기본 CRUD의 반복
  2. 패러다임의 불일치 : 객체와 관계형 DB의 차이 → 객체를 DB에 넣을 때 문제 발생

잠깐, 객체 -RDB 패러다임의 불일치란?

  • 객체는 추상화, 상속, 다형성(클래스, 메소드)의 특징을 가지고, RDB는 데이터 중심으로 이뤄져,
    RDB에 객체를 저장하는 데 불일치가 발생함
  1. 상속

객체랑 다르게 테이블은 상속이라는 기능이 없어서, 개발자가 여러 설정/쿼리를 생성했어야함
→ JPA에서는 여러 쿼리를 한번에 실행해서 해결, 마치 자바 컬렉션처럼!

  1. 연관관계

객체는 참조를 사용해서 연관된 객체를 조회하는 데, 테이블은 외래키로 연관관계를 설정하고 조인으로 연관 테이블을 조회함

//원래의 객체 지향 방식
class Member {
String id; //MEMBER_ID 컬럼 사용
Team team; //참조로 연관관계를 맺는다. => Long teamId; 테이블처럼 바꿀 경우
String username;//USERNAME 컬럼 사용
Team getTeam() {
return team;
}
}
class Team {
Long id; //TEAM_ID PK 사용
String name; //NAME 컬럼 사용
}
  1. 객체 그래프 탐색

객체 그래프가 어디까지 탐색할 수 있는 지는 SQL을 사용해보아야 한다. (알겠지만 헷갈림)
→ JPA는 실제 객체를 사용하는 시점까지 DB조회를 미룬다(지연로딩). 따라서 연관된 객체를 신뢰하고 조회할 수 있음!

Member member = jpa.find(Member.class, memberId); //최초에 select 쿼리 발생

Order oreder = memeber.getOrder();
order.getOrderDate(); //order를 사용하는 시점에 select 쿼리 발생! -> 지연로딩
  1. 비교

DB는 PK(기본 키)로 각 로우를 구분하는 반면, 객체는 동일성/동등성 비교를 한다.

String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);

member1 == member2; //다르다.
// DB에서 같은 로우를 조회했지만, 
// 객체 입장에서는 new로 생성된 각각 다른 인스턴스이기때문에 다른값으로 나옴

→ JPA는 DB의 같은 로우를 조회할 경우, 1차 캐시로 동일성 비교를 보장한다

⇒ 이런 차이들을 JPA 사용으로 해결!


💡 JPA란

: 자바의 ORM 기술 표준
: Java Persistence API, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스

여기서 ORM이란?

: 객체 - RDB 매핑해주는 기술

객체는 객체대로 / RDB는 RDB대로 설계후
그 사이의 차이(패러다임의 차이)는 ORM이 SQL을 자동 생성하여 해결해줌

그럼 Hibernate는 뭐지?

: JPA 구현체의 한 종류로, (DataNucleus, EclipseLink등 다른 구현체도 존재)
: JPA가 DB와 자바 객체를 매핑하기 위한 인터페이스이고 Hibernate는 이를 구현한 라이브러리이다 (마치 인터페이스-클래스의 관계)

추가로, 그럼 Spring Data JPA는??

: JPA를 편하게 쓰기 위한 모듈

EntityManager가 아닌, Repository를 정의하여 사용하는 더 쉬운 방법
(Repository 내부적으로는 EntityManager을 사용)


데이터베이스 방언이란

DB마다 제공하는 SQL 문법이 다른데, 이처럼 SQL 표준이 아닌 기능을 의미함

⇒ JPA가 참고해서 번역해서 사용, JPA는 특정DB에 종속X


⚡JPA 작동 방식

EMF에서 EM을 생성함

EMF : 어플리케이션에서 DB당 하나만 생성
EM : 매번 요청이 올때 마다 사용, 버림 (단, 쓰레드 간 공유X)

모든 작업은 트랜잭션 안에서 실행됨

트랜잭션이란?
: DB의 상태가 변화하는 작업 단위로, 그 작업 단위는 개발자가 정함
: 사용자가 DBMS에게 요청하는 일련의 작업들

tx.begin() 시작하는

tx.commit() 반영하도록


🔎 JPQL이란

: 엔티티 객체를 대상으로 쿼리 (반면 SQL은 테이블을 대상으로 쿼리)

JPQL은 DB SQL에 의존하지 않고, 쉽게 말하면 객체지향 SQL이라 보면 된다.
→ 후에 자세히 다룸!


Reference :
JPA 전반에 대해서
JPA, Hibernate, Spring Data JPA

profile
🎵🎵🎵🎶🎵

0개의 댓글