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 |