Back-end/TroubleShooting

낙관적 락을 μ‚¬μš©ν•œ μ—”ν‹°ν‹°μ˜ soft delete

μ„œμ±„λ¦¬ 2024. 6. 25. 17:46

🌱 문제 상황

  • Bid μ—”ν‹°ν‹°λŠ” 낙관적 락을 μœ„ν•΄ @Version ν•„λ“œλ₯Ό μ‚¬μš© 쀑이닀.
  • @SQLDelete μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄ Soft Deleteλ₯Ό ν•˜κ³  μžˆλ‹€.
  • Bid μ—”ν‹°ν‹°λ₯Ό μ‚­μ œν•˜λ €κ³  ν•  λ•Œ λ‹€μŒκ³Ό 같은 SQL 였λ₯˜κ°€ λ°œμƒν–ˆλ‹€.
could not delete: [core.domain.bid.Bid]; SQL [UPDATE bid SET is_deleted = 1 WHERE id = ?]
SQL Error: 90008, SQLState: 90008
Invalid value "2" for parameter "parameterIndex" [90008-214]
o.h.engine.jdbc.spi.SqlExceptionHelper   : Invalid value "2" for parameter "parameterIndex"

 

🌱 문제 μ›μΈ

HibernateλŠ” @Version ν•„λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 낙관적 락 κ΅¬ν˜„ μ‹œ SQL μ—…λ°μ΄νŠΈ 쿼리에 버전 번호λ₯Ό ν¬ν•¨ν•œλ‹€. ν•˜μ§€λ§Œ 기쑴에 μ„€μ •ν–ˆλ˜ μ»€μŠ€ν…€ SQL ꡬ문은 idλ§Œμ„ νŒŒλΌλ―Έν„°λ‘œ λ°›μ•„λ“€μ΄λŠ” 쀑이닀.

λ”°λΌμ„œ @Version ν•„λ“œμ™€ @SQLDelete μ–΄λ…Έν…Œμ΄μ…˜μ„ ν•¨κ»˜ μ‚¬μš©ν•  경우 기쑴의 μ»€μŠ€ν…€ SQL ꡬ문과 좩돌이 λ°œμƒν•˜λŠ” 것이닀.

 

🌱 ν•΄κ²° 방법

@SQLDelete μ–΄λ…Έν…Œμ΄μ…˜μ˜ SQL ꡬ문 μˆ˜μ •

@Version ν•„λ“œλ₯Ό SQL ꡬ문에 ν¬ν•¨ν•˜λ„λ‘ @SQLDelete μ–΄λ…Έν…Œμ΄μ…˜μ„ μˆ˜μ •ν•œλ‹€.

@SQLDelete(sql = "UPDATE bid SET is_deleted = true WHERE id = ? AND version = ?")
@Where(clause = "is_deleted = false")
@Entity
public class Bid extends BaseTimeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    ...

    @Version
    private Long version;

    private Boolean isDeleted;
}