JPA 학습 전 SpringDataJPA 먼저 학습을 한 사람으로써 사용도중 이해가 되자 않는 부분과 어려운점이 많았다. 그래서 기초부터 다시 하자라는 의미로 최근까지 내 글목록 에서 볼수있듯이 JPA를 학습하고 SpringDataJPA 를 다시 학습해 요점만 정리해 놓았다.
일단은 이번 학습에서는 기존의 운영체제와 다르게 맥을 사용했다. 맥을 사용했을때 생기는 오류도 몇개 적어 놨으니 살펴보자!
SringDataJPA cheat sheet 을 하기전에 몇가지 기본세팅을 살펴보자!
처음만들고 권한을줘야한다. 그리고 바로 접속 불가 …
처음에는 데이터를 원격으로 접근하는게 아니라 파일로 접근한다 =로컬에 디비파일 저장
그리고 다시 원격으로 접속
Jpa 에서는 모든 변경이 @Transaction 에서 진행되야해서 @Test 안에서는 꼭 써줘야함 상단에.
-> @Transaciton 은 마지막에 다 롤백 시켜서 반영은 안된다, 플러쉬도 x
롤백된 쿼리 확인하고 싶으면 상단에 @Rollback(true) 다반영된다
잠깐! DI , 인젝션 , bean , IOC컨테이너, 이런 단어들을 모르겠어!
스프링 기본 학습 바로가기
컬렉션 반환타입은 널익셉션 x , 빈리스트 반환 (= getResultList)
단건 조회 는 널 발생
optional 은 데이터가 있을수도있고 없을수도 있다라는 의미
디폴트값은 20개씩나온다
레파지토리.기본매서드 (pageable) =파라미터로 pageable을 받을수 있다.
url로 사이즈 ,소팅 등등 설정 가능
반환 타입 page, slice, List(페이징 관심없고 데이터 몇개 끊어 올때)
레파지토리에 Pageable 써주기만 하면 바로 사용가능 , 반환값이 page , page로 다양한 메서드 사용 가능
Page 는 토탈카운트 자동으로 실행
slice 는 토탈카운트 x , 그냥 다음페이지 있어 없어 이렇게 간단하게만 , slice 는 토탈 카운트 날리지 않아서 사용할수 있는 메서드도 제약이 있다. 대신 애초에 가져올떄 size + 1 을 해서 가져온다
주의해야할점
외부 반환시 엔티티가 아닌 DTO로 반환 해야한다.
나중에 엔티티 변경시 API 사용법도 다 바뀌기 떄문이다.
@Modifying
벌크성 수정은 바로 Db에 넣기에 save(1차캐시에 있고 DB에 반영은 아직) 하고 차이가 난다
->그래서 엔티티매니저 만들고 / em.clear 해줘야함
-> 아니면 clearAutomatically = true 옵션 추가!
테이블 관계는 지연로딩이 기본 -> 연관된 테이블 건드리는 순간 조인문 발생 (N+1) -> fetch join
Fetch join + springDataJPA(쿼리메서드형식) = EntityGraph
Fetch join
- 그냥 EntityGraph
- EntityGraph + JPQL
- EntityGraph + 쿼리메서드
JPA에서는 엔티티 변경시(setter + flush) 더티체킹으로 인해 update 쿼리가 나간다.
기존객체 vs 변경객체 비교해서 더티체킹 => 비교 하기위해서는 엔티티 생성시 만드는 스냅샷을 가지고 비교를 한다.
-> 성능저하 유발
Hint = 100프로 조회용으로 만들꺼야, 스냅샷 생성 x
But 성능 변화 미약하다