1. 소개
많은 데이터 중심 애플리케이션에서 특정 객체가 이미 존재하는지 여부를 확인해야 하는 상황이 발생할 수 있습니다.
이 사용방법(예제)에서는 Spring Data 및 JPA를 사용하여 이를 달성하는 여러 가지 방법에 대해 설명합니다.
2. 샘플 엔터티
예제의 단계를 설정하기 위해 model 및 power 라는 두 가지 속성이 있는 엔터티 Car 를 만듭니다 .
@Entity
public class Car {
@Id
@GeneratedValue
private int id;
private Integer power;
private String model;
// getters, setters, ...
}
3. 아이디로 찾기
JpaRepository 인터페이스는 주어진 ID 를 가진 엔터티 가 데이터베이스에 존재 하는지 확인하는 existsById 메서드 를 노출합니다.
int searchId = 2; // ID of the Car
boolean exists = repository.existsById(searchId)
searchId 가 테스트 설정 중에 생성 한 Car 의 ID 라고 가정해 보겠습니다 . 테스트 반복성을 위해 하드 코딩된 숫자(예: "2")를 사용해서는 안 됩니다 . Car 의 id 속성 이 자동으로 생성되고 시간이 지남에 따라 변경될 수 있기 때문입니다. existsById 쿼리는 객체의 존재 여부를 확인하는 가장 쉽지만 유연성이 가장 낮은 방법 입니다 .
4. 파생 쿼리 방법 사용
Spring의 파생 쿼리 메서드 기능을 사용하여 쿼리를 공식화할 수도 있습니다. 이 예제에서는 주어진 모델 이름을 가진 Car 가 존재 하는지 확인하려고 합니다. 따라서 다음 쿼리 방법을 고안합니다.
boolean existsCarByModel(String model);
메서드의 이름은 임의로 지정할 수 없으며 특정 규칙을 따라야 합니다 . 그런 다음 Spring은 메소드 이름에서 SQL 쿼리를 파생할 수 있도록 저장소에 대한 프록시를 생성합니다. IntelliJ IDEA와 같은 최신 IDE는 구문 완성 기능을 제공합니다.
주문 통합, 결과 제한 및 여러 쿼리 기준 포함과 같이 쿼리가 더 복잡해지면 이러한 메서드 이름이 매우 길어져 가독성이 떨어질 수 있습니다. 파생 쿼리 메서드는 암시적이고 "관례에 따른" 특성 때문에 약간 마술처럼 보일 수도 있습니다.
그럼에도 불구하고 깨끗하고 정돈된 코드가 중요하고 개발자가 잘 테스트된 프레임워크에 의존하고자 할 때 유용할 수 있습니다.
5. 예시 로 찾기
예제 는 예제 매처 를 사용하여 쿼리를 동적으로 작성하기 때문에 존재 여부를 확인하는 매우 강력한 방법입니다 . 따라서 역동성이 필요할 때마다 이것이 좋은 방법입니다. Spring의 ExampleMatcher 및 사용 방법에 대한 포괄적인 설명은 Spring Data Query 기사에서 찾을 수 있습니다.
5.1. 매처
대소문자를 구분하지 않는 방식으로 모델 이름을 검색한다고 가정합니다. ExampleMatcher 를 생성하여 시작하겠습니다 .
ExampleMatcher modelMatcher = ExampleMatcher.matching()
.withIgnorePaths("id")
.withMatcher("model", ignoreCase());
id 가 기본 키이고 기본적으로 자동으로 선택 되기 때문에 id 경로 를 명시적으로 무시해야 합니다 .
5.2. 프로브
다음으로 조회하려는 클래스의 인스턴스인 "프로브"를 정의해야 합니다. 모든 검색 관련 속성이 설정되어 있습니다. 그런 다음 nameMatcher에 연결 하고 쿼리를 실행합니다.
Car probe = new Car();
probe.setModel("bmw");
Example<Car> example = Example.of(probe, modelMatcher);
boolean exists = repository.exists(example);
유연성이 크면 복잡성도 커지고 ExampleMatcher API가 강력할 수 있으므로 이를 사용하면 몇 줄의 추가 코드가 생성됩니다. 동적 검색어에 사용하거나 필요에 맞는 다른 방법이 없는 경우 사용하는 것이 좋습니다 .
6. Exists 시맨틱으로 사용자 지정 JPQL 쿼리 작성
우리가 살펴볼 마지막 방법은 JPQL(Java Persistence Query Language)을 사용하여 존재하는 사용자 정의 쿼리를 구현하는 것 입니다 .
@Query("select case when count(c)> 0 then true else false end from Car c where lower(c.model) like lower(:model)")
boolean existsCarLikeCustomQuery(@Param("model") String model);
아이디어는 모델 속성 을 기반으로 대소문자를 구분하지 않는 카운트 쿼리를 실행하고 반환 값을 평가하고 결과를 Java 부울 에 매핑하는 것 입니다. 다시 말하지만 대부분의 IDE는 JPQL 문을 꽤 잘 지원합니다.
사용자 지정 JPQL 쿼리 는 파생된 메서드의 대안으로 볼 수 있으며 SQL과 유사한 문에 익숙하고 추가 @Query 어노테이션 을 신경 쓰지 않을 때 좋은 선택인 경우가 많습니다 .
7. 결론
이번 글에서는 Spring Data와 JPA를 이용하여 데이터베이스에 객체가 존재하는지 확인하는 방법에 대해 알아보았습니다. 사용 사례와 개인 취향에 크게 좌우되기 때문에 각 방법을 언제 사용해야 하는지에 대한 엄격하고 빠른 규칙은 없습니다.
경험에 비추어 볼 때 선택권이 주어지면 개발자는 견고성, 성능 및 코드 명확성을 이유로 항상 더 간단한 방법을 선택해야 합니다. 또한 파생 쿼리 또는 사용자 지정 JPQL 쿼리를 결정한 후에는 일관된 코딩 스타일을 보장하기 위해 가능한 한 오랫동안 해당 선택을 고수하는 것이 좋습니다.
완전한 소스 코드 예제는 GitHub 에서 찾을 수 있습니다 .