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;
}