쿼리 메소드 기능

@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 인터페이스를 구현해서 판단 로직을 변경할 수 있다.

+ 따끈한 최근 게시물