JPQL part4

Shaun·2021년 11월 8일
1

JPA

목록 보기
28/31

JPQL 엔티티 직접 사용

엔티티 직접사용 기본키값

  • JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기
    본 키 값을 사용

무슨 말인지 헷갈리니 직접 코딩 해보자!

  • 쿼리문이 where m -> where m.id 로 변환되서 실행되었다.

  • m =엔티티 직접 사용시 해당 엔티티의 기본 키값(m.id) 실행

  • 그러므로 엔티티를 직접 전달하거나 식별자(m,id) 를 직접 전달하거나 결과는 똑같다.

정리

엔티티 직접사용 외래키 값

  • 외래키값이라 헷갈릴수 있지만 첫번째 문장을 잘 생각 해보자.
    -> JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기
    본 키 값을 사용

  • 해당엔티티(team) 의 기본 키값(team.id) 를 사용 한다는 뜻이다.

정리

Named쿼리

  • 미리 이름을 정의해서 사용하는 JPQL

  • 정적 쿼리

  • 애플리케이션 로딩 시점에 쿼리를 검증

  • Spring Data JPA 에서는 @Query

  • 사용법은 예상한 대로다. ->해당 엔티티위에 애노테이션으로 설정해준뒤 createNamedQuery을 이용해 사용한다.

  • 중요한 포인트는 애플리케이션 로딩 시점에 쿼리를 검증한다는 점이다. 쿼리문에서 오류가 나면 다 잡아준다.

  • 이기능이 Spring Data Jpa 에서는 @Query 로 사용된다. Named쿼리 기능 기반의 애노테이션이다. 처음에 Spring Data Jpa부터 배웠을때는 자동으로 검증도 해주네라고만 생각 했지만 이러한 원리를 알고나니 흥미롭고 왜 검증이 되는지도 이해가 됬다.

벌크연산

  • 쉽게 말하면 많은 양의 수정을 할때 사용한다.

  • 왜 써야할까?
    ->JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL 실행

  • executeUpdate()

  • 영속성 컨텍스트 1차캐시가 아닌 바로 DB에 적용 시킨다.

바로 DB에 적용시킨다?? 테스트를 해보자!

  • Member 객체의 age를 20으로 설정 했음에도 불구하고 확인을 해보면

  • 그러나 DB를 보면

  • 즉 1차캐시 값은 Flush (DB에 값반영) / Clear(1차캐시 비우기) 으로 0이다. 하지만 벌크연산으로 인해 DB값은 20으로 설정된것이다.

  • 영속성 컨텍스트 와 DB의 값이 다르기 시작한다!
    -> 벌크연산후 Clear() 로 영속성 컨텍스트를 지워주자

아니 그러면 벌크연산 할때마다 Clear()써줘야돼??? 너무 불편한데??

-> JPA 를 좀더 쉽게 사용하기위해 나온 Spring Data Jpa 에서는 @Modifying을 지원한다.

  • Spring Data Jpa에서는 Clear을 자동으로 적용 시켜준다. JPA 를 안배우고 Spring Data Jpa 를 먼저 배웠을때는 원래 이런가 했는데 원리를 알고 나니 확실히 이해가 됐다. 나중에 오류나 장애가 나도 원리를 알아야 고칠수 있겠다고 느꼇다.

참고자료 : Spring Data JPA Reference

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

0개의 댓글