일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- java map 저장
- java map
- java참조자료형
- java최솟값구하기
- 항해99후기
- java알고리즘문제풀이
- javaJVM
- 격파르타합격후기
- java map 출력
- java 자료구조 활용
- 항해15기
- 격파르타장점
- 격파르타비전공자
- javaJRE
- 컴파일
- 작은수제거하기
- 격파르타후기
- 프로그래머스제일작은수
- java list 출력
- 노베이스부트캠프
- java기본자료형
- 코딩부트캠프후기
- java set 저장
- 비전공자sqld
- sqld자격증합격
- 인터프린터언어
- java알고리즘
- 프로그래머스
- java set 출력
- java list 저장
- Today
- Total
코딩과 결혼합니다
[Spring Data JPA] 쿼리 메서드(3) 본문
벌크성 수정 쿼리
데이터베이스의 특정 작업을 한 번에 대량으로 처리하는 쿼리.
[순수 JPA]
public int bulkAgePlus(int age) {
return em.createQuery(
"update Member m set m.age = m.age + 1" +
" where m.age >= :age")
.setParameter("age", age)
.executeUpdate();
}
조건에 만족하는 데이터에 +1을 하는 쿼리. executeUpdate()로 데이터들을 업데이트한다.
[Spring Data Jpa]
@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
반환타입을 int로 맞춰주고 똑같이 쿼리를 짜준다. 그리고 파라미터로 age를 받는다.
@Modifying은 순수 JPA에서의 executeUpdate()와 같은 역할을 해주고 이를 사용하지 않으면 result list나 single result 이런 것들을 호출해 버린다. (@Modifying을 쓰지 않으면 QueryExecutionRequestException 에러가 뜬다.)
⭐벌크성 쿼리를 실행하고 나서 영속성 콘텍스트를 초기화해 준다.
벌크 연산은 영속성 콘텍스트를 무시하고 실행하기 때문에, 영속성 콘텍스트에 있는 엔티티의 상태와 DB에 엔티티 상태가 달라질 수 있다. 이에 대한 방안으로는 2가지가 있다.
1. 영속성 콘텍스트에 엔티티가 없는 상태에서 벌크 연산을 먼저 실행
2. 영속성 콘텍스트에 엔티티가 있으면 벌크 연산 직후 영속성 콘텍스트 초기화
@EntityGraph
@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();
멤버뿐만이 아니라 멤버 안에 있는 team의 정보를 가져올 때, 그냥 조회하게 되면 member의 수만큼 N+1 문제가 발생하 게된다. 그래서 fetch join으로 한 방 쿼리로 끌고 오는데, 이를 위해 JPQL을 별도로 또 짜야한다는 번거로움이 있다.
@EntityGraph 는 JPQL 없이도 객체 그래프를 한 번에 엮어서 성능 최적화를 해서 가지고 오는 역할을 해준다.
@EntityGraph(attributePaths = {"team"})
@Query("select m from Member m")
List<Member> findMemberEntityGraph();
이런식으로 JPQL에 엔티티 그래프를 넣는 것도 가능하다고...
@EntityGraph(attributePaths = {"team"})
List<Member> findByUsername(@Param("username") String username);
메소드 이름을 사용하고 싶을 때에도 사용할 수 있다.
(회원 데이터를 쓸 때 팀 데이터를 쓸일이 많으면 이런식으로 엔티티 그래프를 뽑아볼 수 있다.)
이 기능은 페치 조인을 편리하게 사용할 수 있는 기능 정도로만 이해하면 되고, 간단한 부분에 적용해볼 수 있다.
복잡해지면 그냥 JPQL로 fetch join하자!
'2세 > JPA' 카테고리의 다른 글
[JPA] Join 문법 (2) | 2024.03.08 |
---|---|
[Spring Data JPA] 쿼리 메서드(2) (0) | 2024.02.29 |
[Spring Data JPA] 쿼리 메서드 (0) | 2024.02.28 |
[Spring Data JPA] 순수 JPA와 Spring Data JPA (0) | 2024.02.27 |
[JPA] 컬렉션 조회 최적화(1) (0) | 2024.02.25 |