2021-08-25-TIL

JPA 인프런 강의

h2

  • http://www.h2database.com/html/main.html

실습할때의 오류

  • https://www.inflearn.com/questions/66109
  • https://www.inflearn.com/questions/17751

JPQL vs QueryDSL

  • https://www.inflearn.com/questions/38771

961분 / 7 = 137분 -> 약 2시간 씩

JPA가 어려운 이유

  1. 객체를 올바르게 설계하고 테이블을 맵핑하는게 어렵다.
  2. JPA의 내부동작방식을 이해하지 못해서 장애상황에 대처하지 못한다.
    1. JPA가 어떤 SQL을 만들어내는지
    2. JPA가 어떤 시정에, 언제 실행되는지

관계형 DB

대부분 관계형 db를 사용, 따라서 객체를 관계형 db에 저장해야한다.

문제는 sql인데 DB는 sql을 알아듣기 때문에 이로인한 지루한 문제가 발생한다.

  • 무한반복, 지루한 코드 -> CRUD, 물론 마이바티스나 jdbc template을 쓰면 조금 낫지만 쿼리를 작성해야한다는 점은 마찬가지이다. 현타가 올것이다..
  • 객체 crud를 완료하고 필드하나가 추가되었다면 쿼리에도 일일이 추가해야한다. 그리고 에러가 나서 보면 쿼리 중 일부에 빠뜨릴 가능성이 높다.

패러다임의 불일치 문제가 있다. 관계형 db와 객체 지향의 패러다임이 다르다. 객체를 영구보관하는 다양한 저장소가 있지만, 결국 RDB를 써야한다. 결국 객체 -> RDB를 맵핑해야하는 것인데, 개발자가 sql 매퍼의 역할만 계속 하게된다.

객체와 관계형 db의 차이

객체의 상속관계와 가장 유사한 테이블 모델이 슈퍼타입 서브타입 관계이다.

앨범을 조회하려면 item-album 조인… 나머지도 마찬가지다

자바 커렉션에서 조회하려면?

부모타입으로 조회후 다형성을 활용하여 하위 타입으로 읽으면 된다.

연관관계

객체는 참조를 사용하여 참조하므로 한방향이다.

테이블은 조인하여 양방향으로 참조가 가능하다.

탐색 범위

자유롭게 탐색할 수 있는가? 아니다. 처음 select 해서 가져온 만큼만 가지고 있다.

엔티티 신뢰 문제

모든 객체를 미리 다 로딩할 수는 없다

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


3강 JPA 소개

JPA 동작

중요한 점은 패러다임 불일치를 해결해준다는 점

JPA를 왜 사용해야 하는가

생산성 - JPA와 CRUD

유지보수

연락처 컬럼 추가하는 경우 -> db에추가 후 필드에 추가하면 끝

신뢰할 수 있는 엔티티, 계층

JPA를 통해 그래프 탐색을 자유롭게 가능 . . . . 가능 -> 지연로딩을 통해서 없더라도 다시 알아서 가져온다

JPA의 성능 최적화 기능

성능 최적화 기법 두 가지 -> 모아서 쏘는 버퍼링과 저장해두는 캐싱

  1. 1차 캐시와 동일성 보장

사실 별 도움안됨

  1. DB isolation level이 read commit이어도 애플리케이션에서 repeatable read 보장

  2. 트랜잭션을 지원하는 쓰기 지연 - insert

  • 트랜잭션을 커밋할 때까지 insert sql을 모음
  • jdbv batch sql기능을 사용해서 한번에 sql 전송

지연 로딩과 즉시 로딩

지연로딩은 필요할때 값을 가져옴

무조건 같이 사용하는 데이터면 그냥 즉시로딩으로 한번에 가져오는게 낫다.

JPA는 옵션하나로 껐다켤수있다. 김영한님은 지연로딩으로 모두 작성한 후에 최적화가 필요할때만 해당 부분을 즉시로딩으로 변경하는 식으로 개발한다.

ORM은 객체와 RDB 두 기둥위에 있는 기술이다. RDB가 훨씬 중요한 기술이며 이는 잘 바뀌지 않으므로 필수적으로 학습해야한다.


엔티티 매니저 팩토리는 하나만 생성해야하며 엔티티 매니저는 절대 공유해서는 안된다!

JPQL은 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리이다!!!!!