-객체는 추상화, 상속, 다형성의 특징을 가지고, RDB는 데이터 중심으로 이루어져 있어 RDB에 객체를 저장하는데 불일치가 발생함.
1.상속
객체랑 다르게 테이블은 상속이라는 기능이 없어서 개발자가 여러 설정,쿼리를 생성해야함
-> JPA에서는 여러 쿼리를 한번에 실행해서 해결하였다!
2.연관관계
객체는 참조를 사용해서 연관된 객체를 조회하는데 테이블은 외래키(FK)로 연관관계를 설정하고 JOIN으로 연관 테이블을 조회한다.
//원래의 객체 지향 방식
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 컬럼 사용
}
3.객체 그래프 탐색
객체 그래프가 어디까지 탐색할 수 있는지는 SQL을 사용해보아야 한다.
-> JPA는 실제 객체를 사용하는 시점까지 DB로딩을 미룬다(LAZY 지연로딩). 따라서 연관된 객체를 신뢰하고 조회할 수 있음!
Member member = jpa.find(Member.class, memberId); //최초에 select 쿼리 발생
Order oreder = memeber.getOrder();
order.getOrderDate(); //order를 사용하는 시점에 select 쿼리 발생! -> 지연로딩
4.비교
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를 정의하여 사용하는 더 쉬운 방법
(레포지토리 내부적으로는 엔티티 매니저를 사용함)
:DB마다 제공하는 SQL문법이 다른데, 이처럼 SQL표준이 아닌 기능을 의미한다
-> JPA가 참고해서 번역해서 사용, JPA는 특정 DB에 종속되어있지 않다.
EMF : 어플리케이션에서 DB당 하나만 생성
EM : 매번 요청이 왔을때 마다 사용 후 버림(쓰레드간 공유는 하지않는다)
트랜잭션이란?
:DB의 상태가 변화하는 작업 단위로, 그 작업단위는 개발자가 정한다.
:사용자가 DBMS에게 요청하는 일련의 작업들
간단하게 말해서 아래의 질의어(SQL)를 이용하여 DB에 접근하는 것.
-SELECT
-INSERT
-DELETE
-UPDATE
: 엔티티 객체를 대상으로 쿼리 (SQL은 테이블 대상으로 쿼리)
JPQL은 DB SQL에 의존하지 않고, 쉽게말해 객체지향 SQL? 이라고 보면 편하다.
Reference :
JPA전반에 대해서
JPA, Hibernate, 그리고 Spring Data JPA의 차이점
참고 블로그