Spring Data JPA 에서는 delete 혹은 deleteById 메소드를 사용하여, DB에 delete 쿼리를 날릴 수 있다.
deleteById와 delete는 완전 다른게 아니라, 최종적으로는 delete를 호출하여 삭제
두 메소드 간에 성능 차이 X
두 메소드의 결과는 동일함
JpaRepository<T, ID> interface를 상속받은 Repository interface를 생성해줌으로써 사용 가능
public interface UserRepository extends JpaRepository<User, Long> {
}
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
// delete 를 사용했을 경우
public void delete(User user) {
userRepository.delete(user);
}
// deleteById 를 사용했을 경우
public void deleteById(Long userId) {
userRepository.deleteById(userId);
}
}
SimpleJpaRepository 에서 차이점 확인
deleteById 는 findbyId + delete 의 과정이 합쳐진 메소드이므로,
deleteById 내부적으로 delete 를 호출하고있다는 것을 알 수 있다.
넘어온 id값으로 findById 를 사용하여, delete 에 인자로 넘겨줄 데이터를 조회
넘어온 id 값이 null 인 경우(내부적인 findById 조회 시 값이 없을 경우), EmptyResultDataAccessException 을 발생
서비스 로직에서 메소드를 하나만 사용해도, 조회 + 삭제가 모두 가능
내부적으로 id에 대한 null 체크를 해주므로,
서비스 로직에서 id의 null 체크를 하지 않았더라도 의도치 않은 NullPointerException 발생 예방
넘어온 entity 에 대해 null체크를 한 후, EntityManager 를 통해 삭제를 진행한다.
직접 findById와 delete를 조합해서 사용하는 방법
delete 메소드는 findById 와 조합해서 쓰는 경우 多
// 예시 1
public void delete(Long userId) {
userRepository.delete(
userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException(User.class, userId))
);
}
// 예시 2
public void delete(Long userId) {
userRepository.findById
.map(user -> userRepository.delete(user))
.orElseThrow(() -> new UserNotFoundException(User.class, userId));
}
결론
deleteById 와 delete 는 각각의 특징에 따라, 상황에 잘 맞춰 사용하자.
참고: [Spring Data Jpa] delete(Entity e) vs deleteById 차이
참고: Spring Data JPA 사용 시 deleteById 와 delete 의 차이