728x90
delete 쿼리가 안 나가는 코드
UploadFile에 외래키가 존재하고, Board에는 존재하지 않는다. 즉 단방향이다.

UploadFile 에는 다음과 같은 데이터가 존재한다.

글 수정을 통해 UploadFile을 바꾸려고 다음과 같은 코드를 작성하였다.
@Transactional
public void editAttachFile(Board board, BoardEditDto boardEditDto) throws IOException {
UploadFile boardAttachFile = board.getAttachFile();
if (boardAttachFile != null) {
board.setAttachFile(null);
// delete query 예상
uploadFileRepository.delete(boardAttachFile);
}
// Dirty Checking으로 update query 예상
board.setAttachFile(fileStore.storeFile(boardEditDto.getMulAttachFile()));
}
Board에 있는 attachFile (= UploadFile) 을 null로 만든 뒤, Delete 쿼리 후, Dirty Cheching으로 Update 쿼리 호출한다.
이 코드의 결과로 에러가 발생한다.

에러 로그를 보면 DB Primary key 에 '8'이라는 값이 중복돼서 에러가 발생했다고 나온다.
쿼리 로그를 봐도 Delete 쿼리는 없었다.
원인
delete를 한 후에 insert나 update를 하는 경우 delete가 동작하지 않는 이유는
hibernate에서 동작하는 SQL은 순서가 정해져 있기 때문이다.
hibernate 레퍼런스에 순서가 다음과 같이 나와 있다.

위와 같은 순서로 update 실행 후, delete가 실행되어 에러가 발생한 것이다.
해결 방법
flush()를 추가하여 delete 실행 후, update가 실행되게 하면 된다.
@Transactional
public void editAttachFile(Board board, BoardEditDto boardEditDto) throws IOException {
UploadFile boardAttachFile = board.getAttachFile();
if (boardAttachFile != null) {
board.setAttachFile(null);
// delete query
uploadFileRepository.delete(boardAttachFile);
// flush() 추가
uploadFileRepository.flush();
}
// Dirty Checking으로 update query
board.setAttachFile(fileStore.storeFile(boardEditDto.getMulAttachFile()));
}
728x90
'Spring' 카테고리의 다른 글
[Spring] Swagger 적용(Springboot 3.x) (0) | 2024.09.11 |
---|---|
[Spring] ERROR : Unable to find a single main class from the following candidates (0) | 2024.09.09 |
[Spring/JPA] OSIV와 open-in-view (0) | 2024.08.12 |
[Spring] @Bean, @Component, @Configuration (0) | 2024.08.09 |
[Spring Security] logout 할 때, GET /login?logout 해결 방법 (0) | 2024.08.02 |