[Spring] JPA Soft Delete

Yuriยท2025๋…„ 2์›” 7์ผ

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
11/21

๐Ÿ”ซ ์ผ์ • ๊ด€๋ฆฌ ์•ฑ Develop API ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ ๊ฒช์€ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•, ์ƒˆ๋กœ ์•Œ๊ฒŒ๋œ ์ ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๐Ÿฅ… ๋ชฉํ‘œ

  • JPA ์—์„œ deleteAt ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ญ์ œ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  soft delete ์ฒ˜๋ฆฌํ•˜๊ธฐ

Soft Delete

์ƒ์„ฑ์ผ, ์ˆ˜์ •์ผ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋“  Entity์— ์‚ญ์ œ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. (*ํ…Œ์ด๋ธ”๋งˆ๋‹ค Hard Delete, Soft Delete ์ „๋žต์„ ๋”ฐ๋กœ ๋‘์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฐ€์ •)

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;

    private LocalDateTime deletedAt;
}

์‚ญ์ œ ์—ฌ๋ถ€๋ฅผ ์ƒ์„ฑ์ผ, ์ˆ˜์ •์ผ๊ณผ ๊ฐ™์ด ๋‚ ์งœ ํ˜•์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด deletedAt ํ•„๋“œ๋ฅผ BaseEntity ์— ๋งŒ๋“ ๋‹ค.

  • ์‚ญ์ œ๋œ ์ผ์‹œ๊ฐ€ deletedAt ํ•„๋“œ์— ์ €์žฅ๋œ๋‹ค.

๊ธฐ์กด Hard Delete โ†’ Soft Delete ๋กœ ์‚ญ์ œ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

@Getter
@Entity
@Table(name = "member")
@SQLDelete(sql = "UPDATE member SET deleted_at = now() WHERE id = ?")
@SQLRestriction("deleted_at IS NULL")
public class Member extends BaseEntity {
	//...
}
์–ด๋…ธํ…Œ์ด์…˜์„ค๋ช…
@SQLDeleteJPA๋ฅผ ํ†ตํ•ด Entity ์‚ญ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์‹œ, Delete ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์ž…๋ ฅํ•œ sql ์„ ์‹คํ–‰
@SQLRestrictionJPA๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ select ์ฟผ๋ฆฌ์— ์„ค์ •ํ•œ ์กฐ๊ฑด์„ where ์ ˆ์— ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • @Where โ†’ @SQLRestriction
    @Where ์–ด๋…ธํ…Œ์ด์…˜์€ Hibernate ORM 6.3 ๋ฒ„์ „๋ถ€ํ„ฐ deprecated ๋˜์–ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ”— ์ฐธ๊ณ 
Is there a replacement for the in 6.3 deprecated @Where and @Loader

profile
์•ˆ๋…•ํ•˜์„ธ์š” :)

0๊ฐœ์˜ ๋Œ“๊ธ€