deleteById, delete

박영준·2023년 1월 21일
0

Spring

목록 보기
4/58

1. 공통점

1) 정의

  • Spring Data JPA 에서는 delete 혹은 deleteById 메소드를 사용하여, DB에 delete 쿼리를 날릴 수 있다.

  • deleteById와 delete는 완전 다른게 아니라, 최종적으로는 delete를 호출하여 삭제

  • 두 메소드 간에 성능 차이 X

  • 두 메소드의 결과는 동일함

2) 방법

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);
    }
}

2. 차이점

SimpleJpaRepository 에서 차이점 확인

1) deleteById

(1) 정의

  • deleteById 는 findbyId + delete 의 과정이 합쳐진 메소드이므로,
    deleteById 내부적으로 delete 를 호출하고있다는 것을 알 수 있다.

  • 넘어온 id값으로 findById 를 사용하여, delete 에 인자로 넘겨줄 데이터를 조회

  • 넘어온 id 값이 null 인 경우(내부적인 findById 조회 시 값이 없을 경우), EmptyResultDataAccessException 을 발생

(2) 장점

  • 서비스 로직에서 메소드를 하나만 사용해도, 조회 + 삭제가 모두 가능

  • 내부적으로 id에 대한 null 체크를 해주므로,
    서비스 로직에서 id의 null 체크를 하지 않았더라도 의도치 않은 NullPointerException 발생 예방

2) delete

(1) 정의

  • 넘어온 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));
    }

(2) 장점

  • findById 를 직접 사용하면 예외처리를 커스텀할 수 있으므로, 서버 개발자가 원하는 메시지를 클라이언트로 보내줄 수 있다
    (deleteById 의 경우, 값이 없으면 mptyResultDataAccessException 이 발생)

결론
deleteById 와 delete 는 각각의 특징에 따라, 상황에 잘 맞춰 사용하자.


참고: [Spring Data Jpa] delete(Entity e) vs deleteById 차이
참고: Spring Data JPA 사용 시 deleteById 와 delete 의 차이

profile
개발자로 거듭나기!

0개의 댓글