SpringDataJPA (cheat sheet)

Shaun·2021년 11월 19일
1

JPA

목록 보기
29/31
post-thumbnail

공부순서

JPA 학습 전 SpringDataJPA 먼저 학습을 한 사람으로써 사용도중 이해가 되자 않는 부분과 어려운점이 많았다. 그래서 기초부터 다시 하자라는 의미로 최근까지 내 글목록 에서 볼수있듯이 JPA를 학습하고 SpringDataJPA 를 다시 학습해 요점만 정리해 놓았다.

일단은 이번 학습에서는 기존의 운영체제와 다르게 맥을 사용했다. 맥을 사용했을때 생기는 오류도 몇개 적어 놨으니 살펴보자!

SringDataJPA cheat sheet 을 하기전에 몇가지 기본세팅을 살펴보자!

윈도우와 다른 맥 오류

  • H2 데이터베이스 사용시 나타나는 오류다. 간단히 명령어만 입력해주면 해결되는 오류다.

맥오류 링크

H2

  • 처음만들고 권한을줘야한다. 그리고 바로 접속 불가 …

  • 처음에는 데이터를 원격으로 접근하는게 아니라 파일로 접근한다 =로컬에 디비파일 저장

  • 그리고 다시 원격으로 접속

H2 yml

  • 쿼리문을 콘솔에 찍는것이 아니라 아예 로그로 남긴다

SpringDataJPA cheat sheet

  • Jpa 가 프록싱하고 객체 만들떄 private 로 생성자 하면 만들수가 없다
    =>protected 해줘야함

  • Jpa 에서는 모든 변경이 @Transaction 에서 진행되야해서 @Test 안에서는 꼭 써줘야함 상단에.

    -> @Transaciton 은 마지막에 다 롤백 시켜서 반영은 안된다, 플러쉬도 x

  • 롤백된 쿼리 확인하고 싶으면 상단에 @Rollback(true) 다반영된다

SpringDataJPA 대표적 특징

  • SpringDataJPA는 기본적으로 자동으로 구현체 만들어줘서 인젝션을 알아서 다해준다.
  • 생각보다 나처럼 SpringDataJPA 먼저 배운 사람들이 많다. 그런분들을 위해 밑에 링크로 꼭 필요한 학습을 정리해뒀다.⬇️

잠깐! DI , 인젝션 , bean , IOC컨테이너, 이런 단어들을 모르겠어!
스프링 기본 학습 바로가기

쿼리메서드 , @Query

쿼리메서드

@Query

  • 반환 타입을 잘보자!
  • 3번 사용시 해당 위치를 상세하게 적어줘야 한다.
  1. List< 엔티티> -> 엔티티필드 전부
  2. List<.String>. -> 필드하나 받을때, username
  3. List<.Member DTO> -> 특정한 값들만 받을때 , DTO로 따로 모아서 반환 (New 연산자쓰기)

파라미터

  • 컬렉션 바인딩을 할수 있는건 처음알아서 흥미로웠다. 여러 값들을 비교할때 유용하게 쓰일것 같다.

결과 반환 타입

  • 컬렉션 반환타입은 널익셉션 x , 빈리스트 반환 (= getResultList)

  • 단건 조회 는 널 발생

  • optional 은 데이터가 있을수도있고 없을수도 있다라는 의미

페이징

  • 디폴트값은 20개씩나온다

  • 레파지토리.기본매서드 (pageable) =파라미터로 pageable을 받을수 있다.

  • url로 사이즈 ,소팅 등등 설정 가능

페이징 반환타입 -page

  • 반환 타입 page, slice, List(페이징 관심없고 데이터 몇개 끊어 올때)

  • 레파지토리에 Pageable 써주기만 하면 바로 사용가능 , 반환값이 page , page로 다양한 메서드 사용 가능

  • Page 는 토탈카운트 자동으로 실행

  • slice 는 토탈카운트 x , 그냥 다음페이지 있어 없어 이렇게 간단하게만 , slice 는 토탈 카운트 날리지 않아서 사용할수 있는 메서드도 제약이 있다. 대신 애초에 가져올떄 size + 1 을 해서 가져온다

페이징- Slice

  • Slice 주로 모바일 더보기 용도
  • Page 반환타입 사용시 카운트쿼리 자동으로 + join table? == join 안해도 되는데… 성능저하

주의해야할점

  • 외부 반환시 엔티티가 아닌 DTO로 반환 해야한다.

  • 나중에 엔티티 변경시 API 사용법도 다 바뀌기 떄문이다.

벌크성 수정 쿼리

  • @Modifying

  • 벌크성 수정은 바로 Db에 넣기에 save(1차캐시에 있고 DB에 반영은 아직) 하고 차이가 난다

->그래서 엔티티매니저 만들고 / em.clear 해줘야함

-> 아니면 clearAutomatically = true 옵션 추가!

Entity Graph

  • 테이블 관계는 지연로딩이 기본 -> 연관된 테이블 건드리는 순간 조인문 발생 (N+1) -> fetch join

  • Fetch join + springDataJPA(쿼리메서드형식) = EntityGraph

Fetch join

  • 그냥 EntityGraph
  • EntityGraph + JPQL
  • EntityGraph + 쿼리메서드

Hint

  • JPA에서는 엔티티 변경시(setter + flush) 더티체킹으로 인해 update 쿼리가 나간다.

  • 기존객체 vs 변경객체 비교해서 더티체킹 => 비교 하기위해서는 엔티티 생성시 만드는 스냅샷을 가지고 비교를 한다.

-> 성능저하 유발

Hint = 100프로 조회용으로 만들꺼야, 스냅샷 생성 x
But 성능 변화 미약하다

profile
호주쉐프에서 개발자까지..

0개의 댓글