1. 개요

Spring Data JPA 쿼리는 기본적으로 대소문자를 구분합니다. 즉, 필드 값 비교는 대/소문자를 구분합니다.

이 예제에서는 Spring Data JPA 리포지토리에서 대소문자를 구분하지 않는 쿼리를 빠르게 생성하는 방법을 살펴보겠습니다.

2. 의존성

먼저 pom.xml 에 Spring Data  및  H2 데이터베이스 의존성 이 있는지 확인 합니다 .

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.7.2</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
    <version>1.4.199</version>
</dependency>

최신 버전은 Maven Central에서 사용할 수 있습니다.

3. 초기 설정

id, firstNamelastName  속성 이 있는 Passenger 엔터티 가 있다고 가정해 보겠습니다 .

@Entity
class Passenger {
 
    @Id
    @GeneratedValue
    @Column(nullable = false)
    private Long id;
 
    @Basic(optional = false)
    @Column(nullable = false)
    private String firstName;
 
    @Basic(optional = false)
    @Column(nullable = false)
    private String lastName;
 
    // constructor, static factory, getters, setters
}

또한 일부 샘플 Passenger 데이터로 데이터베이스를 채워 테스트 클래스를 준비하겠습니다.

@DataJpaTest
@RunWith(SpringRunner.class)
public class PassengerRepositoryIntegrationTest {

    @PersistenceContext
    private EntityManager entityManager;
    @Autowired
    private PassengerRepository repository;

    @Before
    public void before() {
        entityManager.persist(Passenger.from("Jill", "Smith"));
        entityManager.persist(Passenger.from("Eve", "Jackson"));
        entityManager.persist(Passenger.from("Fred", "Bloggs"));
        entityManager.persist(Passenger.from("Ricki", "Bobbie"));
        entityManager.persist(Passenger.from("Siya", "Kolisi"));
    }
    
    //...
}

4.  대소문자를 구분하지 않는 쿼리를 위한 IgnoreCase

이제 주어진 이름을 가진 모든 승객을 찾기 위해 대소문자를 구분하지 않는 검색을 수행한다고 가정합니다 .

이를 위해 PassengerRepository 를 다음과 같이 정의합니다.

@Repository
public interface PassengerRepository extends JpaRepository<Passenger, Long> {
    List<Passenger> findByFirstNameIgnoreCase(String firstName);
}

여기 에서 IgnoreCase 키워드는 쿼리 일치가 대소문자를 구분하지 않도록 합니다.

JUnit 테스트의 도움으로 이를 테스트할 수도 있습니다.

@Test
public void givenPassengers_whenMatchingIgnoreCase_thenExpectedReturned() {
    Passenger jill = Passenger.from("Jill", "Smith");
    Passenger eve = Passenger.from("Eve", "Jackson");
    Passenger fred = Passenger.from("Fred", "Bloggs");
    Passenger siya = Passenger.from("Siya", "Kolisi");
    Passenger ricki = Passenger.from("Ricki", "Bobbie");

    List<Passenger> passengers = repository.findByFirstNameIgnoreCase("FrED");

    assertThat(passengers, contains(fred));
    assertThat(passengers, not(contains(eve)));
    assertThat(passengers, not(contains(siya)));
    assertThat(passengers, not(contains(jill)));
    assertThat(passengers, not(contains(ricki)));
}

인수 로 " FrED " 를 전달했음에도 불구하고 반환된 승객 List 에는 이름"Fred" 인 승객 이 포함되어 있습니다. 분명히 IgnoreCase 키워드 의 도움으로 대소문자를 구분하지 않는 일치를 달성했습니다.

5. 결론

이 빠른 사용방법(예제)에서는 Spring 데이터 리포지토리에서 대소문자를 구분하지 않는 쿼리를 만드는 방법을 배웠습니다.

마지막으로 코드 예제는 GitHub에서 사용할 수 있습니다 .

Persistence footer banner