Uploaded 상태로 오래되거나 Abandoned 상태의 UploadFile을 삭제하는 기능을 추가했습니다.
파일을 삭제할 때 S3Client.deleteObject() 메서드를 사용하지 않고 S3Client.deleteObjects() 메서드를 사용했습니다.
이유는 파일을 삭제할 때, 요청을 한 번씩 여러 번 보내는 것 보다, 한 번의 요청으로 모든 파일을 삭제하는 것이 효율적이라고 판단했습니다.
그에 따라 실패한 요청이 있을 수 있으므로 에러가 있는지 확인하고, 에러가 있으면 로그를 남기는 식으로 구현했습니다.
(FCM과 비슷하네요. Javadoc에 that if the object specified in the request is not found, Amazon S3 returns the result as deleted 라는 내용이 있습니다. 따라서 권한 문제가 아니라면 에러가 날 일이 있을까 싶네요 😂)
파일을 삭제하면, DB 데이터도 당연히 삭제를 해야하는데, JPA의 Query Creation 기능을 사용하지 않고, @Query 어노테이션을 사용하여 JPQL로 작성했습니다.
이유는 Query Creation 기능을 사용하면 in절로 사용을 했다고 생각했지만, delete 쿼리가 별도로 날아갑니다..!
📌 관련 이슈
✨ PR 세부 내용
Uploaded 상태로 오래되거나 Abandoned 상태의 UploadFile을 삭제하는 기능을 추가했습니다.
파일을 삭제할 때
S3Client.deleteObject()
메서드를 사용하지 않고S3Client.deleteObjects()
메서드를 사용했습니다.이유는 파일을 삭제할 때, 요청을 한 번씩 여러 번 보내는 것 보다, 한 번의 요청으로 모든 파일을 삭제하는 것이 효율적이라고 판단했습니다.
그에 따라 실패한 요청이 있을 수 있으므로 에러가 있는지 확인하고, 에러가 있으면 로그를 남기는 식으로 구현했습니다. (FCM과 비슷하네요. Javadoc에
that if the object specified in the request is not found, Amazon S3 returns the result as deleted
라는 내용이 있습니다. 따라서 권한 문제가 아니라면 에러가 날 일이 있을까 싶네요 😂)파일을 삭제하면, DB 데이터도 당연히 삭제를 해야하는데, JPA의
Query Creation
기능을 사용하지 않고,@Query
어노테이션을 사용하여 JPQL로 작성했습니다.이유는 Query Creation 기능을 사용하면 in절로 사용을 했다고 생각했지만, delete 쿼리가 별도로 날아갑니다..!
이에 대한 자세한 내용은 동욱님 블로그 참고하시면 될 것 같습니다.
덤으로 바로
List<UploadFile>
타입을 넘길 수 있어서도 있습니다. 😂그 외 삭제할 대상을 찾기 위해
findByCreatedAtBetweenAndStatus()
,findByCreatedAtBeforeAndStatus()
메서드가 생겼습니다.해당 메서드는 ANSI 표준을 따르므로 비즈니스 로직이 쿼리에 의존적이지 않기 때문에 굳이 실제 MySQL 구현체를 사용한 통합 테스트를 진행하지 않고, 메모리를 사용한 단위 테스트로 진행했습니다.
실제 파일이 삭제되는지, 테스트 코드로 확인이 불가능하기에 요청을 직접 날려봤는데, 우선 삭제는 잘 됩니다.
머지 되고나서, 개발 환경에 제대로 삭제가 되는지 테스트가 필요합니다!