요약
이미 deleteAll로 하였을 경우 단건씩 나가는 문제를 해결한 메소드인 delete batch가 있다고 합니다...
그래도 덕분에 배치에 대해 배웠습니다.
계기
해당 컨트리뷰션에 도전하게된 계기는 다음과 같습니다. 23년 여름 현장실습을 하며 업무들을 쳐내고 있었습니다. 당시 저는 여러개의 엔티티를 한번에 지워야 하는 삭제 쿼리를 개발하여야 했습니다. 저는 data jpa가 제공해주는 막강한 기능(막강한 최적화)만을 믿고 삭제 기능을 구현하고 테스트 하였습니다. 그러나 실제로 나가는 쿼리를 보니 삭제해야 할 엔티티를 모두 조회하고 한번에 삭제를 하는 것이 아닌 단건씩 삭제가 되었습니다.
사실 당시 진행하고 있던 프로젝트는 사내 업무를 보조하는 성격의 프로그램이였기에 단건씩 삭제가 되든 한번에 삭제가 되든 사용자에게 있어서는 큰 영향은 주지 않았습니다. 그러나 저는 평소 data jpa를 매우 편하게 사용하고 있었고 그런 저에게 있어 data jpa의 이러한 점은 신선한 충격으로 다가왔습니다. (아니... 이거... 진짜... 왜....)
저는 왜이렇게 쿼리가 나가는지 궁금하여 "data jpa delete쿼리"와 같이 구글링을 하였고 향로님의 블로그에서도 동일한 문제에 대해 지적하는 것을 확인하였습니다. 당시 저는 현장실습을 하고 있었고 회사에서 주어지는 업무만을 쳐내기에도 바빠 jpql로 쿼리를 직접 구현하여 일단 문제 해결을 하였습니다.
그러나 24년 1월 지금은...
1. 졸업을 앞두고 있는 시점이다. ((진)백수)
2. 평소 프레임워크가 어떻게 구현되어있는지 궁금하다.
3. 나도 컨트리뷰션 하면서 잘하는 선배 개발자분들 코드도 보고 성장하고 싶다.
이라는 요소가 삼위일체로 합쳐져서 컨트리뷰션을 하고자 마음먹었습니다.
근황
첫번째 컨트리뷰션의 제의가 거절당한뒤 바로 두번째 컨트리뷰션을 시도하였습니다.
시도를 하기 이전 혹시 2017년부터 2024년 새해가 밝은 지금까지 해당 문제는 그대로인지 확인해기로 마음먹고 spring initializer에서 후다닥 테스트용 프로젝트를 만들었습니다.
간단하게 테스트를 하기위해 프로젝트를 만드는 만큼 다음과 같이 의존성을 추가하였습니다.
또한 단건씩 삭제되는 현상을 확인하기 위해 코드 역시 최대한 간단하게 작성하였습니다.
긱 클래스는 다음과 같습니다.
package com.example.demo.Entity;
import static jakarta.persistence.GenerationType.*;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@NoArgsConstructor
@Data
public class Member {
@Id
@GeneratedValue(strategy = AUTO)
private Long id;
private String clubName;
@Builder
public Member(Long id, String clubName) {
this.id = id;
this.clubName = clubName;
}
}
package com.example.demo.Repository;
import com.example.demo.Entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MemberRepository extends JpaRepository<Member, Long> {
}
package com.example.demo.Repository;
import com.example.demo.Entity.Member;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class MemberRepositoryTest {
@Autowired
private MemberRepository memberRepository;
@BeforeEach
public void setUp() {
for (int i = 0; i < 10; i++) {
memberRepository.save(Member.builder()
.clubName("test" + i)
.build());
}
}
@Test
public void deleteAll() {
memberRepository.deleteAll();
}
}
테스트 수행 결과는...
여전히 해당 현상이 남아있었습니다!
그렇기에 단건 삭제가 되는 것을 바탕으로 한번더 컨트리뷰션을 도전해보고자 합니다.
수정
이슈를 올리기전 혹시나 해서 관련 이슈를 찾아보았습니다... 그러나 deleteAllInBatch라는 키워드를 발견하였고 이슈를 읽어보았습니다....
불길한 예감은 틀리지를 않았고 제가 해결하고자 하는 문제는 이미 해당 메서드로 해결되었다고 합니다.
그래도 새로운 것을 배웠기에..(소 뒷걸음치다 쥐 잡은 격이지만...) 새로운 것을 하나 또 배웠기에 만족하고자 합니다.
마지막으로 이슈로 deleteBatch와 delete를 하나로 묶어서 수행해볼 생각이 있는지 물어보고자 합니다...
ㅠㅠ
'컨트리뷰션 > DataJPA' 카테고리의 다른 글
4. batch 메서드 컨트리뷰션 - org.hibernate.AssertionFailure: possible non-threadsafe access to session (0) | 2024.08.24 |
---|---|
4. batch메서드 컨트리뷰션 (실패) (0) | 2024.05.30 |
2. 컨트리뷰션을 해보기 이전 준비해야 할 것들 (컨트리뷰션 실패) (0) | 2024.01.03 |
1. exists + All 관련한 오래된 의문 (컨트리뷰션 실패) (0) | 2024.01.03 |