IT 개발/JPA

[JPA] JPA로 데이터 삭제시 삭제 여부 컬럼 이용 방법

이것 저것 모든것 2024. 9. 4. 18:07
728x90

JPA에서 Soft Delete를 적용하는 방법에 대해 설명해드리겠습니다. Soft Delete는 데이터를 실제로 삭제하지 않고 삭제된 것처럼 표시하는 방식입니다.

일반적인 적용 방법은 다음과 같습니다:

  1. 엔티티에 삭제 여부를 나타내는 필드 추가:
 
@Entity
public class MyEntity {
// 기존 필드들... @Column(name = "is_deleted")
private boolean deleted = false;
}
  1. 쿼리 메소드나 JPQL에서 삭제되지 않은 엔티티만 조회:
public interface MyRepository extends JpaRepository<MyEntity, Long> {
List<MyEntity> findByDeletedFalse();
}
  1. 삭제 메소드 오버라이드:
@Repository
public class MyRepositoryImpl implements MyRepositoryCustom {
@Autowired
private EntityManager entityManager;
@Override
public void softDelete(Long id) {
MyEntity entity = entityManager.find(MyEntity.class, id);
entity.setDeleted(true);
entityManager.persist(entity);
}
}

더 세련된 방법으로 Hibernate의 @SQLDelete와 @Where 어노테이션을 사용할 수 있습니다:

 
JPA Soft Delete Implementation

JPA Soft Delete Implementation

 
@Entity
@SQLDelete(sql = "UPDATE my_entity SET deleted = true WHERE id = ?")
@Where(clause = "deleted = false")
public class MyEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name; @Column(name = "deleted")
private boolean deleted = false; /
/ getters and setters
} ```

이 방식의 장점은 다음과 같습니다:

  1. @SQLDelete: 엔티티 삭제 시 실제로 DELETE 쿼리 대신 UPDATE 쿼리를 실행합니다.
  2. @Where: 엔티티를 조회할 때마다 자동으로 "deleted = false" 조건을 추가합니다.

이렇게 설정하면 JPA 레포지토리의 기본 메소드들(findById, findAll 등)을 사용할 때도 자동으로 Soft Delete가 적용됩니다.

728x90