이 글은 김영한님의 JPA 강의 중 1,2장을 듣고 정리한 내용입니다 :)
강의 : 자바 ORM 표준 JPA 프로그래밍 - 기본편
교재 : 자바 ORM 표준 JPA 프로그래밍🤷♀️
객체랑 다르게 테이블은 상속이라는 기능이 없어서, 개발자가 여러 설정/쿼리를 생성했어야함
→ JPA에서는 여러 쿼리를 한번에 실행해서 해결, 마치 자바 컬렉션처럼!
객체는 참조를 사용해서 연관된 객체를 조회하는 데, 테이블은 외래키로 연관관계를 설정하고 조인으로 연관 테이블을 조회함
//원래의 객체 지향 방식
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 컬럼 사용
}
객체 그래프가 어디까지 탐색할 수 있는 지는 SQL을 사용해보아야 한다. (알겠지만 헷갈림)
→ JPA는 실제 객체를 사용하는 시점까지 DB조회를 미룬다(지연로딩). 따라서 연관된 객체를 신뢰하고 조회할 수 있음!
Member member = jpa.find(Member.class, memberId); //최초에 select 쿼리 발생
Order oreder = memeber.getOrder();
order.getOrderDate(); //order를 사용하는 시점에 select 쿼리 발생! -> 지연로딩
DB는 PK(기본 키)로 각 로우를 구분하는 반면, 객체는 동일성/동등성 비교를 한다.
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member1 == member2; //다르다.
// DB에서 같은 로우를 조회했지만,
// 객체 입장에서는 new로 생성된 각각 다른 인스턴스이기때문에 다른값으로 나옴
→ JPA는 DB의 같은 로우를 조회할 경우, 1차 캐시로 동일성 비교를 보장한다
: 자바의 ORM 기술 표준
: Java Persistence API, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
: 객체 - RDB 매핑해주는 기술
객체는 객체대로 / RDB는 RDB대로 설계후
그 사이의 차이(패러다임의 차이)는 ORM이 SQL을 자동 생성하여 해결해줌
: JPA 구현체의 한 종류로, (DataNucleus, EclipseLink등 다른 구현체도 존재)
: JPA가 DB와 자바 객체를 매핑하기 위한 인터페이스이고 Hibernate는 이를 구현한 라이브러리이다 (마치 인터페이스-클래스의 관계)
: JPA를 편하게 쓰기 위한 모듈
EntityManager가 아닌, Repository를 정의하여 사용하는 더 쉬운 방법
(Repository 내부적으로는 EntityManager을 사용)
DB마다 제공하는 SQL 문법이 다른데, 이처럼 SQL 표준이 아닌 기능을 의미함
⇒ JPA가 참고해서 번역해서 사용, JPA는 특정DB에 종속X
EMF : 어플리케이션에서 DB당 하나만 생성
EM : 매번 요청이 올때 마다 사용, 버림 (단, 쓰레드 간 공유X)
트랜잭션이란?
: DB의 상태가 변화하는 작업 단위로, 그 작업 단위는 개발자가 정함
: 사용자가 DBMS에게 요청하는 일련의 작업들
tx.begin() 시작하는
tx.commit() 반영하도록
: 엔티티 객체를 대상으로 쿼리 (반면 SQL은 테이블을 대상으로 쿼리)
JPQL은 DB SQL에 의존하지 않고, 쉽게 말하면 객체지향 SQL이라 보면 된다.
→ 후에 자세히 다룸!
Reference :
JPA 전반에 대해서
JPA, Hibernate, Spring Data JPA