๐ฑ ๋ฌธ์ ์ํฉ
@RequiredArgsConstructor
@UseCase
public class BidUseCase {
private final BidRepository bidRepository;
@Transactional
public void deleteBid(User user, Long bidId) {
Bid bid = bidRepository.findById(bidId).orElseThrow(() -> NOT_FOUND_BID);
bid.cancel();
bidRepository.delete(bid);
log.info(bid.getStatus().name());
}
}
@SQLDelete(sql = "UPDATE bid SET is_deleted = true WHERE id = ? AND version = ?")
@Entity
public class Bid extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private Status status;
@Version
private Long version;
private Boolean isDeleted;
...
public void cancel() {
this.status = Status.CANCELLED;
}
}
์ค๋ช ์ ์ํด ๊ธฐ์กด๋ณด๋ค ๊ฐ๋จํ๊ฒ ์์ ํ ์ฝ๋์ด๋ค.
๋ด๊ฐ ๊ฒช์๋ ๋ฌธ์ ๋ bid.cancel() ๋ฉ์๋์์ Bid ์ํฐํฐ์ status๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๋ก๊ทธ๋ฅผ ํตํด ์ํ ๋ณ๊ฒฝ์ด ์ ๋ ๊ฒ์ ํ์ธํ ์ ์์๋๋ฐ ์ต์ข ์ ์ผ๋ก ์ํ ๋ณ๊ฒฝ update ์ฟผ๋ฆฌ๋ ์คํ๋์ง ์๊ณ , SQLDelete์์ ์ ์ํ ์ฟผ๋ฆฌ๋ง ์คํ๋์ด ์ํ ๋ณ๊ฒฝ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉ๋์ง ์๋ ์ํฉ์ด์๋ค.
๐ฑ ๋ฌธ์ ์์ธ
์ด ๊ธ์ ๊ฒ์ํ๊ณ ๋ค์ด์จ ์ฌ๋๋ค์ ์ด๋ฏธ ์๋ ์ฌ์ค์ด๊ฒ ์ง๋ง @SQLDelete๋ ์ํฐํฐ๊ฐ ์ญ์ ๋ ๋ ์ฌ์ฉ์๊ฐ ์ ์ํ SQL์ ์คํํ๋๋ก ํ๋ค. ๊ทธ๋ฆฌ๊ณ JPA๋ ์ญ์ ๋ฅผ ์ฒ๋ฆฌํ ๋, ์ํฐํฐ๋ฅผ ์ญ์ ํ ๊ฒ์ผ๋ก ๋งํฌํ๊ณ ํ๋ฌ์ ์์ ์ @SQLDelete์ ์ ์๋ SQL์ ์คํํ๋ค.
๋ฉ์๋์ ํธ๋์ญ์ ์ ๊ฑธ์ด๋จ์ผ๋ Bid์ ์ํ๊ฐ ์ ๋ฐ์ดํธ ๋์ ๋ Dirty Check๋์ด ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๊ธฐ ์ ์ ํ๋ฌ์ ๋์ด์ผ ํ์ง๋ง, JPA๋ ์ญ์ ๋ ์ํฐํฐ์ ๋ํด ์ํ ๋ณ๊ฒฝ์ ๋ณ๋๋ก ์ฒ๋ฆฌํ์ง ์๋๋ค. ์ฆ, ์ญ์ ๋ ์ํฐํฐ๋ ๋ ์ด์ ์ํ ๋ณ๊ฒฝ์ด ๋ฐ์๋์ง ์๋ ๊ฒ์ด๋ค.
๐ฑ ํด๊ฒฐ ๋ฐฉ๋ฒ
์์ธ์ ์๋ฉด ํด๊ฒฐ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. delete ๋๊ธฐ ์ ์ ์ํ ๋ณ๊ฒฝ์ ๋ช ์์ ์ผ๋ก ํ๋ฌ์ํด ๋ณ๊ฒฝ๋ ์ํ๊ฐ ๋จผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋๋๋ก ํ๋ฉด ๋๋ค.
์ฃผ์ํ ์ ์ ์ฌ๊ธฐ์ bidRepository.save(bid); ๋ฅผ ํตํด ์ํฐํฐ์ ์ํ ๋ณ๊ฒฝ์ ์ ์ฅํ๋ ค๋ ๊ฒฝ์ฐ ์ ๋๋ก ๋์ํ์ง ์๋๋ค.
์ด๋ ํ๋ฌ์ ์ ๋ต ๋๋ฌธ์ธ๋ฐ JPA์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋์ด ์๋ FlushModeType.AUTO ๋ ํธ๋์ญ์ ์ด ์ปค๋ฐ๋ ๋ ๋๋ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๊ธฐ ์ ์ ์์์ฑ ์ปจํ ์คํธ๊ฐ ํ๋ฌ์ ๋๋ค.
// ํ๋ฌ์ ๋ชจ๋ ํ์ธ ๋ฐฉ๋ฒ
FlushModeType flushModeType = entityManager.getFlushMode();
log.info("flushMode: " + flushModeType);
// flushMode: AUTO
๋ฐ๋ผ์ flush๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํด ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฆ์ ๋ฐ์ํด์ผ ํ๋ค.
@RequiredArgsConstructor
@UseCase
public class BidUseCase {
private final BidRepository bidRepository;
@Transactional
public void deleteBid(User user, Long bidId) {
Bid bid = bidRepository.findById(bidId).orElseThrow(() -> NOT_FOUND_BID);
bid.cancel();
bidRepository.flush(); // ์ถ๊ฐ!!
bidRepository.delete(bid);
}
}