본문 바로가기
Today I Learned 2024. 6. 21.

(24.06.21)[10주차] CrudRepository & Delete 쿼리 메서드

Controller-Service-Repository 의 3 Layer Structure에 사용되는 Repository는 interface로, JpaRepository<> 를 extends 받는다.

따라서 Service단에서는 주입받은 Repository에 쿼리메서드를 상요할 수 있는데, 지금까지는 findBy-- 형태의 일종의 Select-where 쿼리와 유사한 것만 사용하고 그 밖에는 Optional로 만들어서 쓸 수 밖에 없었는데,

 

팀과제를 하면서 내가 스스로 만들어낸 쿼리메서드가 아니라 이미 CRUD 에 특화된 CrudRepository를 활용할 수 있도록 코드를 짠 팀원을 보면서 코드 리뷰할 때 궁금증이 생겼고 이에 대해 조금 알아보고 정리하려고 한다.


 

CrudRepository

JpaRepository & 쿼리 메서드

  • 쿼리 메서드는 Spring Data 에서 제공되는  JpaRepository 인터페이스의 메서드라고 할 수 있는데 SQL을 그대로 쿼리로 옮겨놓은 것
    • 일련의 과정의 SimpleJpaRepository 에서 미리 정해진 규칙을 따라야만 함
    • .findAllByOrderByModifiedAtDesc 이런것 처럼 복잡한 쿼리문을 메서드화 시킬 수 있으나 find-- 구문을 활용한 범위에서 크게 벗어나지 않은 정도

CrudRepository

  • SimpleJpaRepository에서 상속상속을 받아서 CRUD 즉, Create Read Update Delete에 관한 작업을 할 수 있도록 하는 인터페이스
    • 학습이나 실제 연습은 JpaRepository를 받아서 사용한 Repository를 사용했기 때문에 가장 많이 쓰이는 findBy 밖에 즉, READ만 사용을 했던 것
    • CrudRepository보다 더 확장된 내용으로 flush batch 등 연산까지 포함해서 제공

Delete관련 쿼리메서드

  • 특히 CrudRepository의 Delete관련 메서드들은 그저 delete만 있었지만, 코드 리뷰에서 다양하게 사용되는 것을 보고나서 학습을 해야하는 부분이라고 생각했고, 여러 쿼리 메서드를 여러게 쓰면서 똑같은 검증을 여러개 하지 않다는 장점도 있기 때문에 정리
    • delete는 무조건 일괄 삭제만 있다고 생각했지만, 다양하게 활용할 수 있음
  • 단, 모든 delete는 Optional이 아닌 void 반환이기 때문에 관련되어서 검증이 진행이 되어야할 수 도 있음

delete()

  • ()안의 엔터티를 레포지토리에서 삭제

deleteById(id)

  • ()안의  아이디에 해당하는 해당 엔터티를 삭제
    • findById() 와 delete가 결합된 기능
  • 반환되는 타입이 void 이기 때문에 DB에 해당 아이디에 대한 엔터티가 존재하지 않을 경우, EmptyResultDataAccessException 예외를 발생
    • 따라서 findBy-- READ부분의 메서드를 통한 검증 후 진행 / EmptyResultDataAccessException 핸들링 선택하여 사용 가능

deleteAllById() ***

List<Long> userIdsToDelete = List.of(1L, 2L, 3L);

String result = userService.deleteUsersByIds(userIdsToDelete);
  • ID에 관련된 모든 엔터티가 여러개를 지우는 개념이 아닌 ()안의 아이디에 대한 엔터티들을 모두 삭제하는 메서드
    • 따라서  아이디 타입에 맞춘 리스트 째로 넣어서 실행할 수 있음!
  • 단, 리스트 또는 여러 아이디가 입력되었을 때, 그중 몇개가 DB에 없어도 EmptyResultDataAccessException 를 던지지 않고, 그것은 무시한채 있는것만 삭제!
    • 크게 다른 것이기 때문에 매우 중요

deleteAll()

  • DB의 모든 데이터 삭제

막상 실제 사용하고 있는 코드에 적용하려고 하다보니 검증에 있어서 로직 순서를 바꾸거나 하는 일이 있었지만, 더 효율적또는 직관적으로 변할 수 있는 이점을 가지고 있었다.

찾거나 저장보다 삭제는 여러 예외가 발생할 가능성을 염두해두고 사용을 해야하기 때문에 해당 delete 메서드 폼의 의미를 좀더 확실히 하고 코드를 짜야할 것!