쿼리 메소드 기능
@Query, 리포지토리 메소드에 쿼리 정의
public interface MemberRepository extens JpaRepository<Member, Long> {
@Query("select m from Memver m where m.username = :name")
Member findByUsername(@Param("name") String username);
}
벌크성 수정 쿼리
- 스프링 데이터 JPA에서 벌크성 수정, 삭제 쿼리는 org.springframework.data.jpa.repository.Modifying 어노테이션을 사용하면 된다.
- 벌크성 쿼리를 실행하고 나서 영속성 컨텍스트를 초기화하고 싶으면
@Modifying(clearAutomatically = true)
설정을 하자. (기본값 false)
페이징과 정렬
PageRequest pageRequest = new PageRequest(0, 10, new Sort(Direction.DESC, "name"));
Page<Member> result = memberRepository.findByNameStartingWith("rla", pageRequest);
List<member> members = result.getContent();
int totalPages = result.getTotalPages();
boolean hasNextPage = result.hasNextPage();
힌트
- 이것은 SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트다.
@QueryHints(value = { @QueryHint(name = "org.hibernate.readOnly", value = "true")}, forCounting = true) page<Member> findByName(String name, Pageble pageable);
- forCounting 속성은 반환 타입으로 Page 인터페이스를 적용하면 추가로 호출하는 페이징을 위한 count 쿼리에도 쿼리 힌트를 적용할지를 설정하는 옵션이다. (기본값 true)
Lock
- 쿼리 시 락을 걸 때 사용한다.
@Lock(LockModeType.PESSIMISTIC_WRITE) List<Member> findByName(String name);
명세
Specification은 컴포지트 패턴으로 구성되어 있어서 여러 Specification을 조합할 수 있다. 따라서 다양한 검색조건을 조립해서 샐운 검색조건을 쉽게 만들 수 있다.
Web 확장
스프링 데이터가 제공하는 Web 확장 기능을 활성화하려면 org.springframework.data.web.config.SpringDataWebConfiguration을 스프링 빈으로 등록하면 된다.
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
public calss WebAppConfig {
...
}
도메인 클래스 컨버터 기능
- HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩해준다.
- 도메인 클래스 컨버터를 통해 넘어온 회원 엔티티를 컨트롤러에서 직접 수정해도 실제 데이터베이스에는 반영되지 않는다. 이것은 스프링 데이터와는 관련이 없고 순전히 영속성 컨텍스트의 동작 방식과 관련이 있다.
페이징과 정렬 기능
- 파라미터로 Pageable을 받는다.
- 접두사
- 사용해야 할 페이징 정보다 둘 이상이면 접두사를 사용해서 구분할 수 있다.
- "{접두사명}_"로 구분한다.
public String list { @Qualifier("member") Pageable memberPageable, @Qualifier("order") Pageable orderPageable, ... }
기본값
- page=0, size=20 이다.
- 기본값을 변경하고 싶으면 @PageableDefault 어노테이션을 사용하면 된다.
public String list(@PageableDefault(size = 12, sort = "name", direction = Sort.Direction.DESC) Pageable pageable) { ... }
스프링 데이터 JPA가 사용하는 구현체
스프링 데이터 JPA가 제공하는 공통 인터페이스는 org.springframework.data.jpa.repository.support.SimpleJpaRepository 클래스가 구현한다.
@Repository 적용
- JPA 예외를 스프링이 추상화한 예외로 변환한다.
@Transactional 트랜잭션 적용
- 스프링 데이터 JPA가 제공하는 공통 인터페이스를 사용하면 데이터를 변경하는 메소드에 @Transactional로 트랜잭션 처리가 되어 있다.
@Transactional(readOnly = true)
- 데이터를 조회하는 메소드에는
readOnly = true
옵션이 적용되어 있다. - 플러시를 생략하기 때문에 약간의 성능 향상을 얻을 수 있다.
save() 메소드
- 저장할 엔티티가 새로운 엔티티면 저장(persist)하고 이미 있는 엔티티면 병합(merge)한다.
- 식별자가 객체일 때 null, 자바 기본 타입일 때 숫자 0 값이면 새로운 엔티티로 판단한다.
- 필요하면 엔티티에 Persistable 인터페이스를 구현해서 판단 로직을 변경할 수 있다.
'JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 웹 애플리케이션과 영속성 관리 (0) | 2020.09.04 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 값 타입 (0) | 2020.09.04 |
[자바 ORM 표준 JPA 프로그래밍] 프록시와 연관관계 관리 (0) | 2020.09.04 |
[자바 ORM 표준 JPA 프로그래밍] 고급 매핑 (0) | 2020.09.04 |
[자바 ORM 표준 JPA 프로그래밍] 다양한 연관관계 매핑 (0) | 2020.09.04 |