Spring
SpringData JPA, Example Probe ExampleMatcher(Query by Example)
sehunbang
2024. 3. 6. 18:41
- 받고싶은 예시객체를 만들어서 조건절로 사용하는 기술로
- 예제 객체를 가지고 쿼리를 만드는 개념입니다.
- 현업에서 잘 쓰지는 않아서 간단하게 짚고 넘어가겠습니다.
구성요소
Example
- Example은 Probe 과 ExampleMatcher 을 하나로 합친 것 이걸로 쿼리를 수행합니다.
Probe
- Probe는 필드에 어떤 값들을 가지고 있는 도메인 객체
ExampleMatcher
- ExampleMatcher는 Prove? 에 들어있는 그 필드의 값들을 어떻게 쿼리할 데이터와 비교할지 정의한 것
기능
- 별다른 코드 생성기(QClass 같은)나 애노테이션 처리기(@Qeury같은) 필요 없이 그냥 쓰면된다.
- 도메인 객체가 수정되면 같이 반영됨 (필드나 함수를 그대로 쓰기때문에)
- 독립적인 인터페이스를 가져서 영향도가 적다.
제한사항
- 여러필드 조합해서 조건만드는 nested 또는 자식 Collection 제약 조건을 못 만든다.
- 문자열은 starts/contains/ends/regex 가 가능하고 그밖에 필드는 값이 정확히 일치해야 한다
QueryByExampleExecutor
Repository Interface 에 QueryByExampleExecutor 의존성을 추가해주면 됩니다.
public interface UserRepository extends JpaRepository<User, Long>, QueryByExampleExecutor<User> {
테스트 :
@Test
public void queryByExampleTest() {
// given
var newUser = User.builder().username("user").profileImageUrl("http://").password("pass")
.build();
userRepository.save(newUser);
// when
User prove = new User();
prove.updatePassword("pass");
ExampleMatcher exampleMatcher = ExampleMatcher.matchingAny().withIgnorePaths("up", "down");
Example<User> example = Example.of(prove, exampleMatcher);
var users = userRepository.findAll(example);
// then
assert !users.isEmpty();
}