
회원가입 기능을 구현하던 도중, 이미 존재하는 ID로 들어오는 요청을 처리해야 했다.
Spring Data JPA에서는 'existsBy' 메서드를 지원한다.
'existsByXXX()'
public interface UserRepository
extends JpaRepository<User, Long> {
public boolean existsByUsername(String username);
}
이런 식으로 existsBy 뒤에 매핑된 엔티티 클래스의 필드명을 작성해두면 메서드를 선언하는 것만으로 기능을 사용할 수 있다.
'existsByXXX' 메서드의 작동 과정
JPA는 내부적으로 'existsByXXX'를 발견하면 JPQL을 생성한다.
Hibernate Dialect나 DB의 종류에 따라 다르지만, 다음과 같은 쿼리문을 생성해 준다.
/* Oracle, PostgreSQL, H2 등 */
select 1 ... where ... fetch first 1 row only
/* MySQL 등 */
select exists(select 1 from ... where ...)
'countByXXX'도 중복 검사에 사용될 수 있다.
countBy를 이용해서도 중복 검사를 할 수 있는데, 찾고자 하는 값을 DB에서 전부 찾아서 그 개수를 반환한다. 찾은 데이터가 1개라도 있으면 이미 존재한다는 것이므로 중복임을 알 수 있다.
하지만 existsBy는 검색 도중에 데이터가 발견되면 그 즉시 결과를 반환하기 때문에, 데이터의 양이 많아지면 두 메서드의 성능 차이가 더 명확해진다.
결론
추가할 데이터가 이미 DB에 존재하는지 검사하고 싶다면 existsByXXX 메서드를 사용하면 된다.