본문 바로가기

Spring/Spring JPA

Query by Example(QBE)

Query by Example(QBE)은 Spring Data JPA에서 제공하는 기능으로, 엔티티의 샘플 인스턴스를 사용해 데이터베이스에서 일치하는 데이터를 조회할 때 사용됩니다. 이를 통해 복잡한 쿼리를 작성하지 않고도 동적으로 데이터를 검색할 수 있습니다.

주요 특징

  • 동적 쿼리 지원: 특정 필드 값만 설정한 엔티티 객체(Example)를 통해 검색할 수 있습니다. 설정된 필드 값이 조건으로 사용되며, null이거나 설정되지 않은 필드는 무시됩니다.
  • 유연한 매칭: 기본적으로 값이 정확히 일치하는 경우에만 결과를 반환하지만, Matcher를 설정하여 부분 일치, 대소문자 무시, 시작 또는 끝 일치 등의 다양한 조건을 지정할 수 있습니다.
  • 타입 안정성: QBE는 일반적으로 리포지토리 메서드와 함께 사용되어, 예측 가능한 타입 안정성을 제공합니다.

사용 예시

예를 들어, Member 엔티티가 다음과 같다고 가정합니다:

 

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;
}

 

MemberRepository에서 QBE를 사용하는 예시는 다음과 같습니다:

import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;

Member memberProbe = new Member();
memberProbe.setName("John");  // 검색 조건 설정 (예: name이 "John"인 멤버 찾기)

ExampleMatcher matcher = ExampleMatcher.matching()
                                      .withIgnorePaths("id")  // id 필드는 무시
                                      .withIgnoreCase("name");  // 대소문자 구분 없음

Example<Member> example = Example.of(memberProbe, matcher);
List<Member> results = memberRepository.findAll(example);

 

 

주요 메서드

  • Example.of(T probe) 또는 Example.of(T probe, ExampleMatcher matcher): 검색 조건(프로브 객체)과 매칭 전략을 사용하여 Example 객체를 생성합니다.
  • findAll(Example<S> example): 주어진 Example 객체와 일치하는 모든 엔티티를 조회합니다.
  • exists(Example<S> example): 일치하는 엔티티가 존재하는지 확인합니다.

장점과 한계

  • 장점: 동적 쿼리를 작성하는 데 코드가 간단하고 빠르며, 리포지토리 인터페이스만으로 쉽게 필터링이 가능합니다.
  • 한계: 복잡한 조인, 연산자(예: 범위 검색, 조건 논리 연산) 등이 필요한 경우에는 적합하지 않으며, 복잡한 쿼리를 위해서는 JPQL, Criteria API, 또는 QueryDSL을 사용하는 것이 좋습니다.

Spring Data JPA에서는 Specification과 같은 기능을 제공해 보다 복잡하고 유연한 조건을 설정할 수 있다고 한다.

'Spring > Spring JPA' 카테고리의 다른 글

[JPA] ENUM 타입  (0) 2024.11.12
[JPA] 엔티티 클래스에서 많이 사용되는 어노테이션  (1) 2024.11.12
[JPA] Paging  (1) 2024.11.12
[JPA] IsEmpty와 IsNotNulLL 의 차이점  (0) 2024.11.11
Spring Boot JPA 간단하게  (4) 2024.11.04