kangchanguk / study

0 stars 0 forks source link

JPA #12

Open kangchanguk opened 1 month ago

kangchanguk commented 1 month ago

데이터를 관계형 db에 저장 -> sql문을 많이 써야한다(CRUD 개 많이) -> 자바객체를 sql로, sql을 자바객체로

객체 crud - 필드 추가

sql 문 자체를 전부 고쳐야 함

관계형db를 쓰기 때문에 sql에 의존적인 개발을 피할 수 없다.

관계형 db를 써야하긴 함(현실적인 대안)

객체 -> sql 변환 -> sql -> rdb

(이걸 개발자가 sql mapper의 역할을 한다고 ????????????)

객체와 sql 차이점

1) 상속

table 슈퍼타입, 서브타입 관계로 상속의 개념을 구현

1) insert

슈퍼타입 테이블, 서브타입 테이블에 데이터를 다 넣어주어야한다.

2) 조회

조인 sql 작성(case 마다 조인쿼리를 만들어야한다고???) -> 각각 객체 생성

java collection에 데이터를 저장한다면

list.add(album) list.get(index)

한줄 컷!!!

2) 연관 관계

1) 객체는 참조를 활용

2) 테이블을 외래키로 join을 해서 연관관계를 맺게 됩니다.

객체를 테이블에 맞추어 모델링

3) 탐색범위

sql 문이 탐색범위를 제한해버림

4) entity 신뢰 문제

5) 모든 객체를 미리 로딩할 수 없다!!!

계층형 아키텍처 => 진정한 의미의 계층 분할이 어렵다!!

kangchanguk commented 1 month ago

jpa

자바 표준 orm

orm

object-relational-mapping

객체는 객체대로, rdms 는 rdms 대로 설계, orm이 이를 mapping

as is) 개발자가 직접 jdbc api를 사용

to be) jpa가 jdbc를 사용

jpa 소개

EJB - entity bean(자바 표준)

하이버네이트(오픈소스)

jpa (자바 표준)

jpa

표준 명세 (인터페이스의 모음)

why jpa

생산성

저장: jpa.persist 조회: jpa.find 수정: member.setName 삭제: jpa.remove

유지보수

필드 변경 시 모든 sql 수정

=> jpa는 필드만 추가하면 됨

패러다임의 불일치 해결

동일한 트랜잭션에서 조회한 엔티티는 같음을 보장!!

jpa 성능 최적화 기능

(같은 트랜잭션 안에서는 같은 엔티티를 반환 -> 약간의 조회 기능 성능 보장)

트랜잭션을 지원하는 쓰기 지연

트랜잭션을 커밋할 때까지 insert sql을 모음 jdbc batch sql 기능을 한번에 sql 전송

네트워크 통신 비용을 줄임

트랜잭션을 커밋할 때까지만 데이터를 보내면 되기 때문에 버퍼에 데이터를 모아놓음

지연 로딩과 즉시 로딩

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

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

kangchanguk commented 1 month ago

엔티티 매니저 팩토리와 엔티티 매니저

앤티티 매니저 팩토리는 애플리케이션 생성 단계에서 생성

앤티티 매니저 팩토리가 앤티티 매니저를 통해서 db connect

영속성 컨텍스트

EntityManager.persist(Entity)

앤티티 생명주기

영속성 장점

1차 캐시

db에서 바로 조회하는 것이 아니라 1차 캐시에서 조회함

단 1차 캐시에 없는 데이터 => db에서 조회를 함 => 1차 캐시에 저장 => 해당 데이터를 반환

영속 엔티티의 동일성 보장

엔티티 등록

트랜잭션을 지원하는 쓰기 지연

(커밋하는 순간 db에 insert sql을 날림)

쓰기 지연 sql 저장소에 쿼리문들을 저장해놓음

변경 감지(엔티티 수정)

commit -> entity와 스냅샷을 비교 (1차 캐시에는 스냅샷(값을 읽어온 최초의 시점의 모습) 이 존재)

엔티티 삭제

플러시

영속성 컨텍스트의 변경 내용을 db에 반영

플러시 발생

영속성 컨텍스트를 플러시하는 방법

쿼리를 미리 보고 싶거나, 미리 db에 반영을 하고 싶을 때는 flush를 통해 강제로 호출!!

jpql 쿼리 실행 시 플러시가 자동으로 호출되는 이유

em.persist(A);
em.persist(B);
em.persist(C);

// A,B,C를 persist 하고 jpql로 쿼리를 날렸는데 왜 데이터가 없지??? 같은 문제들을 해결하기 위해 flush 실행
query = em.createQuery("select m from Member m", Member.class)

플러쉬란?

준영속 상태

kangchanguk commented 1 month ago

앤티티 매핑

엔티티 매칭 소개

객체와 테이블 매핑

@Entity가 붙은 클래스가 jpa가 관리하는 엔티티

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수

속성: Name

db 스키마 자동생성

DDL을 애플리케이션 실행 시점에 자동 생성(개발 단계에서만 쓰자)

테이블 중심 -> 객체 중심 (객체를 만들어 놓고 객체 매핑을 해놓으면 application이 뜨는 시점에서 테이블 자동 생성)

데이터베이스 방언을 사용해서 db에 맞는 적절한 ddl을 생성

이렇게 생성된 ddl은 개발 장비에서만 사용

생성된 ddl은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용