스프링 데이터 JPA
조회 결과가 많거나 없으면
List<Member> findByUsername(String name); //컬렉션
Member findByUsername(String name); //단건
Optional<Member> findByUsername(String name);; //단건 Optional
컬렉션:
결과 없음: 빈 컬렉션 반환
단건 조회:
결과 없음: null 반환
결과가 2건 이상: javax.persistence.NonUniqueResultException 예외 발생
* 단건으로 지정한 메서드를 호출 시에 JPQL의 Query.getSingleResult() 메서드를 호출하는데, 이 메서드를 호출했을 때 조회 결과가 없으면 javax.persistence.NoResultException 예외가 발생하게 되는데, 스프링 데이터 JPA는 단건을 조회할 때 이 예외가 발생하면 예외를 무시하고 대신에 null을 반환한다.
스프링 데이터 JPA 페이징과 정렬
org.springframework.data.domain.Sort : 정렬 기능
org.springframework.data.domain.Pageable : 페이징 기능(내부에 Sort 포함)
org.springframework.data.domain.Page : 추가 count 쿼리 결과를 포함하는 페이징
org.springframework.data.domain.Slice : 추가 count 쿼리 없이 다음 페이지만 확인 가능(내부적으로 limit + 1 조회)
List(자바 컬렉션) : 추가 count 쿼리 없이 결과만 반환
Page<Member> findByUsername(String name,pageable pageable); //count 쿼리 사용
Slie<Member> findByUsername(String name,pageable pageable); //count 쿼리 사용X
List<Member> findByUsername(String name,pageable pageable); //count 쿼리 사용X
벌크성 수정, 삭제 쿼리는 @Modifying 어노테이션을 사용
사용하지 않으면 QueryExecutionReuqestException 발생
벌크성 쿼리를 실행하고 나섯 영속성 컨텍스트 초기화
@Modifying(clearAutomatically = true) false가 기본값임
* 이 옵션 없이 회원을 findById 로 다시 조회하면 영속성 컨텍스트에 과거 값이 남아서 문제가 될 수 있다. 만약 다시 조회해야 하면 꼭 영속성 컨텍스트를 초기화 하자.
* 벌크 연산은 영속성 컨텍스트를 무시하고 실행하기 때문에, 영속성 컨텍스트에 있는 엔티티의 상태와 DB에 엔티티 상태가 달라질 수 있다.
1. 영속성 컨텍스트에 엔티티가 없는 상태에서 벌크 연산을 먼저 실행
2. 부득이하게 영속성 컨텍스트에 엔티티가 있으면 벌크 연산 직후 영속성 컨텍스트를 초기화
도메인 클래스 컨버터로 엔티티를 파라미터로 받으면, 이 엔티티는 단순 조회용으로만 사용해야 한다. (트랜잭션이 없는 범위에서 엔티티를 조회했으므로, 엔티티를 변경해도 DB에 반영되지 않는다.)
'Spring' 카테고리의 다른 글
ENUM 에 대해 알아보자 (0) | 2020.07.31 |
---|---|
스프링 시큐리티 denied Page 404 뜨는 이유 (0) | 2020.07.31 |
java final static 붙이는 이유, lombok 어노테이션 (0) | 2020.07.17 |
자바 동적 파라미터화 코드 전달하기 (0) | 2020.07.14 |
부트 이것저것... (0) | 2020.06.29 |