JPA는 무엇일까?

홍산의·2022년 9월 22일
0

기초지식

목록 보기
1/2

왜 JPA를 쓸까?

SQL의 문제점

  1. 같은 코드의 무한반복을 해결하기위해 ->SQL코드, 기본 CRUD의 반복
  2. 패러다임의 불일치 : 객체와 RDB의 차이 -> 객체를 DB에 넣을 때 문제 발생

여기서 객체와 RDB 패러다임의 불일치란?

-객체는 추상화, 상속, 다형성의 특징을 가지고, 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차 캐시로 동일성 비교를 보장한다.

=> 이러한 차이들을 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를 정의하여 사용하는 더 쉬운 방법
(레포지토리 내부적으로는 엔티티 매니저를 사용함)


추가지식

데이터베이스 방언이란?

:DB마다 제공하는 SQL문법이 다른데, 이처럼 SQL표준이 아닌 기능을 의미한다
-> JPA가 참고해서 번역해서 사용, JPA는 특정 DB에 종속되어있지 않다.

JPA작동 방식

EMF에서 EM 생성

EMF : 어플리케이션에서 DB당 하나만 생성
EM : 매번 요청이 왔을때 마다 사용 후 버림(쓰레드간 공유는 하지않는다)

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

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

간단하게 말해서 아래의 질의어(SQL)를 이용하여 DB에 접근하는 것.
-SELECT
-INSERT
-DELETE
-UPDATE

JPQL은 또 뭐야?

: 엔티티 객체를 대상으로 쿼리 (SQL은 테이블 대상으로 쿼리)
JPQL은 DB SQL에 의존하지 않고, 쉽게말해 객체지향 SQL? 이라고 보면 편하다.

Reference :
JPA전반에 대해서
JPA, Hibernate, 그리고 Spring Data JPA의 차이점
참고 블로그

profile
백엔드 개발자 지망생!

0개의 댓글